找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 159|回复: 7
打印 上一主题 下一主题

【转载】 JLINKv9在迅为iTOP-4412精英板上的应用

[复制链接]

11

主题

12

帖子

145

积分

二级会员(20)

Rank: 2Rank: 2

积分
145
跳转到指定楼层
1#
发表于 2017-9-12 10:43 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您!

您需要 登录 才可以下载或查看,没有帐号?注册

x
% y+ b+ e7 `+ k0 i- T8 q0 r
本文转自:https://www.amobbs.com/thread-5680586-1-1.html
很多人买迅为iTop4412精英板,在Android或Linux+Qt跑起来后学习开发调试应用程序或驱动,但在linux内核运行前发生了什么?能进行什么开发工作?并没有完整资料。其实,只要一根百元价位的JLINKv9,就可以搭建一个实用的boot阶段程序开发环境,使我们可以深入到貌似神秘的史前时代一探究竟。
我的精英板和JLINKv9刚到手一周左右,花了两三天功夫在环境搭建上,也遇到了一些坑,幸运的是都解决了。下面我就总结介绍一下这几天的工作,希望能对感兴趣的人有所帮助,能抛砖引玉就更好了。当然,在解决问题过程中,除了靠自己积累的知识外,也参考学习了网上的一些资料,在此向作者表示谢意,并尽量列出所参考的文章。
还要声明一点,就是boot阶段的开发当然需要一定的底层硬件知识。虽然本文所涉较少,但还是提醒初学者谨慎操作,以免损坏硬件。
正文:
系统环境:win8.1+VMWare+ubuntu14.04LTS
硬件:iTop4412精英板+JLINKv9调试电缆+SD卡及读卡器。JLINKv9电缆常用JTAG接头是2.54mm间距的大头,精英板上的JTAG接口是2mm间距的小头,所以还需要购买或自制转接板和小头电缆(淘宝售价10元以内)。硬件上一个小坑是我买的JLINKv9的JTAG接口的2脚有3.3V输出(SEGGER手册上写明NC,但有3.3V输出不知为什么),而精英板的JTAG口的1脚和2脚是短路的,这就使得如果不做改动直接连接,就使得JTAG1脚的检测电压是自身2脚输出的3.3V,而不是精英版输出的1.8V,使JLINK识别目标失败。改起来很简单,吧转接板大头和小头2脚间的连线划断就可以了。
关于JLINK软件的安装,只要去SEGGER官网下载最新版的Linux版的DEB安装包,用dpkg命令安装就可以了。还应该在Windows宿主机上安装win版的JLINK软件,这样宿主机也可以识别JLINK,出问题时也可和Linux虚拟机作对照。
首先确认JLINK可以识别4412。把JLINK电缆和串口电缆接好,开启Ubuntu虚拟机,在虚拟机Wokstation->虚拟机->可移动设备 菜单下把串口和SEGGER J-link与虚拟机连接好。开启虚拟机串口终端(我用的C-kermit),精英板上电进入u-boot状态。进入JLINK安装目录(缺省/opt/SEGGER/JLink/),运行 JLinkExe,如果没问题应该有VTref = 1.8xxV的目标检测电压输出(如果检测电压为3.3V,说明JTAG转接板未改,参考前面)。由于JLINKv9不直接支持4412,所以不能自动识别目标,需手动连接。按提示输入connect命令,依次输入“CORTEX-A9”,回车,“J”,回车,“-1,-1”,回车,4000,回车。界面如下图。
此时若JLINK和目标板软硬件没问题,则4412的cortex-a9 CPU#0能被识别,这正是我们期待的。截图如下。
在此基础上可以做些实验,发现如下问题:cp15协处理器读写命令无效;只能调试单核;0x02000000物理地址开始的内存无法读取,而这是关键的iROM和iRAM映射区域,史前文明的秘密宝藏就在这里。第一个问题可以在编程时用汇编指令读cp15到通用寄存器然后设置相应断点来一定程度规避。第二个问题对于调试boot阶段程序来说不是问题,因为这时本来只有CPU#0运行。第三个问题就得认真对待了。从上图可以看到此时MMU使能,物理地址已不能直接应用。我还没有深究此版本u-boot源码,不知道该段物理地址是否映射到某个虚拟地址。换个思路,可以重写一个BL2阶段的程序,该程序为目的只是一个无限循环,用JLinkExe的halt命令终止其运行,就可保留BL1刚结束而BL2刚开始时的现场。让我们实现这个思路看看会得到什么。
我利用较新版(建议2017以后)的u-boot源码改造生成SPL的方式产生所需要的BL2程序。ARM交叉工具链用Linaro的arm-eabi-系列。按照上述思路,只要在u-boot源码的arch/arm/cpu/armv7/start.S的第一条指令改为跳转自身地址的指令即可。但经过实验,以此生成的BL2程序在精英板运行后,JLinkExe检测到的VTref为0V,JLINK无法连接目标。由此猜想是BL2程序缺少必要的电源管理设置。参考网上文章http://blog.csdn.net/techping/article/details/69911634,找到该文中arch/arm/mach-exynos/board.c的电源管理部分代码,根据相关4412的寄存器地址,查4412手册知道要设置PSHOLD引脚输出,又对照精英板的原理图,发现PSHOLD信号确实是控制电源管理芯片的,就用汇编实现此功能。修改后的start.S入口处代码如下:
reset:, W) o3 Z* a7 m" F( b; @
/* Allow the board to save important registers */
5 c& F5 \7 y) f5 p# F: C5 g/*b save_boot_params*/
4 V1 n7 R% x8 D5 D) R. ]$ Gldr r1, =0x1002330c3 d5 y* Z+ N1 [/ H$ ]1 m5 X# U- H
ldr r0, [r1]
; I* {; n' Q; J) {( Odmb5 U" U" F' L; _; b. W- A0 v
ldr r2, =0x3009 k& X" C1 l! e
orr r0, r0, r2: J: e4 e. X9 ~/ c
dmb+ \- g( p" g/ j; i& A+ E, c8 [
str r0, [r1]* O0 w$ s8 B% m* W2 f/ r6 Y7 O% ^
: x' v. F# T# r# V- `6 L5 C; f) n3 t: ^
ldr r1, =0x11000c08
* R7 t2 E0 B/ g+ M) ]mov r0, #0
+ s; C$ v+ E; sdmb
* z! U9 {+ }$ O& A+ Vstr r0, [r1]
, [2 ]0 |+ G2 B8 P- V" \reset11:$ O0 ~6 h/ C# a; X" N- U  }
breset11
u-boot的配置用什么?也是这篇网文建议用三星origen板子的配置改。只要把include/configs/origen.h中#define CONFIG_SPL_TEXT_BASE 的值改为0x02023400即可。这个地址是三星提供的BL1程序对它引导的BL2程序的要求。此配置项的作用就是生成SPL程序的lds链接文件的.ram区域的起始地址和设置.TEXT段的起始地址(二者相同),这可在SPL的Makefile文件中看到。然后在新版u-boot目录下运行make origen_defconfig,配置完后交叉编译新版u-boot即可。此时在新版u-boot源码目录下生成spl目录,其中的u-boot-spl.bin就是我们要得到的BL2程序镜像。
下面的工作需要借用精英板光盘提供的CodeSign4SecureBoot_SCP目录文件和旧版u-boot源码。在旧版u-boot源码下有个mkbl2程序是用来生成最终14K大小的bl2.bin文件的,但此程序有问题,用它生成会产生Unsupported szie错误。网上有改过的该程序源码,为方便我直接粘贴如下
/* 9 D1 x: m3 ?  T6 f) H
* Copyright (c) 2010 Samsung Electronics Co., Ltd. - Y. m4 t3 w% }( Q0 t
*              http://www.samsung.com/ % p6 D2 V- e1 x$ r- r7 i3 n
* 7 M3 J6 z0 r9 \1 P! _  F7 W9 Q1 ~9 u  x
* This program is free software; you can redistribute it and/or modify
  @9 R# S2 n( m/ b * it under the terms of the GNU General Public License version 2 as
, `, f; u; X: z+ ^' m6 } * published by the Free Software Foundation.
) \0 @8 Y' ^* I# I/ `; ^ */  
8 j- X6 V7 F) W! c% Z2 D) E  
( g" W; ^' b& y1 D#include <stdio.h>  6 M+ s# l8 Y) x1 D
#include <string.h>  6 _! G4 y3 J6 k  a+ ]2 I. b
#include <stdlib.h>  
! h& p# x2 W/ c3 x! Y9 b4 O& Q. ]/ \  : C+ i3 ?, k, f4 ?
int main (int argc, char *argv[])  
' [" v5 h0 @4 m% l{  ' y- Q" \0 i3 C% Q
    FILE        *fp;  
8 R7 g& z0 s- i. T9 J0 @! v* ~5 ]    unsigned char   src;  3 A) o" q0 K" g6 B
    char        *Buf, *a;  
) V" O' {$ u8 k" a3 `    int     BufLen;  4 e2 s3 g) ^% i: r( n' n, J5 C
    int     nbytes, fileLen;  4 y- s1 n/ @7 V1 Z) F" ]! u7 w
    unsigned int    checksum = 0;  9 W1 M7 d0 _. B, Y# O
    int     i;  : G* I- x9 i0 O! o1 O
  
5 g" K. `5 d. C" [3 c5 Y$ a    if (argc != 4)  + P3 D4 I2 h; e) _. H
    {  * c; N8 v/ V# A
        printf("Usage: mkbl1 <source file> <destination file> <size> \n");  
9 t) L$ f, F/ n, S        return -1;  4 n' }* X& t* w: {- s/ d
    }  
