找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

11

主题

12

帖子

145

积分

二级会员(20)

Rank: 2Rank: 2

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

EDA365欢迎您!

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

x
0 Z$ l* {0 ?* J# o6 U1 F$ x
本文转自: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:2 Q4 _% H+ o, C& C) y( u0 X! a
/* Allow the board to save important registers */; ^. J1 i* R" T
/*b save_boot_params*/6 Q3 I( b7 Y+ P5 {+ W3 b# }
ldr r1, =0x1002330c( D: o0 I7 G: P( f- N, P  c
ldr r0, [r1]
. s+ j# ~& t  s, B5 d* T$ j! Rdmb1 S3 ]# D- Q3 H: Q3 L
ldr r2, =0x300; M: B8 x6 ]$ ^
orr r0, r0, r2; w# m2 T1 O) p( D( W+ M" w
dmb0 `: m: Y* T6 W+ i
str r0, [r1]/ {0 U& c/ l7 A

9 |9 c' U, @) M. u) jldr r1, =0x11000c08
- i8 S* J9 D- f3 F  Q) kmov r0, #0% B  e. W% x, \, D- q
dmb5 D) @5 @) j- m8 P8 w7 j
str r0, [r1]
- D; L' y+ s3 Mreset11:' @6 T2 b3 ~( b( ]9 [# w5 W2 n
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错误。网上有改过的该程序源码,为方便我直接粘贴如下
/* 4 x0 d4 f% M' V3 u' z
* Copyright (c) 2010 Samsung Electronics Co., Ltd. ! `0 @( R( g: \' a1 C
*              http://www.samsung.com/ ( Y' B' _3 Z/ K* M
*   K' F7 C* ]/ ~" s$ w
* This program is free software; you can redistribute it and/or modify 1 u7 I$ h7 Q, d. R/ M
* it under the terms of the GNU General Public License version 2 as   T1 I' K0 `2 E8 H; o
* published by the Free Software Foundation. # R3 ]% I* ~: k+ K0 R
*/  / S( R9 `' H. z* v0 c% U# R# z0 q
  
$ u. @$ W* l9 y. B. h2 [$ i#include <stdio.h>  $ @* w$ L/ i1 l9 a$ `6 Y
#include <string.h>  & o2 y$ R/ ]  B" m
#include <stdlib.h>  
+ \4 z0 U0 z; G; v  
$ I- u4 p% L+ Y3 z0 {* _+ _# A7 Bint main (int argc, char *argv[])  
" O3 o" n/ t6 ~; x  C{  6 v0 i! d9 P3 Q, `8 ?* a5 N
    FILE        *fp;  
3 _) d+ }9 F7 x2 `, p" ]    unsigned char   src;  - R% c" L5 S  Z0 y
    char        *Buf, *a;  5 b7 H* H( l2 f; L6 |1 |
    int     BufLen;  
3 u8 g9 I' {% t+ Z    int     nbytes, fileLen;  " ]' e- V. L! Y4 v' y7 W
    unsigned int    checksum = 0;  0 F# q6 L" w/ C+ k9 i$ O1 e' O! G8 H% Z
    int     i;  ' e0 q+ M2 o3 N) Y% k# q0 s
  $ D. m3 a7 f8 n) @" T4 y
    if (argc != 4)  5 `8 |5 o( v' N+ w& q3 L' D6 \6 N) i7 \
    {  
4 l" K6 f1 V& e, j- k        printf("Usage: mkbl1 <source file> <destination file> <size> \n");  
, e  k6 M% [; V- D$ w8 O        return -1;  
5 ?8 R4 V6 E1 W3 ?  |, ^9 t    }  
0 {. t" U3 G+ P8 j/ d  j7 u( i# R  & I* z( l0 s% X
    BufLen = atoi(argv[3]);  : w; q6 f# v; W
    Buf = (char *)malloc(BufLen);  
8 h& S0 H. E! M* G2 L$ D    memset(Buf, 0x00, BufLen);  ( e, ]; [* j( G% C6 ?
  
. B4 a+ d! u- i$ h! Q    fp = fopen(argv[1], "rb");  
) z/ q/ f. s5 p6 k( _: n    if( fp == NULL)  
; a; h& _& b' J  H    {  
" r( f7 [  l' p* \% Z5 P5 f        printf("source file open error\n");  
- A7 H/ B! C; v        free(Buf);  4 H' M6 k0 y; g; V
        return -1;  * G$ \7 x8 b1 S
    }  
& t. s( }2 p/ N/ D2 t" d5 k% u  " S) t- S" d. t) V( L
    fseek(fp, 0L, SEEK_END);  
' d7 W! C5 p; Z1 R1 s    fileLen = ftell(fp);  + q0 ]8 G1 N- {% o) t
    fseek(fp, 0L, SEEK_SET);  ! u! f! U7 t) Y6 b3 @
/* & K1 k: B8 |' z$ r  ?8 S/ C& ?" k
    if ( BufLen > fileLen )
2 t; O) ?3 G* j: a    {
* R- F" N1 @9 ?! c        printf("Usage: unsupported size\n");
3 z" {6 d, u7 @; p+ I        free(Buf);
/ T  j9 z$ t7 d3 g4 H: }: H        fclose(fp);   K" C/ {+ |1 M
        return -1; + `0 n5 I- Z. C! z2 m
    } ; ?8 Y* v# U9 m3 C4 g
*/  
/ c" R! T5 g3 N$ Z/ n    //nbytes = fread(Buf, 1, BufLen, fp);  1 c, i- l, F4 _, U% s8 _
    if(BufLen > fileLen)  
& V# w# g/ E* P' X+ V7 y2 T$ T        nbytes = fread(Buf, 1, fileLen, fp);  3 Q" Q/ [7 o$ C* B- n; ~' C5 D
    else  
9 b" ~& S" N% y        nbytes = fread(Buf, 1, BufLen, fp);  1 u1 x5 H' P9 K6 n3 R7 s/ U
/* ! ]. @" T) W% g0 F( f$ |
    if ( nbytes != BufLen )
) I! Y! ?7 j+ c    {
2 U" s' z0 Y) A6 s2 `        printf("source file read error\n");
6 f6 G: u/ |6 m' G' s        free(Buf);
; }2 `7 |! b* j        fclose(fp);
' ~' E: n6 T' D& e        return -1;
0 C' [4 A: u5 I9 j0 k& q0 q8 t2 |, Z4 Z    } + b2 w+ i- q3 b( _& i$ m
*/  % @8 {) \. P* @3 s/ B3 Y8 A& z8 [
    fclose(fp);  7 m2 K) Y% u: v4 k
  / M$ q8 k4 B3 v+ W
    for(i = 0;i < (14 * 1024) - 4;i++)  
' m9 [: p$ h; Y9 D    {  $ L& v0 p# b  j* ], d
        checksum += (unsigned char)(Buf);  
; t5 }. O5 t( |- q+ V    }  
6 z% d! K2 W/ p7 e! h8 Y: W    *(unsigned int*)(Buf+i) = checksum;  0 `% D) L% e+ R
  
) x# ], [+ Z9 V! T    fp = fopen(argv[2], "wb");  
) z& [/ S/ I% J) G    if (fp == NULL)  2 _" C9 E2 }* j! F& S
    {  
: y# u4 x+ M3 J3 r( l        printf("destination file open error\n");  
- W) A5 u0 E9 c3 t/ Z4 i        free(Buf);  
3 q; v: |- f! a0 ~        return -1;  8 ?/ w8 o1 [9 v6 }
    }  
7 S, E+ j) v  J  
# A! B* Y% d$ U1 J1 t    a   = Buf;  
; `/ L) X  {( W& u' Q& G% x, ]/ _    nbytes  = fwrite( a, 1, BufLen, fp);  ( \* ^' Y0 ~; ^, D" P. C1 |/ P
  
, {- `' ^- i# n) ?    if ( nbytes != BufLen )  ; B/ z, R- \1 \8 F' y
    {  $ g- T4 H  ?+ A% T% U, Z' \& C
        printf("destination file write error\n");  
/ e3 \, N. [# R6 t        free(Buf);  5 T) M  F/ j, L& j+ H  D
        fclose(fp);  
' M" U7 m) J) X8 A( _        return -1;  
% W- u3 j' D1 }2 N4 T" v3 k    }  ! _( g' ^; w5 v9 U" z
  
% E  A$ P% J- ]9 y0 V    free(Buf);  . r, N8 K: y: S1 p4 y2 X
    fclose(fp);  - W: {# a/ [3 K- `, Z& a; I
  
9 r) i* g6 F  I5 Z    return 0;  + V/ V! D: @" P" H, i
}  
读者可用此源码本地编译生成可用的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/sh
: y% Q* Z7 Q8 a0 F! P, [( Zcat E4412_N.bl1.bin bl2.bin all00_padding.bin > u-boot-iTOP-4412.bin1 U; @7 G# D( n1 U5 y" e! h% \9 }% T
mv 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
. c+ `/ B- X; q% [- j9 t2 U
! O9 ]- c# F# Y8 H7 Y8 O. ~6 h  f- R' }3 M
Disassembly of section .data:
% u5 c" E# g. [
) G7 y1 Q3 M" l$ a% D  H00000000 <.data>:
4 y, I) w! B  J       0:   ea000006   b   0x20
; j7 y7 Q8 r0 Y& V       4:   eafffffe   b   0x4' `1 Y. W4 D2 U' C4 d5 i6 q
       8:   eafffffe   b   0x8
, L3 \6 L5 f% T) e' R$ c1 E( ^       c:   eafffffe   b   0xc( _, `2 r* s1 ~4 n* q+ ?  i& y
      10:   eafffffe   b   0x10
9 Y- Q( m6 m" e, j7 d      14:   eafffffe   b   0x14- q* b4 y- n0 a9 S. D) h% e- [
      18:   ea00301a   b   0xc088) w% ?  N( G+ j
      1c:   ea00301b   b   0xc090
! m" P' X# s6 t4 M9 k9 ^+ g      20:   e59f01a4   ldr r0,[pc, #420]  ; 0x1cc
! M. \! U( f7 s* i1 g- P) }      24:   e3a01000   mov r1,#0
/ ?2 V8 Y1 j1 R# |      28:   e5801000   str r1,[r0]) X- q% h$ }( L& A- D1 N, V0 E4 n0 e
      2c:   e59f019c   ldr r0,[pc, #412]  ; 0x1d0
( a4 N+ e- R0 A2 y) a  k      30:   e5900000   ldr r0,[r0]" q# @: k: }* p6 A+ ~: l# T
      34:   e200003e   and r0,r0, #62 ; 0x3e3 D  d+ \! _7 n- y
      38:   e330003e   teq r0,#62 ; 0x3e% \2 W; h7 V. i5 Y3 }- Z& q: j+ u
      3c:   1a00000d   bne 0x78
8 X% k1 z7 c6 M# ~      40:   e59f018c   ldr r0,[pc, #396]  ; 0x1d4
5 |1 k. o! i0 k  k$ k' |3 X      44:   e5900000   ldr r0,[r0]
: p. Z! Q: u0 ?8 N      48:   e3100001   tst r0,#1) ~. `8 K, f$ q% x% _
      4c:   1a000009   bne 0x78* e1 O2 {1 H- _
      50:   e59f2180   ldr r2,[pc, #384]  ; 0x1d89 Y$ P0 Q( q0 ?3 i3 w: s
      54:   e5922000   ldr r2,[r2]
7 Q. l& G  z# s3 y: e      58:   e3e03000   mvn r3,#0+ N( D1 L6 R' `
      5c:   e1120003   tst r2,r3" T+ ]. f/ }% M+ e7 k/ {8 J- g# \
      60:   1a000003   bne 0x74% _9 R9 u) l  M6 r% t  @
      64:   e59f0170   ldr r0,[pc, #368]  ; 0x1dc
$ ^" l; U: N* y  F2 N      68:   e59f1170   ldr r1,[pc, #368]  ; 0x1e0
6 B) |. ]! d) O0 q      6c:   e5801000   str r1,[r0]
3 @  T  @2 c" m6 w9 y4 D      70:   e59f2164   ldr r2,[pc, #356]  ; 0x1dc
, N5 h7 S' ~: P      74:   e1a0f002   mov pc,r2
) q$ V7 r# q" C  Z! h' h( w      78:   e321f0d3   msr CPSR_c,#211    ; 0xd3
2 Y  O0 C1 X% P" S1 V      7c:   ee110f10   mrc 15,0, r0, cr1, cr0, {0}
5 u4 u% f8 D6 V# N      80:   e3c00001   bic r0,r0, #1
9 G6 {/ \/ T( @: K( e8 h      84:   e3c00004   bic r0,r0, #4) A- v9 M% d4 `& o3 q' o; g8 Y  Z
     88:   e3a02281    mov r2,#268435464  ; 0x10000008
. b7 W2 o; E9 e. _+ m( {+ f2 Q/ d$ [      8c:   e5923000   ldr r3,[r2], n9 z5 M5 W: s
      90:   e3130501   tst r3,#4194304    ; 0x400000) E/ K8 l' p) f' h/ x3 a* F% W* ?
      94:   0a000002   beq 0xa4! H( [- p; K* u2 F0 U
      98:   e3c00a01   bic r0,r0, #4096   ; 0x1000
: ?, u+ K' e8 r: L      9c:   ee010f10   mcr 15,0, r0, cr1, cr0, {0}
3 ]8 k$ r- ?6 U" m$ G      a0:   ea000006   b   0xc06 n& _) w! f+ O3 q% O
      a4:   e3a00000   mov r0,#05 P8 o: [4 X5 v4 u& Q
      a8:   ee080f17   mcr 15,0, r0, cr8, cr7, {0}
# M4 _3 r; M) K) z' B% C6 T  g      ac:   ee070f15   mcr 15,0, r0, cr7, cr5, {0}. x! P7 d8 Z0 N
      b0:   eb0022ea   bl  0x8c60. X$ [! C+ x9 D: A* }+ ~) L  j7 [
      b4:   ee110f10   mrc 15,0, r0, cr1, cr0, {0}6 O$ s; ^# ]$ K8 h
      b8:   e3800a01   orr r0,r0, #4096   ; 0x10000 d9 L+ r: a6 m5 [0 W
      bc:   ee010f10   mcr 15,0, r0, cr1, cr0, {0}
4 g! z2 X4 I; p      c0:   ee10cfb0   mrc 15,0, ip, cr0, cr0, {5}
7 @, l# `' {2 `9 q" B- K      c4:   e20cc003   and ip,ip, #3
; |6 r3 O1 U; K3 f' _      c8:   e59f2114   ldr r2,[pc, #276]  ; 0x1e4% {! V( Z$ s* y+ Q2 B, R& ^
      cc:   e082010c   add r0,r2, ip, lsl #2
* A) X4 n  t* ]      d0:   e35c0000   cmp ip,#00 A  Q& r7 F1 L% h% L7 }
      d4:   1a0022da   bne 0x8c44! N8 M) Z3 ~, e
      d8:   e59f0108   ldr r0,[pc, #264]  ; 0x1e8
. b7 C8 B4 S: y6 l6 ^      dc:   e5900000   ldr r0,[r0]
1 t# I2 |" k' B' S3 t$ p      e0:   e3a01102   mov r1,#-2147483648    ; 0x80000000
0 t2 C% O! z$ ^& L. [      e4:   e1100001   tst r0,r1
1 \8 U( q. e/ J, z4 Y      e8:   0a000024   beq 0x180( j9 |+ q, }+ R4 Q* n) P2 ~
      ec:   e59f00f8   ldr r0,[pc, #248]  ; 0x1ec3 f: q, Q# }' m5 N( x: u  Y0 R7 q8 b
      f0:   e5900000   ldr r0,[r0]
7 i2 Z' C) B1 n0 t5 R8 C% M      f4:   e3100001   tst r0,#1" f0 y8 e3 k8 K2 q
      f8:   0a000020   beq 0x180
+ y% C. L3 R) l+ ^. t5 }% Q! Q" ^      fc:   e59f00ec   ldr r0,[pc, #236]  ; 0x1f02 H8 j3 D: [1 a( Z8 ^* h) |" e
     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
* a( V# e& _" t3 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-11-8 21:10 , Processed in 0.067880 second(s), 34 queries , Gzip On.

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

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

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