十二、u-boot 調試--串口修改
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 調試--串口修改