一種嵌入式系統(tǒng)實現(xiàn)的JTAG調(diào)試器
ARM7TDMI 提供了4 條掃描鏈, 分別是掃描鏈0、1、2 和3.通過掃描鏈0可以訪問arm7TDMI內(nèi)核的外圍電路,包括數(shù)據(jù)總線。該掃描鏈長度為113位, 具體包括數(shù)據(jù)總線的0 ̄31位、內(nèi)核控制信號、地址總線的0 ̄31 位、嵌入式ICE -RT的控制信號等。掃描鏈1是掃描鏈0的子集, 長度為33位,具體包括數(shù)據(jù)總線的0 ̄31位和BREAKPT信號,掃描鏈1比掃描鏈0的長度短了很多,通過掃描鏈1可以更快地將指令或數(shù)據(jù)插入到ARM7TDMI的內(nèi)部。掃描鏈2長度為38位, 該掃描鏈專門用來訪問嵌入式ICE-RT內(nèi)部的寄存器, 通過訪問嵌入式ICERT的內(nèi)部寄存器,可以讓ARM7TDMI進(jìn)入調(diào)試狀態(tài)、設(shè)置斷點、設(shè)置觀察點。通過掃描鏈3, arm7TDMI可以訪問外部的邊界掃描鏈, 該掃描鏈用得很少。
ARM7TDMI 的調(diào)試狀態(tài)和正常運行狀態(tài)是有區(qū)別的。在正常運行狀態(tài)下, ARM7TDMI 由MCLK( MemoryClock)驅(qū)動, 正常運行。在調(diào)試狀態(tài)下, ARM7TDMI的正常運行被打斷,并且和系統(tǒng)的其他部分隔離開來??梢酝ㄟ^掃描鏈插入特定的ARM/THUMB指令來讀寫ARM7TDMI的內(nèi)部寄存器和修改內(nèi)存的內(nèi)容。在完成需要的操作后,可以用RESTART JTAG 指令讓arm7TDMI返回到正常運行狀態(tài),恢復(fù)原來的運行。
JTAG調(diào)試器的嵌入式系統(tǒng)實現(xiàn)
JTAG調(diào)試器硬件是以基于ARM7芯片的嵌入式系統(tǒng)實現(xiàn)的。該系統(tǒng)以帶以太網(wǎng)接口的arm芯片S3C4510B為核心處理器, 以μClinux為嵌入式操作系統(tǒng)。JTAG調(diào)試器軟件主要包括兩部分: JTAG調(diào)試器與目標(biāo)機(jī)的接口模塊和與調(diào)試主機(jī)的接口模塊。
嵌入式系統(tǒng)設(shè)計
設(shè)計并制作標(biāo)準(zhǔn)的S3C4510B應(yīng)用系統(tǒng), 主要配置為2MBFLASH、16MBSDRAM、10/100Mbps 自適應(yīng)以太網(wǎng)口、終端接口、并行I/O 接口等。利用S3C4510B 的通用I/O口中的P[4]、P[5]、P[6]、P[8]分別模擬JTAG標(biāo)準(zhǔn)中TAP的4個信號接口, 即TCK、TMS、TDI、TDO.
從軟件上看, 需要將μClinux 操作系統(tǒng)移植到設(shè)計制作的基于S3C4510B的JTAG調(diào)試器硬件平臺上,以便開發(fā)基于網(wǎng)絡(luò)的調(diào)試器軟件。μCLinux是為沒有內(nèi)存管理單元(MMU)的處理器設(shè)計的一種嵌入式操作系統(tǒng),它繼承了桌面Linux的強(qiáng)大網(wǎng)絡(luò)功能,其內(nèi)核采用模塊化的組織結(jié)構(gòu),通過增減內(nèi)核模塊的方式來增減系統(tǒng)的功能。
通常,在PC機(jī)上通過并口模擬JTAG時序,也可以按照標(biāo)準(zhǔn)仿真器設(shè)計JTAG調(diào)試器。與上述方案不同,本設(shè)計采用開放源代碼軟件設(shè)計JTAG調(diào)試器應(yīng)用軟件,主要參考了Open- JTAG小組開發(fā)的通過PC機(jī)并口實現(xiàn)JTAG操作的軟件jtager - 1.0.0,將其中對PC 機(jī)并口的操作改為對S3C4510B口線的操作,通過設(shè)置S3C4510B的通用I/O口模式寄存器IOPMOD 的值可將P[4]、P[5]、P[6]設(shè)置為輸出模式,將P[8]設(shè)置為輸入模式,然后通過編程設(shè)置I/O口數(shù)據(jù)寄存器IOPDATA的值,控制P [4]、P[5]、P[6]、P[8]的狀態(tài)實現(xiàn)JTAG標(biāo)準(zhǔn)要求的時序。隨后,根據(jù)arm7TDMI調(diào)試特性,修改操作代碼,增加通過網(wǎng)絡(luò)的遠(yuǎn)程調(diào)試功能。
arm7TDMI的JTAG指令實現(xiàn)
ARM7TDMI 的指令寄存器長度是4位, 通過TAP和JTAG接口, 可以把指令裝載到指令寄存器中。在CAPTURE-IR狀態(tài)下, 固定值B0001總是被裝載到指令寄存器中。在SHIFT- IR狀態(tài)下, 可以把a(bǔ)rm7TDMI支持的新指令從TDI串行輸入,同時固定值B0001會從TDO 串行輸出。通過輸出的這個固定值,可以判斷當(dāng)前的操作是否正確。在UPDATE- IR狀態(tài)下, 新輸入的指令被裝載到指令寄存器中。在回到RUN- TEST/IDLE狀態(tài)后,新指令立即生效。
IDCODE和SCAN_N是ARM7TDMI調(diào)試中經(jīng)常用到的JTAG命令。IDCODE命令的二進(jìn)制代碼是1110.IDCODE命令將Device Identification Code寄存器連接到TDI和TDO之間。Device Identification Code寄存器的長度是32 位,通過TAP可以讀到ARM7TDMI的ID.SCAN_N命令的二進(jìn)制代碼是0010.arm7TDMI 提供了4 條掃描鏈,通過SCAN_N指令可以選擇需要訪問的掃描鏈。選擇掃描鏈的過程是:先把SCAN_N指令裝載到指令寄存器中,該指令會將長度為4位的掃描鏈選擇寄存器連接到TDI和TDO之間;通過TAP狀態(tài)的轉(zhuǎn)移便可使選擇的掃描鏈連接到TDI和TDO之間。
另外BYPASS、INTEST、RESTART等JTAG指令的實現(xiàn)方法與上面兩條指令的實現(xiàn)方法類似。
嵌入式ICE- RT邏輯實現(xiàn)
嵌入式ICE- RT是arm處理器內(nèi)部集成的在線仿真功能模塊,通過JTAG調(diào)試接口與外界交互,其中包含的常用寄存器。
要訪問嵌入式ICE- RT內(nèi)部的寄存器,可通過掃描鏈2對Debug Control Register進(jìn)行訪問。實現(xiàn)過程:通過TAP將SCAN_N指令寫入JTAG指令寄存器中,通過TDI將數(shù)值2寫到掃描鏈選擇寄存器中,即選擇了掃描鏈2,在通過掃描鏈2訪問任何嵌入式ICE- RT內(nèi)部寄存器之前,還需要用INTEST指令將當(dāng)前通過SCAN_N指令選擇的掃描鏈置為內(nèi)部測試狀態(tài)。寫入INTEST指令的過程和寫入SCAN_N 指令的過程類似。接下來就可以通過掃描鏈2訪問嵌入式ICE- RT內(nèi)部寄存器,實現(xiàn)對arm7TDMI的基本調(diào)試功能。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評論