AM335X U-Boot SPL 的 CCS 環境建置與除錯方法整理

Imgur

前言

工作時,工作任務中需要修改 U-boot 前端的程式碼,也就是 xloader (MLO),這一個部分雖然可以透過 printf() 進行除錯,但是對於某些方面還是會發生問題,使用 CCS 進行除錯可以了解暫存器的存儲、組合語言的單部執行,以利我們可以更快的找到問題點,此文章紀錄了 CCS 環境建置與建議的除錯方法進行整理

參考資料 ,若有不懂的地方可以翻這個網站參考

TI 原廠也有提供 簡體中文的使用手冊 可以查找


Outline


Download CCS

  • LINK: http://processors.wiki.ti.com/index.php/Download_CCS
  • 找最新版本
  • 之後選擇 offline download 如圖
    Imgur
  • download 後解壓縮,進入資料夾內部執行
    ./ccs_setup_linux64_7.4.0.00015.bin
  • 安裝最後一步,可勾選 create desktop icon,比較方便執行

Install Sitara Series Device Support

Imgur

  • 引入後,不要忘了點擊上方工具列 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
    23
    diff --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
    #define CONFIG_SPL_TEXT_BASE            0x402F0400
  • 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 的執行鈕應該就會停在該程式碼了