3 y; N4 u- M8 a2 l  % Q$ K3 g% p/ |1 g
    BufLen = atoi(argv[3]);  4 \9 [- \2 m0 P  }0 _; m8 }
    Buf = (char *)malloc(BufLen);  
. ]9 M. b) E8 i$ O8 S( `) J; }7 r    memset(Buf, 0x00, BufLen);  ! ?4 r( L7 i$ U, X
  
+ \) U5 f+ }7 H, ~  G9 v    fp = fopen(argv[1], "rb");  
7 e+ A. E7 h+ c7 z% ^# ]7 R5 y4 }! U    if( fp == NULL)  
! u+ d' o. W- J! Z    {  
' E1 e7 B% V$ g5 V        printf("source file open error\n");  5 H/ m9 h( [. c$ g: |) t8 W/ a
        free(Buf);  : A5 y6 f. }# C) ^4 {( [
        return -1;  + G2 P2 _) k- J0 ?* ^' q/ D
    }  
5 V; U* T/ h7 ]% J$ U7 Q  
2 M' \9 m! u4 n' ~2 ?" J    fseek(fp, 0L, SEEK_END);  6 d0 M7 G1 t2 k1 Y3 L
    fileLen = ftell(fp);  3 [$ C/ d" ]/ z6 A( K5 d" D
    fseek(fp, 0L, SEEK_SET);  " z7 Y4 x. P: J4 m2 s1 b* d
/*
0 Q; F" Q2 v5 y! d    if ( BufLen > fileLen ) 3 N5 D" J% F' T9 W4 ^0 v3 j/ U5 P
    {
6 z# H+ j* f# u& s- R, E8 m        printf("Usage: unsupported size\n"); ! |- _$ ?" v- b( \4 h
        free(Buf); " B( i9 ?; O2 U2 y  M2 s3 S/ E& W
        fclose(fp);
' n/ d* X4 }  F' H$ @        return -1;
0 V' b0 w8 R2 K% D9 }6 \; q. @    } ; e$ w, Z, p7 p( v3 Y
*/  
' A7 s9 N& t2 i$ z    //nbytes = fread(Buf, 1, BufLen, fp);    J! r# W9 L- z: p
    if(BufLen > fileLen)  4 |( O+ g) l4 u8 j( m
        nbytes = fread(Buf, 1, fileLen, fp);  3 K& i: b: P" m! ~% |
    else  9 e& u  U" r( b5 ]
        nbytes = fread(Buf, 1, BufLen, fp);  # g  \" @- L4 H5 ]9 s
/*
. b3 r9 `. `  d# ]; E# Q2 T$ n    if ( nbytes != BufLen )
8 S$ M& A5 j) c7 t    {
0 _* e+ a9 g4 v$ e6 D        printf("source file read error\n"); : C* v. N4 B4 T
        free(Buf); - ~3 o) n% \! I# c
        fclose(fp); 2 h, e3 F; ~8 g3 Z7 b. {& Y6 Y
        return -1;
6 ?- P" G% j; C3 }8 b$ G" p    }
. f4 \$ P9 R7 L*/    h' T$ ?1 K, W) H% w- U, G
    fclose(fp);  : W0 B- L8 R7 o  {
  # |/ q# U/ z% a& F7 e1 ~& t
    for(i = 0;i < (14 * 1024) - 4;i++)  : ]8 L- T+ ]/ L  D$ w! R
    {  ) y) Z  e0 Z# ]- E7 L" g
        checksum += (unsigned char)(Buf);  
3 V) f# }" h6 F2 z* G* R7 g    }  
' g2 A' T( p% A) J1 _, H1 u8 V! g    *(unsigned int*)(Buf+i) = checksum;  ; m1 U- Y! P0 O- q
  7 p. m" H. Z5 {7 O1 k: M1 Z
    fp = fopen(argv[2], "wb");  $ S5 T: J( G, K
    if (fp == NULL)  
* [7 @" \- o  h& i, @& m$ L& W9 W    {  
8 \% r4 s  s' p. k# w5 l# }        printf("destination file open error\n");  - N) g+ A7 @6 c
        free(Buf);  
2 T/ d1 q+ x" G/ ?        return -1;  1 s- ~& {8 o( ~& M9 g2 H* n. X
    }  $ W: s( B) D4 e8 A. b- H+ S! m5 a
  ! d9 T  o" H7 a5 d! _2 ^3 y
    a   = Buf;  
0 y1 P( L3 W2 K) _# d" b9 S    nbytes  = fwrite( a, 1, BufLen, fp);  
) \. G+ V( N4 c5 D6 N% X% u  1 [& T3 w: y' ^2 F; _. s' u! ~
    if ( nbytes != BufLen )  ' n$ L% c8 Y# V
    {  ) Y+ _6 R. e) W+ v
        printf("destination file write error\n");  % M0 s& \* |3 L. w
        free(Buf);  7 V- o6 J, ?6 B0 r' v
        fclose(fp);  
! W2 y* c( u1 t8 Y% f/ q1 B        return -1;  
; H  Q" J. w4 v8 E4 ?2 B    }  ! r, M+ j" x1 Y2 x( S: Z" {
    K$ L9 k- F% ]5 b2 |- i
    free(Buf);  
0 |8 e7 [6 I: Q5 K    fclose(fp);  ; j' x* g) K( j9 g
  
* t1 k* [% [7 I" |    return 0;  : @" ], v5 X: Z
}  
读者可用此源码本地编译生成可用的mkbl2程序来代替旧版的。然后把编译新版u-boot生成的u-boot-spl.bin拷贝在旧版u-boot源码下。在旧版u-boot源码目录下运行如下命令
./mkbl2 u-boot-spl.bin bl2.bin 14336 生成可用的bl2.bin镜像。把bl2.bin拷贝到CodeSign4SecureBoot_SCP目录下,并把旧版u-boot目录下的E4412_N.bl1.bin拷贝到CodeSign4SecureBoot_SCP目录下。在CodeSign4SecureBoot_SCP目录下新建一shell脚本文件my_build_bin.sh,内容如下
#!/bin/sh2 @3 b: k+ E  T0 \- v
cat E4412_N.bl1.bin bl2.bin all00_padding.bin > u-boot-iTOP-4412.bin
2 W. H1 z7 T) D' ^, D- C/ Smv u-boot-iTOP-4412.bin ~/iTop/iTop4412_uboot/
其中mv命令的目标目录是我的旧版u-boot源码目录,读者应改为自己的相应路径。
CodeSign4SecureBoot_SCP目录下运行./my_build_bin命令,在旧版u-boot目录下就有u-boot-iTop-4412.bin文件生成,该文件大小正好为24k,就是我们要烧到SD卡的启动镜像,包括BL1和BL2阶段的程序。然后参考ITop4412 精英板手册出厂前首次烧录TF卡方法用旧版u-boot目录下的mkuboot命令制作SD卡。把SD卡插入精英板,拨码开关设置为TF卡启动模式,启动精英板,用JLinkExe连接目标板,此时输出部分截图如下
可以看到此时MMU是关闭的。现在用mem再查看0x02000000物理地址区域,可以访问了!貌似JLINK不支持一次读取大量内存内容,我用savebin命令分次读取了iROM在0x02000000的64k映像,合并成一个文件,并用arm-eabi-objdump反汇编之,就可以弄清完整史前时代的来龙去脉了。下面是iROM程序的反汇编成果的开始部分,有兴趣的读者可以留邮箱,我会把完整的64k iROM程序镜像发给你。
irom:     fileformat binary
9 r7 C, e9 @  M* G% P; q4 _% d. P, C
; r& Y# K+ v0 u3 r! a& r+ V
Disassembly of section .data:
$ T' N/ k! X+ q+ c# w% t  {$ Q$ j; k/ i
00000000 <.data>:) ~7 d5 O9 b5 e
       0:   ea000006   b   0x20! C' a8 W! o  ?9 M
       4:   eafffffe   b   0x4
8 L' F3 u% E7 b) @9 N, `       8:   eafffffe   b   0x8, e& {% R: z' `3 O: o4 G  ?
       c:   eafffffe   b   0xc0 [% f- X: H, w
      10:   eafffffe   b   0x10
7 A* Z* }9 V4 q: R7 a+ v% ?  Q      14:   eafffffe   b   0x14
# |" N4 y8 w4 w. a3 E      18:   ea00301a   b   0xc088
0 i4 V" s' T0 [" K$ B& b      1c:   ea00301b   b   0xc090
0 j- o# I  f; d      20:   e59f01a4   ldr r0,[pc, #420]  ; 0x1cc
  m# b# j2 P5 ]# _7 `      24:   e3a01000   mov r1,#0  L. o2 {9 F5 e, ?
      28:   e5801000   str r1,[r0]
' j( _5 T8 D, m# s      2c:   e59f019c   ldr r0,[pc, #412]  ; 0x1d0& }8 {7 L; P9 ]
      30:   e5900000   ldr r0,[r0]7 [( e, p& G1 G* o
      34:   e200003e   and r0,r0, #62 ; 0x3e
  b& Y& t( q; {6 C0 K      38:   e330003e   teq r0,#62 ; 0x3e6 e2 C/ c( Y8 D1 L" m, g2 j9 W/ z9 w
      3c:   1a00000d   bne 0x78' ?4 ~' W# N! I) I
      40:   e59f018c   ldr r0,[pc, #396]  ; 0x1d4& S5 C+ L# T$ r( a4 m
      44:   e5900000   ldr r0,[r0]
3 ~$ ^1 X/ Y" ]2 U      48:   e3100001   tst r0,#1' h3 H# Y* C, Q
      4c:   1a000009   bne 0x78
6 H& r3 c$ p- `8 _      50:   e59f2180   ldr r2,[pc, #384]  ; 0x1d8
" T, \- S8 J2 y/ v' R5 |      54:   e5922000   ldr r2,[r2]
( f: ]" X( [- p! X2 U* H      58:   e3e03000   mvn r3,#0
" k0 W6 X7 x# I" ^7 K; p      5c:   e1120003   tst r2,r3' _9 Q$ q; Y3 X# d: {5 A
      60:   1a000003   bne 0x743 F6 m  U7 q# O6 V/ Y: |0 |3 h; w
      64:   e59f0170   ldr r0,[pc, #368]  ; 0x1dc( F2 y: G6 V$ `6 |
      68:   e59f1170   ldr r1,[pc, #368]  ; 0x1e0$ T+ f2 M2 l7 f
      6c:   e5801000   str r1,[r0]8 G2 B1 e$ h* H# f- A* D) {5 C
      70:   e59f2164   ldr r2,[pc, #356]  ; 0x1dc
: G" X/ ?: J/ j9 [) T      74:   e1a0f002   mov pc,r2
4 X# W2 m7 `7 H0 S      78:   e321f0d3   msr CPSR_c,#211    ; 0xd30 x, _- u- @7 m/ F! s
      7c:   ee110f10   mrc 15,0, r0, cr1, cr0, {0}0 z. u1 M8 U# [' e, v6 {1 Y* o
      80:   e3c00001   bic r0,r0, #1
: O: s0 ^6 d5 S1 t% i      84:   e3c00004   bic r0,r0, #43 w) e) l$ H1 ^/ @6 G) M6 H# Q
     88:   e3a02281    mov r2,#268435464  ; 0x10000008$ l, G6 M0 f- }5 c5 h9 J0 d$ J
      8c:   e5923000   ldr r3,[r2]: x% Q0 n" @! g7 U' s2 [
      90:   e3130501   tst r3,#4194304    ; 0x400000+ _7 X1 k+ s/ u
      94:   0a000002   beq 0xa4! P  K' d* p  Y* o
      98:   e3c00a01   bic r0,r0, #4096   ; 0x10002 X1 d# ^: a  i+ Y  U4 r# s( E
      9c:   ee010f10   mcr 15,0, r0, cr1, cr0, {0}
5 q* i6 `7 r' w' v      a0:   ea000006   b   0xc05 X4 Q5 @. @# d' u$ {
      a4:   e3a00000   mov r0,#04 g5 o2 i9 N+ {# |9 ~) Y
      a8:   ee080f17   mcr 15,0, r0, cr8, cr7, {0}) S* p- u$ C& b9 J+ i
      ac:   ee070f15   mcr 15,0, r0, cr7, cr5, {0}
" c9 S9 q8 c. W  f1 _" G      b0:   eb0022ea   bl  0x8c608 ~, z- C* |& t+ x% C. L( V( X
      b4:   ee110f10   mrc 15,0, r0, cr1, cr0, {0}
9 L$ Y# c  ~: v2 J; d8 S      b8:   e3800a01   orr r0,r0, #4096   ; 0x1000
0 `" h3 ~+ |4 q, s      bc:   ee010f10   mcr 15,0, r0, cr1, cr0, {0}
* |0 n2 J; h. r( w# U* `      c0:   ee10cfb0   mrc 15,0, ip, cr0, cr0, {5}8 p2 Z  X: [  A& a' L9 M
      c4:   e20cc003   and ip,ip, #3# C" K6 ]1 L: ?
      c8:   e59f2114   ldr r2,[pc, #276]  ; 0x1e4% o; m  f) s6 s
      cc:   e082010c   add r0,r2, ip, lsl #2
8 r" t) `; o. d      d0:   e35c0000   cmp ip,#0
+ ~1 ~$ T( S0 f2 P+ C      d4:   1a0022da   bne 0x8c44' D0 _. Z4 Q1 V4 {
      d8:   e59f0108   ldr r0,[pc, #264]  ; 0x1e8
" {) S% t/ W7 X# V      dc:   e5900000   ldr r0,[r0]. }" o& o* U* K
      e0:   e3a01102   mov r1,#-2147483648    ; 0x80000000
: l& a# k! v5 E      e4:   e1100001   tst r0,r15 u6 O2 g4 v. }
      e8:   0a000024   beq 0x1805 I2 F- d$ O/ e$ m. k6 m) k
      ec:   e59f00f8   ldr r0,[pc, #248]  ; 0x1ec
3 ]6 ]' G) r2 I      f0:   e5900000   ldr r0,[r0]
2 f+ A; F) F& Q. G5 Q7 B      f4:   e3100001   tst r0,#1
3 F' d0 q  O) K7 D- W( l5 Q4 x      f8:   0a000020   beq 0x180
) D0 M$ u8 o. f' D( _      fc:   e59f00ec   ldr r0,[pc, #236]  ; 0x1f0
; G$ Z- ~2 U! M) x4 y7 Q     100:   e5900000   ldr r0,[r0]
至此,我们的史前时代探险完成了。作为一个有价值的副产品,我们也建立了用JLINK搭建的boot阶段程序调试环境。下面我简要介绍下gdb调试环境的搭建。
退出JLinkExe,运行JLinkGDBServer -device CORTEX-A9 -speed 4000命令,则JLinkGDBServer就与目标建立了连接,并等待gdb连入。在另一个虚拟终端下运行arm-eabi-gdb命令,在(gdb)提示符下输入target remote localhost:2331命令与JLinkGDBServer建立连接,用file命令关联新版u-boot源码spl目录下的u-boot-spl文件,就可以进行源码级调试了。这样,我们就搭建了一个实用的boot阶段程序调试环境,并可以借用新版u-boot源码平台开发属于自己的boot程序了。
附主要参考的文章链接:
http://blog.csdn.net/techping/article/details/69911634
http://www.cnblogs.com/humaoxiao/p/4166230.html
http://blog.csdn.net/lizuobin2/article/details/52832857
/ H, g) [" B3 i- g
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

33

主题

1228

帖子

3259

积分

版务助理

Rank: 6Rank: 6

积分
3259
2#
发表于 2017-9-12 13:41 | 只看该作者

0

主题

4

帖子

56

积分

二级会员(20)

Rank: 2Rank: 2

积分
56
3#
发表于 2017-9-22 10:30 | 只看该作者
多谢分享教程,学习了,好贴

6

主题

8

帖子

87

积分

二级会员(20)

Rank: 2Rank: 2

积分
87
4#
发表于 2017-10-9 15:03 | 只看该作者
1111111111111111,好贴

0

主题

7

帖子

36

积分

二级会员(20)

Rank: 2Rank: 2

积分
36
5#
发表于 2017-10-27 11:17 | 只看该作者
好贴,受益了

25

主题

168

帖子

473

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
473
6#
发表于 2017-10-28 19:16 | 只看该作者
好贴,受益了

13

主题

175

帖子

152

积分

二级会员(20)

Rank: 2Rank: 2

积分
152
7#
发表于 2017-11-25 20:25 | 只看该作者
晕 在我帖里面找偶像啊??

0

主题

2

帖子

14

积分

二级会员(20)

Rank: 2Rank: 2

积分
14
8#
发表于 2018-2-9 10:32 | 只看该作者
赞,,好文章
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

巢课

技术风云榜

关于我们|手机版|EDA365 ( 粤ICP备18020198号 )

GMT+8, 2024-9-17 04:34 , Processed in 0.065194 second(s), 35 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表