ARM系列處理器正是通過(guò)JTAG 接口使用內(nèi)部集成的ICE 功能, 并采用這種方式實(shí)現(xiàn)在線調(diào)試。此外CPLD、FPGA 等器件大多都可以使用JTAG 接口實(shí)現(xiàn)在線編程或下載。因此,JTAG 接口已經(jīng)成為復(fù)雜芯片系統(tǒng)的必備接口, 在芯片測(cè)試、調(diào)試及實(shí)現(xiàn)其他特殊功能方面發(fā)揮著重要作用。
基本原理
JTAG 標(biāo)準(zhǔn)即IEEE 1149.1 標(biāo)準(zhǔn)。聯(lián)合測(cè)試行動(dòng)組JTAG(Joint Test Action Group ) 起草了邊界掃描測(cè)試BST(Boundary Scan Testing)規(guī)范, 該標(biāo)準(zhǔn)為數(shù)字集成電路規(guī)定了一個(gè)測(cè)試訪問(wèn)口(TAP) 和邊界掃描結(jié)構(gòu),解決了由于數(shù)字電路高度集成化帶來(lái)的一些測(cè)試難題。它還提供了一種訪問(wèn)和控制芯片內(nèi)部仿真(ICE) 模塊的方法, ICE 模塊一般包括內(nèi)部掃描和自測(cè)試的功能, 可以很好地支持集成電路的開(kāi)發(fā)。
JTAG 標(biāo)準(zhǔn)工作原理
邊界掃描技術(shù)的基本思想是在靠近芯片的輸入輸出管腳增加一個(gè)移位寄存器單元。通過(guò)這些邊界掃描寄存器單元, 可以實(shí)現(xiàn)對(duì)芯片輸入輸出信號(hào)的觀察和控制。另外, 靠近芯片輸入輸出管腳的邊界掃描(移位) 寄存器單元可以相互連接起來(lái), 在芯片的周?chē)纬梢粋€(gè)邊界掃描鏈(Boundary- Scan Chain) 。一般的芯片都會(huì)提供幾條獨(dú)立的邊界掃描鏈, 用來(lái)實(shí)現(xiàn)完整的測(cè)試功能。
在JTAG標(biāo)準(zhǔn)中, 寄存器被分為兩大類: 數(shù)據(jù)寄存器(DR- Data Register)和指令寄存器(IR- Instruction Register),邊界掃描鏈寄存器即為一種很重要的數(shù)據(jù)寄存器, 邊界掃描鏈可用來(lái)觀察和控制芯片的輸入輸出。指令寄存器用來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)寄存器的控制。TAP 是一個(gè)通用的端口, 通過(guò)TAP 可以訪問(wèn)芯片提供的所有數(shù)據(jù)寄存器和指令寄存器, 對(duì)整個(gè)TAP的控制是通過(guò)TAP控制器完成的。TAP包括5個(gè)信號(hào)接口: (1)TCK(Test Clock), 為T(mén)AP操作提供了一個(gè)獨(dú)立的基本的時(shí)鐘信號(hào)。(2)TMS(Test-Mode Selector) , 用來(lái)控制TAP狀態(tài)機(jī)的轉(zhuǎn)換。(3)TDI(TestData Input), 是JTAG指令和數(shù)據(jù)的串行輸入端。在TCK的上升沿被采樣, 結(jié)果送到JTAG寄存器中。(4)TDO(Test Data Output), 是JTAG指令和數(shù)據(jù)的串行輸出端。在TCK的下降沿被輸出到TDO。(5)TRST, 是JTAG電路的復(fù)位輸入信號(hào), 低電平有效。
通過(guò)TAP控制器的狀態(tài)轉(zhuǎn)移即可實(shí)現(xiàn)對(duì)數(shù)據(jù)寄存器和指令寄存器的訪問(wèn), 從而實(shí)現(xiàn)對(duì)JTAG測(cè)試電路的控制。TAP控制器共有16 種狀態(tài), 如圖1 所示。通過(guò)測(cè)試模式選擇TMS 和時(shí)鐘TCK可控制狀態(tài)的轉(zhuǎn)移。
指令寄存器允許特定的指令被裝載到指令寄存器當(dāng)中, 用來(lái)選擇需要執(zhí)行的測(cè)試, 或者選擇需要訪問(wèn)的測(cè)試數(shù)據(jù)寄存器。每個(gè)支持JTAG調(diào)試的芯片必須包含一個(gè)指令寄存器。JTAG標(biāo)準(zhǔn)要求芯片支持的基本指令有:EXTEST、INTEST、SAMPLE/PRELOAD、BYPASS、HIGHZ等。
ARM7TDMI 調(diào)試原理
從功能上看, ARM7TDMI 處理器主要包括三大部分:
(1)ARM CPU Main Processor Logic , 包括了對(duì)調(diào)試的硬件支持; (2)嵌入式ICE- RT Logic , 包括了一組寄存器和比較器, 用來(lái)產(chǎn)生調(diào)試異常、設(shè)置斷點(diǎn)和觀察點(diǎn); (3)TAP控制器, 它通過(guò)JTAG接口控制和操作掃描鏈。
ARM7TDMI 提供了4 條掃描鏈, 分別是掃描鏈0、1、2 和3。通過(guò)掃描鏈0可以訪問(wèn)ARM7TDMI內(nèi)核的外圍電路,包括數(shù)據(jù)總線。該掃描鏈長(zhǎng)度為113位, 具體包括數(shù)據(jù)總線的0 ̄31位、內(nèi)核控制信號(hào)、地址總線的0 ̄31 位、嵌入式ICE-RT的控制信號(hào)等。掃描鏈1是掃描鏈0的子集, 長(zhǎng)度為33位, 具體包括數(shù)據(jù)總線的0 ̄31位和BREAKPT信號(hào),掃描鏈1比掃描鏈0的長(zhǎng)度短了很多,通過(guò)掃描鏈1可以更快地將指令或數(shù)據(jù)插入到ARM7TDMI的內(nèi)部。掃描鏈2長(zhǎng)度為38位, 該掃描鏈專門(mén)用來(lái)訪問(wèn)嵌入式ICE-RT內(nèi)部的寄存器, 通過(guò)訪問(wèn)嵌入式ICERT的內(nèi)部寄存器, 可以讓ARM7TDMI進(jìn)入調(diào)試狀態(tài)、設(shè)置斷點(diǎn)、設(shè)置觀察點(diǎn)。通過(guò)掃描鏈3, ARM7TDMI可以訪問(wèn)外部的邊界掃描鏈, 該掃描鏈用得很少。
ARM7TDMI 的調(diào)試狀態(tài)和正常運(yùn)行狀態(tài)是有區(qū)別的。在正常運(yùn)行狀態(tài)下, ARM7TDMI由MCLK( MemoryClock)驅(qū)動(dòng), 正常運(yùn)行。在調(diào)試狀態(tài)下, ARM7TDMI的正常運(yùn)行被打斷, 并且和系統(tǒng)的其他部分隔離開(kāi)來(lái)??梢酝ㄟ^(guò)掃描鏈插入特定的ARM/THUMB指令來(lái)讀寫(xiě)ARM7TDMI的內(nèi)部寄存器和修改內(nèi)存的內(nèi)容。在完成需要的操作后,可以用RESTART JTAG 指令讓ARM7TDMI返回到正常運(yùn)行狀態(tài),恢復(fù)原來(lái)的運(yùn)行。
JTAG 調(diào)試器的嵌入式系統(tǒng)實(shí)現(xiàn)
JTAG調(diào)試器硬件是以基于ARM7芯片的嵌入式系統(tǒng)實(shí)現(xiàn)的。該系統(tǒng)以帶以太網(wǎng)接口的ARM芯片S3C4510B為核心處理器, 以μClinux為嵌入式操作系統(tǒng)。JTAG調(diào)試器軟件主要包括兩部分: JTAG調(diào)試器與目標(biāo)機(jī)的接口模塊和與調(diào)試主機(jī)的接口模塊。具體結(jié)構(gòu)框圖如圖2 所示。
嵌入式系統(tǒng)設(shè)計(jì)
設(shè)計(jì)并制作標(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個(gè)信號(hào)接口, 即TCK、TMS、TDI、TDO。
從軟件上看, 需要將μClinux 操作系統(tǒng)移植到設(shè)計(jì)制作的基于S3C4510B的JTAG調(diào)試器硬件平臺(tái)上, 以便開(kāi)發(fā)基于網(wǎng)絡(luò)的調(diào)試器軟件。μCLinux是為沒(méi)有內(nèi)存管理單元(MMU)的處理器設(shè)計(jì)的一種嵌入式操作系統(tǒng),它繼承了桌面Linux的強(qiáng)大網(wǎng)絡(luò)功能,其內(nèi)核采用模塊化的組織結(jié)構(gòu),通過(guò)增減內(nèi)核模塊的方式來(lái)增減系統(tǒng)的功能。
通常, 在PC機(jī)上通過(guò)并口模擬JTAG時(shí)序,也可以按照標(biāo)準(zhǔn)仿真器設(shè)計(jì)JTAG調(diào)試器。與上述方案不同,本設(shè)計(jì)采用開(kāi)放源代碼軟件設(shè)計(jì)JTAG調(diào)試器應(yīng)用軟件,主要參考了Open- JTAG小組開(kāi)發(fā)的通過(guò)PC機(jī)并口實(shí)現(xiàn)JTAG操作的軟件jtager - 1.0.0,將其中對(duì)PC 機(jī)并口的操作改為對(duì)S3C4510B口線的操作,通過(guò)設(shè)置S3C4510B的通用I/O口模式寄存器IOPMOD 的值可將P[4]、P[5]、P[6]設(shè)置為輸出模式,將P[8]設(shè)置為輸入模式,然后通過(guò)編程設(shè)置I/O口數(shù)據(jù)寄存器IOPDATA的值,控制P[4]、P[5]、P[6]、P[8]的狀態(tài)實(shí)現(xiàn)JTAG標(biāo)準(zhǔn)要求的時(shí)序。隨后,根據(jù)ARM7TDMI調(diào)試特性,修改操作代碼,增加通過(guò)網(wǎng)絡(luò)的遠(yuǎn)程調(diào)試功能。
ARM7TDMI 的JTAG 指令實(shí)現(xiàn)
ARM7TDMI 的指令寄存器長(zhǎng)度是4位, 通過(guò)TAP和JTAG接口, 可以把指令裝載到指令寄存器中。在CAPTURE-IR狀態(tài)下, 固定值B0001總是被裝載到指令寄存器中。在SHIFT- IR狀態(tài)下, 可以把ARM7TDMI支持的新指令從TDI串行輸入,同時(shí)固定值B0001會(huì)從TDO 串行輸出。通過(guò)輸出的這個(gè)固定值,可以判斷當(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寄存器的長(zhǎng)度是32 位,通過(guò)TAP可以讀到ARM7TDMI的ID。SCAN_N命令的二進(jìn)制代碼是0010。ARM7TDMI提供了4 條掃描鏈,通過(guò)SCAN_N指令可以選擇需要訪問(wèn)的掃描鏈。選擇掃描鏈的過(guò)程是:先把SCAN_N指令裝載到指令寄存器中,該指令會(huì)將長(zhǎng)度為4位的掃描鏈選擇寄存器連接到TDI和TDO之間;通過(guò)TAP狀態(tài)的轉(zhuǎn)移便可使選擇的掃描鏈連接到TDI和TDO之間。
另外BYPASS、INTEST、RESTART等JTAG指令的實(shí)現(xiàn)方法與上面兩條指令的實(shí)現(xiàn)方法類似。
嵌入式ICE- RT 邏輯實(shí)現(xiàn)
嵌入式ICE- RT是ARM處理器內(nèi)部集成的在線仿真功能模塊,通過(guò)JTAG調(diào)試接口與外界交互,其中包含的常用寄存器如表1所示。
要訪問(wèn)嵌入式ICE- RT內(nèi)部的寄存器,可通過(guò)掃描鏈2對(duì)Debug Control Register進(jìn)行訪問(wèn)。實(shí)現(xiàn)過(guò)程:通過(guò)TAP將SCAN_N指令寫(xiě)入JTAG指令寄存器中,通過(guò)TDI將數(shù)值2寫(xiě)到掃描鏈選擇寄存器中,即選擇了掃描鏈2,在通過(guò)掃描鏈2訪問(wèn)任何嵌入式ICE- RT內(nèi)部寄存器之前,還需要用INTEST指令將當(dāng)前通過(guò)SCAN_N指令選擇的掃描鏈置為內(nèi)部測(cè)試狀態(tài)。寫(xiě)入INTEST指令的過(guò)程和寫(xiě)入SCAN_N指令的過(guò)程類似。接下來(lái)就可以通過(guò)掃描鏈2訪問(wèn)嵌入式ICE- RT內(nèi)部寄存器,實(shí)現(xiàn)對(duì)ARM7TDMI的基本調(diào)試功能。
ARM7TDMI 寄存器和內(nèi)存訪問(wèn)的實(shí)現(xiàn)
邊界掃描鏈分布在ARM7TDMI的32位數(shù)據(jù)總線的周?chē)? ARM7TDMI每次取指令或者進(jìn)行數(shù)據(jù)存儲(chǔ)時(shí)都要通過(guò)32位數(shù)據(jù)總線進(jìn)行。這樣, 通過(guò)邊界掃描鏈1, 就可以插入新指令或者新數(shù)據(jù), 同時(shí)也可以捕獲出現(xiàn)在數(shù)據(jù)總線上的數(shù)據(jù)。通過(guò)這種方式, 可以檢查和修改ARM7TDMI的通用寄存器和系統(tǒng)內(nèi)存。
以讀取寄存器R0 的值為例, 介紹邊界掃描鏈1 的操作過(guò)程, 如圖3 所示。
讀取寄存器R0的值可以用指令STR R0, [R0] ( 機(jī)器碼為0xE5800000) 來(lái)實(shí)現(xiàn)。該指令可將寄存器R0 的值存儲(chǔ)到內(nèi)存單元R0中去。因?yàn)樵贏RM7TDMI處于調(diào)試狀態(tài)時(shí), ARM7TDMI和外部是隔離開(kāi)的, 所以該指令實(shí)際上不能訪問(wèn)內(nèi)存單元, 也不會(huì)對(duì)內(nèi)存單元產(chǎn)生任何影響。使用指令STR R0, [R0]可使得寄存器R0的值出現(xiàn)在數(shù)據(jù)總線上, 這樣就可以通過(guò)掃描鏈1將其捕獲, 然后從TDO輸出。指令STR R0, [R0]的執(zhí)行需要兩個(gè)指令執(zhí)行周期。在第一個(gè)指令執(zhí)行周期, 執(zhí)行地址計(jì)算; 在第二個(gè)指令執(zhí)行周期, 將寄存器R0的值放到數(shù)據(jù)總線上去。對(duì)ARM寄存器寫(xiě)操作及訪問(wèn)內(nèi)存的方法與此類似,都是通過(guò)掃描鏈1, 只是所使用的指令不同而已。
網(wǎng)絡(luò)編程
通過(guò)網(wǎng)絡(luò)編程, 可以對(duì)目標(biāo)系統(tǒng)實(shí)現(xiàn)遠(yuǎn)程調(diào)試。圖4是PC與仿真器的網(wǎng)絡(luò)通信流程圖。網(wǎng)絡(luò)通信通過(guò)μClinux下的socket編程實(shí)現(xiàn), 首先PC(調(diào)試主機(jī))通過(guò)網(wǎng)絡(luò)向仿真器發(fā)送命令, 仿真器通過(guò)統(tǒng)一的程序接口分析調(diào)試命令, 并將調(diào)試命令轉(zhuǎn)換成JTAG標(biāo)準(zhǔn)所要求的時(shí)序, 通過(guò)I/O口線發(fā)送到目標(biāo)板; 然后目標(biāo)板執(zhí)行命令,并將命令執(zhí)行后得到的調(diào)試信息返回給仿真器, 接著仿真器將調(diào)試信息通過(guò)網(wǎng)絡(luò)發(fā)送給PC, 這樣用戶在PC上便得到了調(diào)試信息。
JTAG調(diào)試器測(cè)試及部分執(zhí)行結(jié)果
本設(shè)計(jì)最終完成了一種在Linux終端下操作的JTAG調(diào)試器。調(diào)試器上電后便在μClinux 下自動(dòng)運(yùn)行調(diào)試器客戶端程序, 同時(shí)在PC的Cygwin環(huán)境下運(yùn)行JTAG調(diào)試器服務(wù)器端程序jtager , 建立網(wǎng)絡(luò)連接。然后在Cygwin下鍵入用戶調(diào)試命令, 執(zhí)行下列操作: (1)寫(xiě)目標(biāo)板上的CPU狀態(tài); (2)讀寫(xiě)編址在統(tǒng)一內(nèi)存空間的外部設(shè)備寄存器; (3)讀寫(xiě)目標(biāo)機(jī)上的RAM; (4)讀寫(xiě)目標(biāo)機(jī)上的固態(tài)存儲(chǔ)設(shè)備, 如Flash; (5)對(duì)嵌入式ICE- RT進(jìn)行調(diào)試。
設(shè)計(jì)實(shí)現(xiàn)的調(diào)試器的用戶命令較多, 下面僅列出兩條典型命令I(lǐng)DCODE 和REG 執(zhí)行后的結(jié)果。
執(zhí)行IDCODE命令后, 讀出了一個(gè)基于S3C4510B的目標(biāo)開(kāi)發(fā)板內(nèi)的CPUID號(hào), 從而得到Device ID="0x1F0F0F0F"。通過(guò)邏輯分析儀分析幾個(gè)JTAG接口信號(hào)的時(shí)序關(guān)系, 可以觀察到JTAG掃描連的訪問(wèn)過(guò)程以及該過(guò)程中各種狀態(tài)的轉(zhuǎn)移, 結(jié)果與JTAG_調(diào)試原理吻合。
執(zhí)行RE命令后, 得到了寄存器R0~R15及CPSR內(nèi)容, 即讀出了目標(biāo)開(kāi)發(fā)板處理器S3C4510B在當(dāng)前處理器模式下的所有寄存器值, 而且還可以通過(guò)其他命令對(duì)其進(jìn)行修改。
此外, 通過(guò)掃描鏈2可以訪問(wèn)嵌入式ICE- RT的17個(gè)寬度不同的內(nèi)部調(diào)試寄存器, 通過(guò)這些寄存器使目標(biāo)ARM7TDMI分別進(jìn)入調(diào)試狀態(tài)的3種方式, 即控制DBGRQ信號(hào)、斷點(diǎn)和觀察點(diǎn), 實(shí)現(xiàn)在線調(diào)試功能。
本文實(shí)現(xiàn)的JTAG調(diào)試器具有基本的調(diào)試功能, 尚不具備完善的用戶操作界面, 特別是圖形操作界面, 另外網(wǎng)絡(luò)功能也需要進(jìn)一步完善。但調(diào)試器的設(shè)計(jì)和實(shí)現(xiàn)方法對(duì)于設(shè)計(jì)類似調(diào)試器具有參考價(jià)值。為了提高JTAG調(diào)試器速率, 還可以采用CPLD或FPGA實(shí)現(xiàn)JTAG時(shí)序,通過(guò)存儲(chǔ)器形式與調(diào)試器CPU接口, 這將在提高速度的同時(shí), 減輕調(diào)試器CPU的負(fù)擔(dān)。
-
處理器
+關(guān)注
關(guān)注
68文章
19100瀏覽量
228814 -
嵌入式
+關(guān)注
關(guān)注
5059文章
18973瀏覽量
302033 -
JTAG
+關(guān)注
關(guān)注
6文章
397瀏覽量
71557
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論