|
发表于 2008-12-18 15:16:05
|
显示全部楼层
S3C2410简易JTAG详解 ! m% D: K: B( P: {# f3 C4 G
' `, c. O/ v0 G* k- C: c. v
常见的JTAG cable结构都比较简单,一端是DB25,接到电脑的并口上,中间经过74HC244和一些电阻实现电平转换(5V3.3V?)(也有比较猥琐的只用了 几个100 Ohm电阻的方案),另一端的JTAG header接到目标板的JTAG interface。
5 l: [: `& ]: A' [* Y: M并口DB25原先主要是用来连接打印机,其引脚定义如下:: ^6 H9 G# E) @% g
25 Pin D-Sub SPP SIGNAL DIRECTION IN/OUT+ A7 i b; R, e5 l3 C
1 /Strobe In/Out
2 A9 X! x' Y* k2 i; R w1 s/ [2 Data 0 Out( W- I* i+ n d6 k
3 Data 1 Out6 C2 D2 Z! m- a! @% F
4 Data 2 Out& y2 }$ h- O8 f! Z: M
5 Data 3 Out8 m+ H: B, ?' S/ D0 s/ A
6 Data 4 Out
O1 c" y$ s; _" z$ C7 Data 5 Out7 N7 K% u9 g1 z
8 Data 6 Out8 x: |3 c x$ D" e7 [" g' e
9 Data 7 Out% A; l0 a" X* [9 D( |" J4 C
10 /ACK In/ B( Q4 m4 e$ j6 h/ R4 p$ {
11 Busy In9 F) f* R h" C# t6 k2 ?0 A/ g
12 Paper Out In
8 h* X9 L8 ]8 A, v13 Select In
5 \6 F" B: ]) e) x. y14 /Line Feed In/Out: Q1 A8 I' g- _) n3 G" T0 h1 N
15 /Error In- ~- s P' [6 P2 e* f' ~
16 /INIT In/Out) v7 D$ _& ^- i5 a* F8 h) ?9 K
17 /Select In In/Out
' m0 R( K. _% X2 q, T T18-25 Ground GND6 k* Q1 \# l3 J7 i
可见,数据线Pin2~Pin9可以用来发送数据,Pin10~Pin13等可以用来接收数据。; ?6 V6 G3 m( y% G" {( P- J
JTAG的数据传输形式是串行,主要使用了以下引脚:
* s8 J$ l5 ]# x9 D h$ J. V% jTDI (Test Data In)
/ u7 j& r3 l+ Z( O% zTDO (Test Data Out)' A2 ~4 j9 t! T6 B6 x; r
TCK (Test ClocK): T( f! d- T- g7 D! B
TMS (Test Mode Select)
" [% d4 m" B% Y& V, `2 ^" RTRST (Test ReSeT) optional.
2 |! @- @8 E! p. Q. w因此,DB25-JTAG实际上只利用了DB25的少数几根线。但由于DB25的8条数据线都可以作为output,市面上就出现了各种使用不同Pin Assignment的JTAG线。
6 l2 h) Y. G' R/ z7 n& |. x- i l% l( u! B) [0 @
例如Wiggler的Pin assignment:
! ?- ?: ? v+ T, v( u0 MTMS : Pin3 (D1)
+ \" J, X: s: z2 uTCK : Pin4 (D2)
0 s1 R2 [# J" S- V/ p1 qTDI : Pin5 (D3)) J+ N3 p U4 t( w) B
TDO : Pin11 (Busy)/ m |7 l% O! e3 j) d* m" J
SRST : Pin2 (D0)
7 ]) M2 M+ B& D9 }- _0 m* YTRST : Pin6 (D4)
+ B/ w/ P$ T, a# j! J(参见Wiggler的电路图,但最后的nSRST和nTRST可能不一定用到,并且在H-JTAG中的定义也不一样,TRST是Pin2,没有SRST), _% _) w" v4 K* R3 ~+ w
H-JTAG里还有另外一种接法--STD,定义如下:. H0 H& x4 Y% {8 e. A
TMS : Pin3 (D1)
+ r: r; w& L# `TCK : Pin2 (D0)
% e( S [- x. ]2 h6 B# Y" ?TDI : Pin8 (D6) N0 b: g: V5 ~* c8 B& @ \) q
TDO : Pin13 (Select)& [! _# Z0 @! F4 T9 Y
SRST : N/A
( \# d# g$ f, f! }8 B b0 n9 bTRST : Pin4 (D2)
1 g) }- ?/ F$ g! |' e9 S N4 s6 U! h而S3C2410的烧写程序SJF2410用的是:
$ Y9 I6 y" i8 O* W) J- G+ Y4 U7 ?TCK : Pin2 (D0)8 a m8 D* |- N2 N% K' M
TDI : Pin3 (D1)6 G% M2 b4 l! S& G- M5 M
TMS : Pin4 (D2)5 `- \; u1 `; p# z$ R2 H
TDO : Pin11 (Busy)3 J, m1 u! J* G+ d3 V+ s. a5 Q
这个可以在源代码中的jtag.h文件里看到。 v3 f0 W. z% q9 ]# o
除了DB25那边的Pin Assignment有多种方案,JTAG connector也有20pin, 14pin, 12pin, 10pin等几种标准。这里一块ARM9开发板配的DB25-JTAG转换板就十分好玩,上面也是只有一块244,但是有Wiggler, STD, S3C2410三个20pin接口。由于20pin connector的Pin Assignment是固定的,三个接口对应的是DB25那边的三种接法,因此开发板可以根据pc上运行的程序不同选择不同的接口来接。- H$ }5 v; X0 t, P9 `
20Pin Connector的定义如下(参考此图):5 s8 J( [+ c5 P7 C1 q6 s3 w
Vcc ← 1 2 → NC
; x) [! j( y. ^% G0 S0 a, z" pnTRST ← 3 4 → GND
! b9 d3 i+ t( ^4 L& lTDI ←5 6 → GND% w4 M% X, Z( Q7 P
TMS ←7 8 → GND
; x$ L- M4 j$ u; v* ?. L( OTCK ←9 10 → GND1 K. g9 N- l; M# `; }- h8 V+ d
GND ←11 12 → GND
! c4 p$ ]- G6 R, cTDO ←13 14 → GND6 R, i3 v2 |( F8 ?, |+ g
NRESET ←15 16 → GND
# C1 G' y' c8 h u* ZNC ←17 18 → GND* f/ @! p4 i" v! M ^% G5 W/ |
NC ←19 20 → GND$ ^ o9 X9 T/ h9 w& v
14Pin:& ^/ s, r) T4 @7 @
nTRST ← 1 2 → GND9 c( M7 F! ~( e! G3 M' [; S
TDI ← 3 4 → GND3 Z0 O* q j: ]; g/ B8 w
TDO ← 5 6 → GND X+ Q& _& |* u" w
TMS ←7 8 → GND) L" t( V2 H% W
TCK ←9 10 → GND
0 k1 V C# q+ Y/ p7 JnSRST ←11 12 → n/a
a# g9 ^& }/ ~1 T5 E$ ?DINT ←13 14 → Vcc
6 |" T% _1 I2 o' I; u(DINT pin is used to raise Debug Interrupt. Many chips has no this pin.)
8 J% I; ], e) l: g4 X12Pin:
) X) x$ B+ V1 q' ]/ c8 j2 O; _5 `nTRST ← 1 2 → GND0 q# \3 I6 q% Q% v
TDI ← 3 4 → GND$ J+ ?6 i! [5 K% Y
TDO ← 5 6 → GND6 e/ O! ^' p0 m9 o" T9 Z( q
TMS ← 7 8 → GND
& _+ r" M1 ?1 n- C! J9 V/ ITCK ← 9 10 → GND
- h3 V" {, ^ n# Q, {$ m! ^nSRST ←11 12 → GND7 { g& U5 ^0 d# _& f
10Pin:% h- p& @) q5 q$ }0 G8 R- }1 c/ F- x, _. S
TCK ← 1 2 → Vcc2 y j2 Y, N/ @. F' }( m. u
TDI ← 3 4 → Vcc
; V$ j, P* c. V: I* x* ]; DTDO ← 5 6 → GND
) L, h5 ?- F& B/ }2 t5 w0 z5 lTMS ← 7 8 → GND
6 f7 }5 y, ^% u/ ynTRST← 9 10 → GND- p) S/ L2 S6 a: z6 h' r
关于JTAG几个信号,在H-JTAG主页上提供了一个文档,里面有对此进行介绍:
' P. t! ^* q' {
4 x( [: f" J& k) P$ ~
+ c6 m4 ]$ P- G, Q7 T……下面,让我们从TAP(Test Access Port)开始。( |3 b9 X j2 m, S! \7 e# ?6 s
TAP是一个通用的端口,通过TAP可以访问芯片提供的所有数据寄存器(DR)和指令寄存器(IR)。对整个TAP的控制是通过TAP Controller来完成的。TAP总共包括5个信号接口TCK、TMS、TDI、TDO和TRST :其中4个是输入信号接口和另外1个是输出信号接口。一般,我们见到的开发板上都有一个JTAG接口,该JTAG接口的主要信号接口就是这5个。下面,我 先分别介绍这个5个接口信号及其作用。
/ _8 e L8 w+ S1 MTest Clock Input (TCK): V- q; O! t- s$ Q$ {
TCK为TAP的操作提供了一个独立的、基本的时钟信号,TAP的所有操作都是通过这个时钟信号来驱动的。TCK在IEEE 1149.1标准里是强制要求的。7 q: b5 l- e4 }2 \; K& c
Test Mode Selection Input (TMS)0 X1 S3 {% Z: ]' {
TMS信号用来控制TAP状态机的转换。通过TMS信号,可以控制TAP在不同的状态间相互转换。TMS信号在TCK的上升沿有效。TMS在IEEE 1149.1标准里是强制要求的。
" X4 j8 R5 `1 K+ U# GTest Data Input (TDI)! ]" T8 d. y9 \. X0 q& @
TDI是数据输入的接口。所有要输入到特定寄存器的数据都是通过TDI接口一位一位串行输入的(由TCK驱动)。TDI在IEEE 1149.1标准里是强制要求的。
7 w, L4 s6 w' C4 e% r* D, ATest Data Output (TDO)3 L* m9 {. l& J( h
TDO是数据输出的接口。所有要从特定的寄存器中输出的数据都是通过TDO接口一位一位串行输出的(由TCK驱动)。TDO在IEEE 1149.1标准里是强制要求的。1 X/ Y4 u4 h7 Q7 Q7 u
Test Reset Input (TRST)
4 b# ]. M2 Y3 U g9 ATRST可以用来对TAP Controller进行复位(初始化)。不过这个信号接口在IEEE 1149.1标准里是可选的,并不是强制要求的。因为通过TMS也可以对TAP Controller进行复位(初始化)。' t7 [# h& ~) S$ U" B% b
事实上,通过TAP接口,对数据寄存器(DR)进行访问的一般过程是:, M# C8 O( a" j7 |
1 通过指令寄存器(IR),选定一个需要访问的数据寄存器;
; m1 }# F* a1 t& P* }6 Q 2 把选定的数据寄存器连接到TDI和TDO之间;
" Z2 ]0 ?$ G0 H1 _0 t- U 3 由TCK驱动,通过TDI,把需要的数据输入到选定的数据寄存器当中去;同时把选定的数据寄存器中的数据通过TDO读出来。
: E1 o' s+ F- Q3 p& K另外,可选信号nSRST的定义如下(见参考资料1):
# ? {1 J7 D( InSRST is a "system reset" signal and acts like conventional "Reset' button.
{+ v: n! t- g' y参考资料:8 B) z# v: H& g* ~: |( j
[1] http://www.linux-mips.org/wiki/JTAG8 `1 u: k1 b, z% i, w5 F7 q
[2] http://en.wikipedia.org/wiki/Jtag" X" [( d/ D- H/ z/ q0 X1 L
[3] http://docwiki.gumstix.org/JTAG
; z1 `, S N9 B[4] http://wiki.openwrt.org/OpenWrtD ... Hardware/JTAG_Cable5 W r! x# `/ N
[5] http://www.bluewaternz.com/corporate/uni/unikit/jtag/
w0 d3 P* E% n+ Q3 f0 b; G* M' k# H从这里明白了市场上各个板子公司的jtag接口为何有20pin, 10pin,12pin,14pin的原因。再阅读了高手
: ]( F/ w/ C5 |litron 的文档,http://blog.chinaunix.net/u/23070/showart.php?id=1577352 `9 d g8 B& S
把jtag.h文件改动了一下, I) A- [3 Z# o) J0 @5 A4 R
// Pin Connections' n& j3 i' }: H! m
// TCK ATA[0] (2) // my is 4 DATA[2]3 U- A9 j6 U" R; H
// TDI ATA[1] (3) // my is 5 DATA[3]
: m8 g, x' D: J// TMS ATA[2] (4) //my is 3 DATA[1]
7 ?" [: |, \# A8 r1 T0 ?// TDO :STATUS[7] (11)0 |: E0 p% j* l; |3 ]
//#define TCK_H 0x01- Q, D7 z( O( u3 [
#define TCK_H 0x04
0 |* u5 k% f8 E* q h8 x//#define TDI_H 0x02
" z- k) I- @0 ?4 q: k V! U#define TDI_H 0x08
' l- ], {; T- f2 [, s# X+ P//#define TMS_H 0x04! n* G+ C4 x6 `% r$ ^
#define TMS_H 0x02
9 r: a( K. C; [编译,烧写,
0 }" R, Y/ I" E1 E9 A, ?$ s) C[root@hujunlinux Jflash]# ./Jflash-s3c2410 vivi /t=5
E. _8 V9 ^, z' }$ p7 x
" j; u* g) e0 i: O$ `+------------------------------------+
% U' G! v, @7 Y2 P: V0 F| SEC JTAG FLASH(SJF) v 0.11 +' Q0 r( D7 i7 | C6 v6 d
| modified by MIZI 2002.7.13 +: J3 \. K5 c4 |/ \
+------------------------------------+$ y& m: i7 }$ t
> flashType="5"2 W- a8 x4 R# Y7 o6 G
> S3C2410X(ID=0x0032409d) is detected.
5 N' c. E0 S W/ I- G! D4 y> K9S1208 is detected. ID="0xec76"
' L+ J" y G$ j/ n
3 P; |/ j! m/ _K9S1208 NAND Flash JTAG Programmer Ver 0.05 `2 u* @! M+ D+ |1 H; D
0:K9S1208 Program 1:K9S1208 Pr BlkPage 2: Exit
0 q9 e9 @- x- Y' L# H" r4 E8 T1 s/ u8 |' [ O* ~- u4 n4 U: w
Select the function to test :0
! B9 i$ f, A: O* I1 P! r4 `- l' H) F9 u( Y
[SMC(K9S1208) NAND Flash Writing Program]
) }% @7 U, S3 P/ o/ D
8 w% S# ]' H4 [: @& F4 `Source size: 0x13a53
* L1 ]$ }+ b6 \( X+ A7 `0 c7 o
8 g4 Q" l% }% m- cAvailable target block number: 0~4095; Z; }, @# s; ~, I$ T- ^8 a
Input target block number:0
0 T) |# P2 Q: c3 H" t. starget start block number =0# c5 m0 R2 i% b& R ?8 a8 {
target size (0x4000*n) =0x14000
* f N7 f4 k. B8 H$ Q V- JSTATUS:Epppppppppppppppppppppppppppppppp
9 ~3 K# b; j0 _. t" ]Epppppppppppppppppppppppppppppppp
* f! ~6 \! T$ c* M& H# oEpppppppppppppppppppppppppppppppp- r. D N' a9 O7 @" C( n/ t
Epppppppppppppppppppppppppppppppp
+ n/ B d& d5 m0 h6 {Epppppppppppppppppppppppppppppppp
0 v* u, @2 X, E6 H+ t
6 K: J+ s# l" Z# h+ e3 }+ `K9S1208 NAND Flash JTAG Programmer Ver 0.0% n3 N* U7 ~0 [9 l; r- i! S3 b- A# ~
0:K9S1208 Program 1:K9S1208 Pr BlkPage 2: Exit; I1 M- E, t& L% g7 r
# b6 p5 c, ^/ Q9 |& _/ A
Select the function to test :2
* W( A1 P5 q1 V. K- @. njflash 可以烧写了,但是把vivi烧进去之后,运行minicom,串口没有输出,但是在windows下用$ R8 A7 [/ E# w4 [5 Y' v$ ~2 ~1 S: [
sjf2410烧写同样的一个vivi,正常运行,4 L/ W. @, o- e
碰到这个问题是因为我烧写vivi之后,. U8 C1 t' S( B8 K: F
没有关闭电源,再打开板子, 只是按了一下板子上的Reset按钮,重新关闭再打开,串口就看到了vivi的启动信息。
0 U0 ? x' s4 L' W; c& o5 E6 f这里提供我的Jflash源代码,0 C0 W- j) }, T4 y8 S
说明适合采用wiggler的jtag ,
' P5 g8 N. F; n9 T8 U5 Q* U5 u$ x// TCK ATA[0] (2) // my is 4 DATA[2], v: H- J% ~/ j( N; B9 E" k
// TDI ATA[1] (3) // my is 5 DATA[3]
" D5 n6 a6 ?9 i& c, F+ z/ u: H// TMS :DATA[2] (4) //my is 3 DATA[1]
7 c5 c1 T6 [- P9 {) t' t意思是TCK->pin4,也就是DATA[2],应为pin2-pin9组成了DATA,所以pin2就是DATA[0]/ |7 O4 |5 @8 o$ E& H# k2 {
依次类推TDI,TMS。TDO采用的是pin11, 因为我的jtag的TDO跟litron大侠采用的是一样的,& a! ]7 J9 [: u, j; ~
pin11,就没管它了。 |
|