1. 程式人生 > >十二、u-boot 調試--串口修改

十二、u-boot 調試--串口修改

串口 進入 inf 內存 sum 打開 斷點 fig art

  uboot 燒寫進 norflash 進行調試

12.1 燒寫後 串口不使能

  內存不能使能

  遍歷代碼,可以發現,在SDRAM 初始化之前,我們並沒有設置時鐘,但是SDRAM初始化後,我們已經開始用內存控制器了,這是不合理的,操作器件之前,我們必須把時鐘給初始化。

  在源代碼中,內存控制器初始化之前,並沒有進行時鐘的設置。加上時鐘的設置。

  內存控制器的時鐘 為MPLL,我們要把 MPLL 的初始化放入到 start.S 中進行初始化,取消board_init_f 執行的鏈表 init_sequence_f 的 board_early_init_f 函數中對MPLL 的設置即可。

  源代碼的時鐘的設置在 board_init_f 執行的鏈表 init_sequence_f 的 board_early_init_f 函數中,我們要把這些代碼移動到 _start.S 中執行,在內存控制器初始化之前。

  還有就是必須關閉掉 終端的 靜態顯示:配置宏為CONFIG_CONSOLE_RECORD

12.1.1 修改 start.S 中的代碼

  技術分享圖片

12.1.2 註釋掉 jz2440.c 對MPLL 的設置

  board_early_init_f 中

  技術分享圖片

12.1.3 編譯燒寫

  技術分享圖片

12.2 調試方法

  打開 openjtag 工具:

  技術分享圖片

  點擊 connect,然後點擊 telnet,進入 telent 中運行:

  reset halt,

  技術分享圖片

  halt

  技術分享圖片

  讀寫前 4個 字節 ,與 uboot.bin 的二進制進行對比:

  技術分享圖片  

  uboot.bin 中的字節:

  技術分享圖片

  可以看出讀取的數據是正確的。

  從 step 0 開始執行,一步一步 查看數據是否正確:

  技術分享圖片

  這樣運行很慢,我們也可以將 uboot 文件進行 objdump 轉碼成 uboot.dis 文件,然後設置斷點。

  在 board_init_f_alloc_reserve 這裏設置斷點,因為執行完了內存控制器初始化後,就開始執行此函數:

  uboot.dis 文件中的地址:

  技術分享圖片

  技術分享圖片

  我們在 0008444 那裏設置一個硬件斷點:

  技術分享圖片

  然後 resume 繼續執行:

  技術分享圖片

  可以看出在 0x00008444 處暫停了,此時 內存已經初始化完了,應該是可以訪問內存的。

  讀內存:mdw 0x30000000

  技術分享圖片

  寫內存:mww 0x30000000 0x12345678,寫完之後讀取內存 mdw 0x30000000

  技術分享圖片

12.1.2

  技術分享圖片

    

  

十二、u-boot 調試--串口修改