標籤:
ARM JTAG 調試原理
OPEN-JTAG 開發小組
1 前言
這篇文章主要介紹 ARM JTAG 調試的基本原理。
基本的內容包括了 TAP (TEST ACCESS PORT) 和 BOUNDARY-SCAN ARCHITECTURE 的介紹,
在此基礎上,結合 ARM7TDMI 詳細 介紹了的 JTAG 調試原理。
這篇文章主要是總結了前段時間的一些心得體會,希望對想瞭解 ARM JTAG 調試的網友們 有所協助。
我個人對 ARM JTAG 的理解還不是很透徹,在文章中,難免會有偏失和不準確的地 方,
希望精通 JTAG 調試原理的大俠們不要拍磚,有什麼問題提出來,我一定儘力糾正。
同時 也歡迎對 ARM JTAG 調試感興趣的朋友們一起交流學習。
2 IEEE Standard 1149.1 - Test Access Port and Boundary-Scan Architecture
既然是介紹 JTAG 調試,還是讓我們從 IEEE 的 JTAG 調試標準開始吧。
JTAG 是 JOINT TEST ACTION GROUP 的簡稱。IEEE 1149.1 標準就是由 JTAG 這個組織最初提出的,最終由 IEEE 批准並且標準化的。
所以,這個 IEEE 1149.1 這個標準一般也俗稱 JTAG 調試標準。
接 下 來的這 一 部分, 主 要簡單 的 介紹了 TAP (TEST ACCESS PORT) 和 BOUNDARY-SCAN ARCHITECTURE 的基本構架。
雖然不是很全面,但對瞭解 JTAG 的基本 原理來說,應該是差不離了。
如果希望更全面深入的瞭解 JTAG 的工作原理,可以參考 IEEE 1149.1 標準。
2-1 邊界掃描
在 JTAG 調試當中,邊界掃描(Boundary-Scan)是一個很重要的概念。
邊界掃描技術的 基本思想是在靠近晶片的輸入輸出管腳上增加一個移位寄存器單元。
因為這些移位寄存器單 元都分布在晶片的邊界上(周圍),所以被稱為邊界掃描寄存器(Boundary-Scan Register Cell)。
當晶片處於調試狀態的時候,這些邊界掃描寄存器可以將晶片和外圍的輸入輸出隔離開來。
通過這些邊界掃描寄存器單元,可以實現對晶片輸入輸出訊號的觀察和控制。
對於晶片的輸 入管腳,可以通過與之相連的邊界掃描寄存器單元把訊號(資料)載入倒該管腳中去;
對於 晶片的輸出管腳,也可以通過與之相連的邊界掃描寄存器“捕獲”(CAPTURE)該管腳上的 輸出訊號。
在正常的運行狀態下,這些邊界掃描寄存器對晶片來說是透明的,所以正常的運 行不會受到任何影響。
這樣,邊界掃描寄存器提供了一個便捷的方式用以觀測和控制所需要 調試的晶片。
另外,晶片輸入輸出管腳上的邊界掃描(移位)寄存器單元可以相互串連起來, 在晶片的周圍形成一個邊界掃描鏈(Boundary-Scan Chain)。
一般的晶片都會提供幾條獨立的 邊界掃描鏈,用來實現完整的測試功能。
邊界掃描鏈可以串列的輸入和輸出,通過相應的時 鐘訊號和控制訊號,就可以方便的觀察和控制處在調試狀態下的晶片。
利用邊界掃描鏈可以實現對晶片的輸入輸出進行觀察和控制。
下一個問題是:如何來管 理和使用這些邊界掃描鏈?
對邊界掃描鏈的控制主要是通過 TAP(Test Access Port)Controller 來完成的。
在下一個小節,我們一起來看看 TAP 是如何工作的。
2-2 TAP (TEST ACCESS PORT)
在上一節,我們已經簡單介紹了邊界掃描鏈,而且也瞭解了一般的晶片都會提供幾條邊 界掃描鏈,用來實現完整的測試功能。
下面,我將逐步介紹如何?掃描鏈的控制和訪問。
在 IEEE 1149.1 標準裡面,寄存器被分為兩大類:
資料寄存器(DR-Data Register)和指令 寄存器(IR-Instruction Register)。
邊界掃描鏈屬於資料寄存器中很重要的一種。
邊界掃描鏈用 來實現對晶片的輸入輸出的觀察和控制。而指令寄存器用來實現對資料寄存器的控制,
例如: 在晶片提供的所有邊界掃描鏈中,選擇一條指定的邊界掃描鏈作為當前的目標掃描鏈,並作 為訪問對象。
下面,讓我們從 TAP(Test Access Port)開始。
TAP 是一個通用的連接埠,通過 TAP 可以訪問晶片提供的所有資料寄存器(DR)和指令 寄存器(IR)。
對整個 TAP 的控制是通過 TAP Controller 來完成的。
TAP 總共包括 5 個訊號接 口 TCK、TMS、TDI、TDO 和 TRST :
其中 4 個是輸入訊號介面和另外 1 個是輸出訊號介面。
一般,我們見到的開發板上都有一個 JTAG 介面,該 JTAG 介面的主要訊號介面就是這 5 個。
下面,我先分別介紹這個 5 個介面訊號及其作用。 ?
Test Clock Input (TCK) TCK 為 TAP 的操作提供了一個獨立的、基本的時鐘訊號,TAP 的所有操作都是通過 這個時鐘訊號來驅動的。
TCK 在 IEEE 1149.1 標準裡是強制要求的。 ?
Test Mode Selection Input (TMS) TMS 訊號用來控制 TAP 狀態機器的轉換。
通過 TMS 訊號,可以控制 TAP 在不同的狀 態間相互轉換。TMS 訊號在 TCK 的上升沿有效。
TMS 在 IEEE 1149.1 標準裡是強制 要求的。 ?
Test Data Input (TDI) TDI 是資料輸入的介面。所有要輸入到特定寄存器的資料都是通過 TDI 介面一位一位 串列輸入的(由 TCK 驅動)。
TDI 在 IEEE 1149.1 標準裡是強制要求的。 ?
Test Data Output (TDO) TDO 是資料輸出的介面。
所有要從特定的寄存器中輸出的資料都是通過 TDO 介面一 位一位串列輸出的(由 TCK 驅動)。
TDO 在 IEEE 1149.1 標準裡是強制要求的。 ?
Test Reset Input (TRST) TRST可以用來對TAP Controller進行複位(初始化)。
不過這個訊號介面在IEEE 1149.1 標準裡是可選的,並不是強制要求的。
因為通過 TMS 也可以對 TAP Controller 進行複 位(初始化)。
事實上,通過 TAP 介面,對資料寄存器(DR)進行訪問的一般過程是: ?
通過指令寄存器(IR),選定一個需要訪問的資料寄存器; ? 把選定的資料寄存器串連到 TDI 和 TDO 之間; ?
由 TCK 驅動,通過 TDI,把需要的資料輸入到選定的資料寄存器當中去;
同時把選 定的資料寄存器中的資料通過 TDO 讀出來。
接下來,讓我們一起來瞭解一下 TAP 的狀態機器。
TAP 的狀態機器 1 所示,總共有 16 個 狀態。在圖中,每個六邊形表示一個狀態,六邊形中標有該狀態的名稱和標識代碼。
圖中的 箭頭表示了 TAP Controller 內部所有可能的狀態轉換流程。
狀態的轉換是由 TMS 控制的,所 以在每個箭頭上有標有 tms = 0 或者 tms = 1。
在 TCK 的驅動下,從目前狀態到下一個狀態 的轉換是由 TMS 訊號決定。
假設 TAP Controller 的目前狀態為 Select-DR-Scan,在 TCK 的驅 動下,
如果 TMS = 0,TAP Controller 進入 Capture-DR 狀態;
如果 TMS = 1,TAP Controller 進入 Select-IR-Scan 狀態。
這個狀態機器看似很複雜,其實理解以後會發現這個狀態機器其實很直接、很簡單。
觀察圖 1,我們可以發現,除了 Test-Logic Reset 和 Test-Run/Idle 狀態外,其他的狀態有些類似。
例 如 Select-DR-Scan 和 Select-IR-Scan 對應,Capture-DR 和 Capture-IR 對應,Shift-DR 和 Shift-IR 對應,等等。
在這些對應的狀態中,DR 表示 Data Register,IR 表示 Instruction Register。
記 得我們前面說過嗎,寄存器分為兩大類,資料寄存器和指令寄存器。
其實標識有 DR 的這些 狀態是用來訪問資料寄存器的,而標識有 IR 的這些狀態是用來訪問指令寄存器的。
在詳細描述整個狀態機器中的每一個狀態之前,首先讓我們來想一想:
要通過邊界掃描鏈 來觀察和控制晶片的輸入和輸出,需要做些什嗎?
如果需要捕獲晶片某個管腳上的輸出,首 先需要把該管腳上的輸出裝載到邊界掃描鏈的寄存器單元裡去,
然後通過 TDO 輸出,這樣我 們就可以從 TDO 上得到相應管腳上的輸出訊號。
如果要在晶片的某個管腳上載入一個特定的 訊號,則首先需要通過 TDI 把期望的訊號移位到與相應管腳相連的邊界掃描鏈的寄存器單元 裡去,
然後把該寄存器單元的值載入到相應的晶片管腳。
下面,讓我們一起來看看每個狀態 具體表示什麼意思?完成什麼功能?
Test-Logic Reset 系統上電後,TAP Controller 自動進入該狀態。
在該狀態下,測試部分的邏輯電路全部被禁用,以保證晶片核心邏輯電路的正常工作。
通過 TRST 訊號也可以對測試邏輯電路進 行複位,使得 TAP Controller 進入 Test-Logic Reset 狀態。
前面我們說過 TRST 是可選的 一個訊號介面,這是因為在 TMS 上連續加 5 個 TCK 脈衝寬度的“1”訊號
也可以對測試 邏輯電路進行複位,使得 TAP Controller 進入 Test-Logic Reset 狀態。
所以,在不提供 TRST 訊號的情況下,也不會產生影響。
在該狀態下,如果 TMS 一直保持為“1”,TAP Controller 將保持在 Test-Logic Reset 狀態下;
如果 TMS 由“1”變為“0”(在 TCK 的上升沿觸發), 將使 TAP Controller 進入 Run-Test/Idle 狀態。
Run-Test/Idle 這個是 TAP Controller 在不同操作間的一個中間狀態。
這個狀態下的動作取決於當前指令 寄存器中的指令。
有些指令會在該狀態下執行一定的操作,而有些指令在該狀態下不需 要執行任何操作。
在該狀態下,如果 TMS 一直保持為“0”,TAP Controller 將一直保持 在 Run-Test/Idle 狀態下;
如果 TMS 由“0”變為“1”(在 TCK 的上升沿觸發),將使 TAP Controller 進入 Select-DR-Scan 狀態。
Select-DR-Scan 這是一個臨時的中間狀態。
如果 TMS 為“0” (在 TCK 的上升沿觸發),TAP Controller 進入 Capture-DR 狀態,後續的系列動作都將以資料寄存器作為操作對象;
如果 TMS 為 “1” (在 TCK 的上升沿觸發),TAP Controller 進入 Select-IR-Scan 狀態。
Capture-DR 當 TAP Controller 在這個狀態中,在 TCK 的上升沿,晶片輸出管腳上的訊號將被“捕獲” 到與之對應的資料寄存器的各個單元中去。
如果 TMS 為“0”(在 TCK 的上升沿觸發), TAP Controller 進入 Shift-DR 狀態;
如果 TMS 為“1” (在 TCK 的上升沿觸發),TAP Controller 進入 Exit1-DR 狀態。
Shift-DR 在這個狀態中,由 TCK 驅動,每一個刻度,被串連在 TDI 和 TDO 之間的資料寄存 器
將從 TDI 接收一位元據,同時通過 TDO 輸出一位元據。
如果 TMS 為“0” (在 TCK 的上升沿觸發),TAP Controller 保持在 Shift-DR 狀態;
如果 TMS 為“1” (在 TCK 的 上升沿觸發),TAP Controller 進入到 Exit1-DR 狀態。
假設當前的資料寄存器的長度為 4。
如果 TMS 保持為 0,那在 4 個 TCK 刻度後,該資料寄存器中原來的 4 位元據(一 般是在 Capture-DR 狀態中捕獲的資料)將從 TDO 輸出來;
同時該資料寄存器中的每個 寄存器單元中將分別獲得從 TDI 輸入的 4 位新資料。
Update-DR 在 Update-DR 狀態下,由 TCK 上升沿驅動,資料寄存器當中的資料將被載入到相應的芯 片管腳上去,用以驅動晶片。
在該狀態下,如果 TMS 為“0”,TAP Controller 將回到 Run-Test/Idle 狀態;
如果 TMS 為“1”,TAP Controller 將進入 Select-DR-Scan 狀態。
Select-IR-Scan 這是一個臨時的中間狀態。
如果 TMS 為“0” (在 TCK 的上升沿觸發),TAP Controller 進入 Capture-IR 狀態,後續的系列動作都將以指令寄存器作為操作對象;
如果 TMS 為 “1” (在 TCK 的上升沿觸發),TAP Controller 進入 Test-Logic Reset 狀態。
Capture-IR 當 TAP Controller 在這個狀態中,在 TCK 的上升沿,一個特定的邏輯序列將被裝載到指 令寄存器中去。
如果 TMS 為“0”(在 TCK 的上升沿觸發),TAP Controller 進入 Shift-IR 狀態;
如果 TMS 為“1” (在 TCK 的上升沿觸發),TAP Controller 進入 Exit1-IR 狀態。
Shift-IR 在這個狀態中,由 TCK 驅動,每一個刻度,被串連在 TDI 和 TDO 之間的指令寄存器將
從 TDI 接收一位元據,同時通過 TDO 輸出一位元據。
如果 TMS 為“0” (在 TCK 的上升沿觸發),TAP Controller 保持在 Shift-IR 狀態;
如果 TMS 為“1” (在 TCK 的 上升沿觸發),TAP Controller 進入到 Exit1-IR 狀態。
假設指令寄存器的長度為 4。如果 TMS 保持為 0,那在 4 個 TCK 刻度後,指令寄存器中原來的 4bit 長的特定邏輯序列
(在 Capture-IR 狀態中捕獲的特定邏輯序列)將從 TDO 輸出來,該特定的邏輯序列可以 用來判斷操作是否正確;
同時指令寄存器將獲得從 TDI 輸入的一個 4bit 長的新指令。
Update-IR 在這個狀態中,在 Shift-IR 狀態下輸入的新指令將被用來更新指令寄存器。
說了那麼多,下面,讓我們先看看指令寄存器和資料寄存器訪問的一般過程,以便建立一個 直觀的概念。
1. 系統上電,TAP Controller 進入 Test-Logic Reset 狀態,然後依次進入:
Run-Test/Idle Select-DR-Scan Select-IR-Scan Capture-IR Shift-IR Exit1-IR Update-IR, 最後回到 Run-Test/Idle 狀態。
在 Capture-IR 狀態中,一個特定的邏輯序列被載入到 指令寄存器當中;然後進入到 Shift-IR 狀態。
在 Shift-IR 狀態下,通過 TCK 的驅動, 可以將一條特定的指令送到指令寄存器當中去。
每條指令都將確定一條相關的資料 寄存器。
然後從 Shift-IR Exit1-IR Update-IR。在 Update-IR 狀態,剛才輸入到指 令寄存器中的指令將用來更新指令寄存器。
最後,進入到 Run-Test/Idle 狀態,指令 生效,完成對指令寄存器的訪問。
2. 當前可以訪問的資料寄存器由指令寄存器中的當前指令決定。
要訪問由剛才的指令 選定的資料寄存器,需要以 Run-Test/Idle 為起點,依次進入
Select-DR-Scan Capture-DR Shift-DR Exit1-DR Update-DR,最後回到 Run-Test/Idle 狀態。
在 這個過程當中,被當前指令選定的資料寄存器會被串連在 TDI 和 TDO 之間。
通過 TDI 和 TDO,就可以將新的資料載入到資料寄存器當中去,同時,也可以捕獲資料 寄存器中的資料。
具體過程如下。在 Capture-DR 狀態中,由 TCK 的驅動,晶片管腳 上的輸出訊號會被“捕獲”到相應的邊界掃描寄存器單元中去。
這樣,當前的資料 寄存器當中就記錄了晶片相應管腳上的輸出訊號。
接下來從 Capture-DR 進入到 Shift-DR 狀態中去。
在 Shift-DR 狀態中,由 TCK 驅動,在每一個刻度內,一位 新的資料可以通過 TDI 串列輸入到資料寄存器當中去,
同時,資料寄存器可以通過 TDO 串列輸出一位先前捕獲的資料。
在經過與資料寄存器長度相同的刻度後, 就可以完成新訊號的輸入和捕獲資料的輸出。
接下來通過 Exit1-DR 狀態進入到 Update-DR 狀態。
在 Update-DR 狀態中,資料寄存器中的新資料被載入到與資料寄 存器的每個寄存器單元相連的晶片管腳上去。
最後,回到 Run-Test/Idle 狀態,完成 對資料寄存器的訪問。
上面描述的就是通過 TAP 對資料寄存器進行訪問的一般流程。
會不會還是覺得很抽象?讓我 們來看一個更直觀的例子。
現在假設,TAP Controller 現在處在 Run-Test/Idle 狀態,指令寄存 器當中已經成功的寫入了一條新的指令,該指令選定的是一條長度為 6 的邊界掃描鏈。
下面 讓我們來看看實際如何來訪問這條邊界掃描鏈。
圖 2 所示的是測試晶片及其被當前指令選定 的長度為 6 的邊界掃描鏈。
由圖 2 可以看出,當前選擇的邊界掃描鏈由 6 個邊界掃描移位寄 存器單元組成,並且被串連在 TDI 和 TDO 之間。
TCK 時鐘訊號與每個邊界掃描移位寄存器 單元相連。
每個刻度可以驅動邊界掃描鏈的資料由 TDI 到 TDO 的方向移動一位,這樣,
新的資料可以通過 TDI 輸入一位,邊界掃描鏈的資料可以通過 TDO 輸出一位。
經過 6 個時鐘 周期,就可以完全更新邊界掃描鏈裡的資料,而且可以將邊界掃描鏈裡捕獲的 6 位元據通過TDO 全部移出來。
圖 3 表示了邊界掃描鏈的訪問過程。
圖 3.1 表示了晶片和邊界掃描鏈的初始化狀態,在測試 狀態下,晶片的外部輸入和輸出被隔離開了,晶片的輸入和輸出可以通過相應的邊界掃描鏈 來觀察和控制。
在圖 3.1 中,掃描鏈裡的每個移位寄存器單元的資料是不確定的,所以在圖 中用 X 表示,整個掃描鏈裡的資料序列是 XXXXXX。
要從 TDI 輸入到測試晶片上的資料序 列是:101010. 同時要從TDO得到晶片相應管腳上的狀態。
現在TAP Controller從Run-Test/Idle 狀態經過 Select-DR-Scan 狀態進入到 Capture-DR 狀態,
在 Capture-DR 狀態當中,在一個 TCK 時鐘的驅動下,晶片管腳上的訊號狀態全部被捕獲到相應的邊界掃描移位寄存器單元當中去,
3.2 所示。從圖 3.2 中我們可以看出,在進入 Capture-DR 狀態後,
經過一個 TCK 時鐘周 期,現在掃描鏈中的資料序列變成了:111000.
在資料擷取完成以後,從 Capture-DR 狀態進 入到 Shift-DR 狀態。
在 Shift-DR 狀態中,我們將通過 6 個 TCK 刻度來把新的資料序列 (101010)通過 TDI 輸入到邊界掃描鏈當中去;
同時,將邊界掃描鏈中捕獲的資料序列 (111000)通過 TDO 輸出來。
在進入到 Shift-DR 狀態後,每經過一個 TCK 時鐘驅動,邊界 掃描鏈從 TDO 輸出一位元據;同時,從 TDI 接收一位新的資料。
圖 3.3 所示的是在 Shift-DR 狀態下,1 個 TCK 刻度後的掃描鏈的變化。
圖 3.4 所示的是在 Shift-DR 狀態下,2 個 TCK 刻度後的掃描鏈的變化。
此時,掃描鏈已經從 TDI 串列得到了兩位新資料,從 TDO 也串 行輸出了兩位元據。
在 TCK 時鐘的驅動下,這個過程一直繼續下去。
圖 3.5 所示的是在經過 6 個 TCK 刻度以後掃描鏈的情況。
從圖 3.5 中我們可以看到:邊界掃描鏈當中已經包含 了新的資料序列:101010.
在 TDO 端,經過 6 個 TCK 時鐘驅動以後,也接收到了在 Capture-DR 狀態下捕獲到的資料序列:111000.
到目前為止,雖然掃描鏈當中包含了新的資料序列: 101010,但測試晶片的管腳上的狀態還是保持為:111000.
下一步,需要更新測試晶片相應管 腳上的訊號狀態。
要實現更新,TAP Controller 從 Shift-DR 狀態,經過 Exit1-DR 狀態,進入 到 Update-DR 狀態。
在 Update-DR 狀態中,經過一個周期的 TCK 時鐘驅動,邊界掃描鏈中的 新資料序列將被載入到測試晶片的相應管腳上去, 3.6 所示。
從圖 3.6 可以看出,測試芯 片的狀態已經被更新,相應管腳上的狀態序列已經從 111000 變為 101010.
最後從 Update-DR 狀態回到 Run-Test/Idle 狀態,完成對選定的邊界掃描鏈的訪問。
在看完上面這個例子以後,對 TAP Controller 的狀態機器應該大概瞭解了吧?
對如何訪問邊界掃 描鏈應該也有個直觀的概念了吧?
雖然上面的這個例子只是說明了如何訪問邊界掃描鏈,對 其它的資料寄存器、指令寄存器的訪問過程也是類似的。
要實現對指令寄存器的訪問,不同 的 是 TAP Controller 必須經過不同的狀態序列:
Run-Test/Idle
Select-DR-Scan
Select-IR-Scan
Capture-IR
Shift-IR
Exit1-IR
Update-IR
Run-Test/Idle.
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
TWENTYONE
Oct-2004
ARM JTAG 調試原理