前言
工作時,工作任務中需要修改 U-boot 前端的程式碼,也就是 xloader (MLO),這一個部分雖然可以透過 printf() 進行除錯,但是對於某些方面還是會發生問題,使用 CCS 進行除錯可以了解暫存器的存儲、組合語言的單部執行,以利我們可以更快的找到問題點,此文章紀錄了 CCS 環境建置與建議的除錯方法進行整理
參考資料 ,若有不懂的地方可以翻這個網站參考
TI 原廠也有提供 簡體中文的使用手冊 可以查找
Outline
Download CCS
- LINK: http://processors.wiki.ti.com/index.php/Download_CCS
- 找最新版本
- 之後選擇 offline download 如圖
- download 後解壓縮,進入資料夾內部執行
./ccs_setup_linux64_7.4.0.00015.bin
- 安裝最後一步,可勾選 create desktop icon,比較方便執行
Install Sitara Series Device Support
GOTO: http://processors.wiki.ti.com/index.php/File:Bookmarks_device_support.zip
選擇最新的 Bookmark_device_support.zip 下載,下載完後解壓縮到你喜愛的路徑
- 開啟 CCSv7,執行上方工具列 Windows -> Perferences
- 點開後,左側欄位選擇 Install/Update -> Available Software Sites. -> 點擊 Import -> 選擇目標xml file
- 引入後,不要忘了點擊上方工具列 Help -> Check for Updates 應該就會跳出安裝圖示了
- 選擇 Sitara Device Support 來更新套件
若無法透過上面安裝
- 不需要載任何的 device_support 檔案,直接點擊上方列 Help -> Install New Software
- Work with 填入網址
http://software-dl.ti.com/ccs/esd/device_support_sitara
- 將全部的套件安裝好即可
- 以上設定完成
建立 Project
- 開啟 CCSv7
- 點擊 File -> New -> Import
- 選擇 C/C++ -> Existing Code as Makefile Project -> Next
- 選擇 uboot 的路徑 -> 確認後按下 Finish
- 建立完成
JTAG 設定流程
製作 JTAG .ccxml 檔案
- 將 XDS100v2 JTAG Debug tool 接到電腦上,另一端接上
- 上方工具列 File -> New -> Target Configuration File
- 看是否要修改名稱,我是直接命名成 XDS100V2.ccxml,修改完後點擊 Next
- Connection 選擇 XDS100v2 USB Debug Probe
- 若 Device Support有安裝成功,Board or Device 可選到 AM3352
- Save Configuration 點擊 Save 後 Test Connection 會跳出按鈕可以點擊
- 點擊 Test Connection 測試成功的內容可以看到
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20-----[Perform the Integrity scan-test on the JTAG IR]------------------------
This test will use blocks of 64 32-bit words.
This test will be applied just once.
Do a test using 0xFFFFFFFF.
Scan tests: 1, skipped: 0, failed: 0
Do a test using 0x00000000.
Scan tests: 2, skipped: 0, failed: 0
Do a test using 0xFE03E0E2.
Scan tests: 3, skipped: 0, failed: 0
Do a test using 0x01FC1F1D.
Scan tests: 4, skipped: 0, failed: 0
Do a test using 0x5533CCAA.
Scan tests: 5, skipped: 0, failed: 0
Do a test using 0xAACC3355.
Scan tests: 6, skipped: 0, failed: 0
All of the values were scanned correctly.
The JTAG IR Integrity scan-test has succeeded.
看到任何一個 fail 都要除錯
Connect JTAG to MT6071iE
- 之後點擊 View -> Target Configuration
選擇 User Defined -> 檔案按右鍵 -> Launch Selected Configuration
之後會跳到 debug 頁面,應該會看到以下圖片
- 選擇 Probe_0/CortexA8(Disconnected: Unknown) (通常是第2項)
- 右鍵選擇 Connect Target
- 連線完成
連線未成功通常是沒有接穩,或是剛剛的 Test Connection 沒有通過
build debug MLO
修改 ti_uboot/config.mk
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23diff --git a/config.mk b/config.mk
index b7cd481..3495099 100644
--- a/config.mk
+++ b/config.mk
@@ -60,7 +60,7 @@ PLATFORM_LDFLAGS =
#########################################################################
-HOSTCFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer \
+HOSTCFLAGS = -Wall -Wstrict-prototypes -fomit-frame-pointer \
$(HOSTCPPFLAGS)
HOSTSTRIP = strip
@@ -315,8 +315,8 @@ export CONFIG_SYS_TEXT_BASE PLATFORM_CPPFLAGS PLATFORM_RELFLAGS CPPFLAGS CFLAGS
# Allow boards to use custom optimize flags on a per dir/file basis
BCURDIR = $(subst $(SRCTREE)/,,$(CURDIR:$(obj)%=%))
-ALL_AFLAGS = $(AFLAGS) $(AFLAGS_$(BCURDIR)/$(@F)) $(AFLAGS_$(BCURDIR))
-ALL_CFLAGS = $(CFLAGS) $(CFLAGS_$(BCURDIR)/$(@F)) $(CFLAGS_$(BCURDIR))
+ALL_AFLAGS = $(AFLAGS) $(AFLAGS_$(BCURDIR)/$(@F)) $(AFLAGS_$(BCURDIR)) -g
+ALL_CFLAGS = $(CFLAGS) $(CFLAGS_$(BCURDIR)/$(@F)) $(CFLAGS_$(BCURDIR)) -g
EXTRA_CPPFLAGS = $(CPPFLAGS_$(BCURDIR)/$(@F)) $(CPPFLAGS_$(BCURDIR))
ALL_CFLAGS += $(EXTRA_CPPFLAGS)執行
./build.sh
產生執行檔可以看到產生幾個檔案
- MLO:放在 ti_uboot 或是 ti_uboot/am335x
- u-boot-spl:放在 ti_uboot/am335x/spl 是 MLO 的 symbol file 非常重要
- u-boot-spl.bin:放在 ti_uboot/am335x/spl 是 MLO 的 raw data,可用於直接 loading 到 CPU 的 mem 中
我們將會專注在 u-boot-spl.bin 以及 u-boot-spl 這兩支檔案
Load Memory (Load raw data to cpu memory)
load mem 之前,我們要先看一下 spl 執行的 start address
1
datasheet 也有給予資料可參考
- 回到 CCS,此時 JTAG 應該是處於 已連線 的狀況
- 點擊上方工具列 tool -> Load Memory
- 選擇 u-boot-spl.bin raw data -> File Type select Binary -> Next
Start Address 填入 0x402f0400 -> Finish
上面工具列 View -> Disassambly 可以看到目前的PC位置
或是查看上方的 Registers -> Core Registers -> PC (program counter)
確認無誤後,Load mem 完成
Load Symbol
- 這邊就簡單許多了,直接點擊上方 Run -> Load -> Load Symbol
- 檔案選擇
ti_uboot/am335x/spl/u-boot-spl
後按下OK即可 - 之後視窗會出現 start.S 的頁面,此時已經可以開始設定中斷點了
- Load Symbol 完成
設置中斷點
- 假設我要在其中一個指令增加中斷點的話,務必在該程式碼按下右鍵 -> Break Point (Code Composer Studio) -> Break Point
- 右上方的 Breakpoint 應該會跳出,並且Action 設定成 “Remain Halted”
- 按下 Run 的執行鈕應該就會停在該程式碼了