找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

11

主题

12

帖子

145

积分

二级会员(20)

Rank: 2Rank: 2

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

EDA365欢迎您!

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

x
" k: b& e& Y* V+ P6 ~
本文转自: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:6 ^9 |. b& N# p, {' Z
/* Allow the board to save important registers */9 D* H4 r2 R& e% a$ n
/*b save_boot_params*/
6 g' X1 p* c8 C# e/ l# ]1 {ldr r1, =0x1002330c
% l! K& z) D% B/ G% M) {ldr r0, [r1]
1 t- }/ w* \. Q& {& G+ hdmb/ [7 s, _" n' W
ldr r2, =0x300
, C- Q! y; b+ Qorr r0, r0, r2& M' ~1 X: L! d: q3 U, {3 G( f
dmb
8 \) N' F/ i2 O/ e+ Astr r0, [r1]
9 Y3 L0 @# m. r, a
3 v+ B; g- s, O- ?( o% p  q2 {ldr r1, =0x11000c08
+ w9 u8 Q! c7 H" T* bmov r0, #0
9 P9 Q5 _4 I: J3 udmb+ y* N/ W( O1 S- f+ R0 `
str r0, [r1]' ]5 k; R9 b- s
reset11:8 Y% J5 C1 O# R9 A
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错误。网上有改过的该程序源码,为方便我直接粘贴如下
/*
. i4 g" q  j% R2 t# E9 Y * Copyright (c) 2010 Samsung Electronics Co., Ltd.
0 ]  ^5 ?" x2 u) P; j: p7 [& i *              http://www.samsung.com/
: w( I2 Y3 V  R6 h6 S *
( j6 u* W; K4 P * This program is free software; you can redistribute it and/or modify
% p( }9 Y! v0 d% c * it under the terms of the GNU General Public License version 2 as 2 N0 w- C7 N6 N" @9 S3 a
* published by the Free Software Foundation.   z  k8 q( R8 W3 c
*/  ( Y7 Q6 v" y( O6 |% u7 C& Y
  . s  V* T1 {2 Q( s3 y5 S
#include <stdio.h>  , N- x- g  L  {* F7 ^
#include <string.h>  7 r' J; C& D+ J1 f$ X
#include <stdlib.h>  ! m) f6 e% w* p) M6 `$ k
  
# i& b2 d( l: x% u/ ?& aint main (int argc, char *argv[])  % m$ z+ l- W+ `: J
{  : t9 k  ?, b* Z; Z% r( u, U4 f
    FILE        *fp;  
9 A" H: g$ i2 g3 s$ w    unsigned char   src;  + S$ l2 I; y, A6 y( v1 E
    char        *Buf, *a;  + {" I8 W  E% A2 F
    int     BufLen;  2 z/ s7 g* _5 c  k, V# ?5 V6 x2 e
    int     nbytes, fileLen;  9 B* `3 D! I( \$ j5 d
    unsigned int    checksum = 0;  
* O  g1 F3 j/ x1 L* r' Y0 I    int     i;  
  V; N  x+ `1 R: c7 o  ]  
7 h$ _6 y4 P/ L$ {; M* |    if (argc != 4)  / v# W" y: q) j2 A5 ?1 {  r
    {  
8 J$ G6 N7 Y2 m        printf("Usage: mkbl1 <source file> <destination file> <size> \n");  
9 X& @2 \% O- }5 c6 T$ s) Z        return -1;  " d( q+ o& s0 {5 ^0 q5 S; P0 e% |* |
    }  
! V& \- F7 Y7 ?8 ~; b  
3 y& e8 Y) Z+ m    BufLen = atoi(argv[3]);  
: e2 @. [& J( F: I    Buf = (char *)malloc(BufLen);  
4 Z5 t! G3 |2 q4 f    memset(Buf, 0x00, BufLen);  9 C) k9 |$ P( Z/ k* j' `- _1 C
  
# b9 f% \/ G' E* U6 J/ A0 t    fp = fopen(argv[1], "rb");  
( p2 B5 v7 m( V    if( fp == NULL)  
( Y8 E7 M& b9 v7 N$ ]* K    {  
4 d( `% ?2 ^" h- Y  r        printf("source file open error\n");    W' C6 x0 h- X0 x0 q0 A2 c
        free(Buf);  6 E6 }8 K  `2 Z4 H  k$ g. {, r. k
        return -1;  
( a6 d1 w9 A8 I: z    }    H4 m2 m1 b3 P- n
  
+ r1 V* ^' {$ Q/ v8 w/ a    fseek(fp, 0L, SEEK_END);  
5 ?' K$ I: j/ ?9 f$ ^6 r% ~' ?    fileLen = ftell(fp);  
5 @9 m$ O6 X% }. R& F( c0 u3 x    fseek(fp, 0L, SEEK_SET);  ' O0 e$ n9 g" A6 \
/* - S, @; p7 ~2 n% x( U( B4 M' H
    if ( BufLen > fileLen ) - j. _, c6 B8 n
    { 6 S1 h7 s* o. D* N4 W& u6 I
        printf("Usage: unsupported size\n"); / I, Y) |; G- G/ a" x/ _3 n
        free(Buf);
2 J+ C- T! s9 a: T        fclose(fp);
1 l0 K9 W) d! U; Q! u' f; _, Y        return -1;
7 r$ a0 c% I% V) I# l, i1 @/ b    } 7 A5 R( W5 @4 s5 k2 T; Q
*/  
) e3 \) O3 j- t' o    //nbytes = fread(Buf, 1, BufLen, fp);  
( l$ f; N, y  U, _5 Z    if(BufLen > fileLen)  , R! `; M+ Q5 R
        nbytes = fread(Buf, 1, fileLen, fp);  
  m1 @$ e5 w& l- U9 l/ n    else  6 n/ [0 H. T: a8 U
        nbytes = fread(Buf, 1, BufLen, fp);  ( `$ J' N2 }. M# E
/* / B% E( m& z: g
    if ( nbytes != BufLen ) : t$ L6 |7 ?: _; P6 K; o( _4 m' ]
    { - i: Q& K4 R$ K; G: m
        printf("source file read error\n");
& _7 p+ T! v" W0 H        free(Buf);
/ k8 ?4 y: `8 w        fclose(fp); 1 V0 |7 j2 O% t3 m" m
        return -1; 0 a. b2 V8 I$ e( b. W- o4 x
    } 3 F( s8 ?* y, m" I
*/  
9 z. A4 k* Q& p% h    fclose(fp);  6 r% b4 Z" V. ~7 h( |& I5 f
  
) W  {, \) a4 W. D    for(i = 0;i < (14 * 1024) - 4;i++)  
$ I8 [) X" Y$ o4 Q' `5 S+ G    {  
& q) f( n; y) `: a' N7 z6 ^        checksum += (unsigned char)(Buf);  
) |. i7 N$ J& ?+ p! @  b    }  ; f7 Q- {1 B- U# m7 s% M. X
    *(unsigned int*)(Buf+i) = checksum;  
1 n0 u) E6 r4 g8 l* ?+ Z, v  9 d9 [+ }0 S1 m2 }: y2 a
    fp = fopen(argv[2], "wb");  ; |( X( u+ e! m; L+ a8 }2 b( k
    if (fp == NULL)  1 w: Y* u0 ]- ?$ o4 r
    {  
! l6 ?4 F) p# v+ j. s# U        printf("destination file open error\n");  
* U  H7 M: }# z- m        free(Buf);  
: V3 ?* T! U$ N/ |$ p        return -1;  
* s" V" }, C- ~9 L, E; n    }  
: L7 m2 r% H  a$ Z: d5 [. z  0 n  h3 ]4 s7 o+ {% D! {. k. R( }
    a   = Buf;  
# G9 Z9 e+ e; r! y# G  ^+ \    nbytes  = fwrite( a, 1, BufLen, fp);  
8 `, ^4 Y  ~+ B5 d$ _/ @  + N/ c/ U7 {* d- P$ b+ i4 _
    if ( nbytes != BufLen )  0 h/ Q+ q6 ~' E3 ~$ g- Z8 }9 j
    {  7 Z: R" |: {, L
        printf("destination file write error\n");  ! D; f" s% |9 q2 a- v. ~( _0 G
        free(Buf);  1 n% K: H; _; o! p/ X* B
        fclose(fp);  
# V' Z6 F: E; v        return -1;  % o/ F' i  S+ z+ Z
    }  
% Y# g% t) x0 m- _  3 z8 i9 P2 f$ ^$ b1 o
    free(Buf);  
6 K/ P. B$ ~# L    fclose(fp);  
  W% |* j# C& d+ j- G' V  8 ~; X  K  p$ C+ ]& `5 z9 O# c) l" a0 j3 K
    return 0;  ; w( s8 ^+ s7 r
}  
读者可用此源码本地编译生成可用的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% c0 {% B8 |% g3 U' h# B8 F
cat E4412_N.bl1.bin bl2.bin all00_padding.bin > u-boot-iTOP-4412.bin
0 X, z' f9 W2 l% g) C* N- ?8 h0 imv 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
8 ?( I9 W  n; G2 l+ `0 c* k& `; e; S! s1 R- U3 m- G

* M3 r$ J- z' R/ F- q& i; H; PDisassembly of section .data:3 |+ v9 H: i) ~1 c- H" p8 {" b

' X- I) d, c+ Q) D' X4 R00000000 <.data>:
7 C3 s9 o) P% G- U       0:   ea000006   b   0x200 P( D$ G* {( y9 l% [
       4:   eafffffe   b   0x4  e0 U. j. m" j5 H% F: s, n
       8:   eafffffe   b   0x8
1 p4 f) z; s% r: Y+ Q. e       c:   eafffffe   b   0xc
" \' _1 s% E' q: e      10:   eafffffe   b   0x10
* ?# g) v2 T' i, c      14:   eafffffe   b   0x14
$ n+ J( g. H" E' e, o8 Z      18:   ea00301a   b   0xc088
0 G1 W2 O5 V. W+ x+ t1 G6 D9 G      1c:   ea00301b   b   0xc090
7 Z( [! a5 P6 x# n7 a; X      20:   e59f01a4   ldr r0,[pc, #420]  ; 0x1cc
, S& i) T  ^, E6 f      24:   e3a01000   mov r1,#0
  p$ O+ i9 G/ V3 w, G- h      28:   e5801000   str r1,[r0]
  ]6 r% w7 I* G- [; f4 \# K      2c:   e59f019c   ldr r0,[pc, #412]  ; 0x1d08 D  E- K1 n8 K  U7 x6 u9 T! @- g
      30:   e5900000   ldr r0,[r0], T/ x" X  `: X+ h, H& u
      34:   e200003e   and r0,r0, #62 ; 0x3e. ]* [" B& \2 T- |! X: e
      38:   e330003e   teq r0,#62 ; 0x3e7 j5 \2 E% S& O( |1 h% {$ o
      3c:   1a00000d   bne 0x789 J0 v& k3 T  m' ?/ F
      40:   e59f018c   ldr r0,[pc, #396]  ; 0x1d43 \5 A# k( L9 R- T! \0 ]
      44:   e5900000   ldr r0,[r0]
7 D) s7 [5 A5 {9 ~) D% O$ \      48:   e3100001   tst r0,#1
* C# P( c- r8 M: F& y2 @* h( M      4c:   1a000009   bne 0x78
2 l7 s; B" d3 k& x: |# b- c      50:   e59f2180   ldr r2,[pc, #384]  ; 0x1d84 q, e" |+ d7 [; i
      54:   e5922000   ldr r2,[r2]7 `2 Z  L: w* z" r% n) t3 ?
      58:   e3e03000   mvn r3,#0
+ p* ~% A0 V. x% L9 a# S9 o5 v) T      5c:   e1120003   tst r2,r3: e3 R# K  Z: G
      60:   1a000003   bne 0x74
5 ?% W2 M" O8 {" \7 [3 v- U      64:   e59f0170   ldr r0,[pc, #368]  ; 0x1dc
4 w% A' [' [! Z! {- T      68:   e59f1170   ldr r1,[pc, #368]  ; 0x1e0
/ n% P1 {, g, T+ q7 n      6c:   e5801000   str r1,[r0]2 E6 C8 B9 x7 t5 f, O
      70:   e59f2164   ldr r2,[pc, #356]  ; 0x1dc
! z# I( D; b. i      74:   e1a0f002   mov pc,r2
) E$ a" ~" D. e% L      78:   e321f0d3   msr CPSR_c,#211    ; 0xd3! b! C0 V0 b# h
      7c:   ee110f10   mrc 15,0, r0, cr1, cr0, {0}& m) j! m3 O- V8 r( V7 f+ Y7 z
      80:   e3c00001   bic r0,r0, #1
* w5 @8 y1 |  @+ w; h; v      84:   e3c00004   bic r0,r0, #4
: C* \3 O# c0 G     88:   e3a02281    mov r2,#268435464  ; 0x10000008. x9 r, G6 J( A0 i9 M
      8c:   e5923000   ldr r3,[r2]
( Y1 v5 E* q+ X2 D# z9 S* ?      90:   e3130501   tst r3,#4194304    ; 0x400000
9 F6 _# u0 A# w" `) u: B      94:   0a000002   beq 0xa4
$ U( A7 U) y8 o/ q      98:   e3c00a01   bic r0,r0, #4096   ; 0x1000: A$ H; X/ N$ [; D8 p" Y! n
      9c:   ee010f10   mcr 15,0, r0, cr1, cr0, {0}
% p1 M0 O$ e1 V* _/ N: ~      a0:   ea000006   b   0xc0
  k, [5 {# H8 Z. ^  V0 o5 D      a4:   e3a00000   mov r0,#0
; X  y6 z4 G0 o7 A" ~      a8:   ee080f17   mcr 15,0, r0, cr8, cr7, {0}$ ^: R/ e+ {; S4 j
      ac:   ee070f15   mcr 15,0, r0, cr7, cr5, {0}
/ h% c2 ~) W, q      b0:   eb0022ea   bl  0x8c600 _6 l' S$ f5 f' s1 R1 R6 c
      b4:   ee110f10   mrc 15,0, r0, cr1, cr0, {0}
7 E" V- U2 q4 I; O      b8:   e3800a01   orr r0,r0, #4096   ; 0x1000+ }7 p* i, C6 S* l4 u
      bc:   ee010f10   mcr 15,0, r0, cr1, cr0, {0}! X. ^( C7 n8 X
      c0:   ee10cfb0   mrc 15,0, ip, cr0, cr0, {5}0 S/ `. p" M1 Y1 M5 t- o6 p. ]; c
      c4:   e20cc003   and ip,ip, #3
" c$ Z. M* Q% s) W/ k      c8:   e59f2114   ldr r2,[pc, #276]  ; 0x1e4) ^, X( Z7 C* n6 x
      cc:   e082010c   add r0,r2, ip, lsl #2, ]: O4 c" [7 h% p" m# {' ~. T
      d0:   e35c0000   cmp ip,#0
+ `) Q# P! w& [3 m4 U      d4:   1a0022da   bne 0x8c44
- N5 ^: X: D+ I$ x  z      d8:   e59f0108   ldr r0,[pc, #264]  ; 0x1e8, ], ~" b( G6 R  t
      dc:   e5900000   ldr r0,[r0]
, i8 V9 X9 E1 `, p9 ^! F/ R, X      e0:   e3a01102   mov r1,#-2147483648    ; 0x80000000
$ @  J, r* e- w# @# r$ O# _      e4:   e1100001   tst r0,r1" }1 e2 ?, ?! ?; p9 `: e+ Z
      e8:   0a000024   beq 0x180
, k+ @2 r0 O& v' w      ec:   e59f00f8   ldr r0,[pc, #248]  ; 0x1ec3 a) W- I* j3 s
      f0:   e5900000   ldr r0,[r0]
0 a, T3 u8 u7 V8 h5 h* S      f4:   e3100001   tst r0,#10 x) v( {' ~% e3 M
      f8:   0a000020   beq 0x180
- N; F! z& m7 {$ p. d      fc:   e59f00ec   ldr r0,[pc, #236]  ; 0x1f0' n; i) `5 d% H7 B
     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

6 _6 O( T, f* R# o' Y
分享到:  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, 2025-1-30 12:16 , Processed in 0.071528 second(s), 35 queries , Gzip On.

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

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

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