U-boot是一個通用的bootloader,提供了很多有用的指令,可以用於程式的調試,非常方便.但程式運行時輸出的協助資訊不是很詳細,不是很清楚,而README檔案中說得也不很詳細,下在是記錄了在調試過程中使用這些命令的一些總結,希望對初學者有所協助,有些不知道怎麼用,試了很多次,甚至仔細看了代碼才知道怎麼用的,通過本文,希望初學u-boot的朋友和使用u-boot偵錯工具的朋友學習起來更輕鬆. u-boot的指令解析有模糊比對功能,要使用某一條指令可以用任意長的前幾個字母即可,如tftpboot命令可以略寫為tftp,但必須沒有重複,否則提示沒有該指令,如saves,saveenv都是save開頭,如果去掉saves指令,即去不支援saves指令時就可以通過save指令儲存環境變數,如果u-boot中同時包含saves, saveenv指令,則發源再加長,可以使用savee命令執行saveenv bdinfo– 顯示或者設定地址位移 => help base base - print address offset for memory commands base off - set address offset for memory commands to ''''off'''' => 你可以使用base命令(簡寫為ba)來顯示或者設定一個“基地址”作為所有儲存類命令的地址位移值。預設的基址是0,所以你輸入的所有地址都是真實位址。但是,當你重複訪問某一特定儲存地區(如一些嵌入式PowerPc處理器的記憶體)時,如果設定此地區的開始地址作為基址,只需使用位移地址,這將非常簡便: => base Base Address: 0x00000000 => md 0 c 00000000: feffffff 00000000 7cbd2b78 7cdc3378 ........|.+x|.3x 00000010: 3cfb3b78 3b000000 7c0002e4 39000000 <.;x;...|...9... 00000020: 7d1043a6 3d000400 7918c3a6 3d00c000 }.C.=...y...=... => base 40000000 Base Address: 0x40000000 => md 0 c 40000000: 27051956 50504342 6f6f7420 312e312e ''''..VPPCBoot 1.1. 40000010: 3520284d 61722032 31203230 3032202d 5 (Mar 21 2002 - 40000020: 2031393a 35353a30 34290000 00000000 19:55:04)...... bdinfo => help bdinfo bdinfo - No help available. => bdinfo命令(簡寫為bdi)將在終端顯示諸如記憶體位址和大小、時鐘頻率、MAC地址等資訊。這些資訊在傳遞給Linux核心一些參數時會用到。 => bdi memstart = 0x00000000 memsize = 0x04000000 flashstart = 0x40000000 flashsize = 0x00800000 flashoffset = 0x00030000 sramstart = 0x00000000 sramsize = 0x00000000 immr_base = 0xFFF00000 bootflags = 0x00000001 intfreq = 50 MHz busfreq = 50 MHz ethaddr = 00:D0:93:00:28:81 IP addr = 10.0.0.99 baudrate = 115200 bps => coninfo 列印環境變數,無需任何參數。 => help conin coninfo => coninfo命令 (簡寫為conin) 顯示可用的控制I/O裝置資訊。 => conin List of available devices: serial 80000003 SIO stdin stdout stderr => 輸出包括了裝置名稱、標識和當前使用方式。以此為例: serial 80000003 SIO stdin stdout stderr crc32– 校正和計算 crc32(簡寫為crc)用來計算在某一範圍記憶體儲地區的CRC32校正和。 => crc 100004 3FC CRC32 for 00100004 ... 001003ff ==> d433b05b => 當後面加了3個參數時,此命令會把計算結果儲存在給定儲存地址內。 => crc 100004 3FC 100000 CRC32 for 00100004 ... 001003ff ==> d433b05b => md 100000 4 00100000: d433b05b ec3827e4 3cb0bacf 00093cf5 .3.[.8''''.<.....<. printenv 列印環境變數,無需任何參數。
Uboot> printenv
baudrate=115200
ipaddr=192.168.1.1
ethaddr=12:34:56:78:9A:BC
serverip=192.168.1.5
Environment size: 80/8188 bytes
setenv 設定新的變數,命令格式為: setenv env_var_name value env_var_name 為要改變的變數名,value為其值,中間用空格開
Uboot> setenv myboard AT91RM9200DK
Uboot> printenv
baudrate=115200
ipaddr=192.168.1.1
ethaddr=12:34:56:78:9A:BC
serverip=192.168.1.5
myboard=AT91RM9200DK
Environment size: 102/8188 bytes
saveenv 儲存變數,使用setenv命令修改了參數以後要執行此命令儲存在Flash或EEPROM中,在使用這些指令的時候可以用縮寫,即用指令的前幾個字母,只要不與其它指令重複就行,u-boot便執行匹配的指令.saveenv可以運行save亦可執行該指令. Loadb 通過串口Kermit協議下載位元據。指令格式 loadb address, address用十六進位格式,執行該指令後,可以用超級終端通過kermit協議向u-boot發送二進位檔案,即可以通過該指令將程式下載到RAM中,然後通過go指令運行下載的程式. go 跳轉指令,跳轉到目標地址執行程式,指令格式為: go address. address為程式所在地址,與loadb, tftpd等指令配合進行程式調試. Tftp 通過網路下載程式,需要先設定好網路設定
Uboot> setenv ethaddr 12:34:56:78:9A:BC
Uboot> setenv ipaddr 192.168.1.1
Uboot> setenv serverip 192.168.1.254 (tftp伺服器的地址)
下載bin檔案到地址0x20000000處。
Uboot> tftp 20000000 application.bin (application.bin應位於tftp服務程式的目錄)
Uboot> tftp 32000000 vmlinux
把server(IP=環境變數中設定的serverip)中/tftpdroot/ 下的vmlinux通過TFTP讀入到實體記憶體32000000處。
md 顯示記憶體區的內容。 mtest– 簡單地RAM測試 => help mtest mtest [start [end [pattern]]] - simple RAM read/write test => mtest提供一個簡單地儲存空間測試。 => mtest 100000 200000 Testing 00100000 ... 00200000: Pattern 0000000F Writing... Reading... mm 修改記憶體,地址自動遞增。 儲存單元修正(自動成長) => help md md [.b, .w, .l] address [# of objects] - memory display => mm提供了一種互動修改儲存空間內容的方法。它將會顯示地址和當前值,然後提示使用者輸入。如果你輸入了一個合法的十六進位數,這個新的值將會被寫入該地址。然後提示下一個地址。如果你沒有輸入任何值,只是按了一下斷行符號,那麼該地址的內容保持不變。只要你輸入任意非十六進位的資料(比如說.),此命令就立刻結束。 => mm 100000 00100000: 27051956 ? 0 00100004: 50504342 ? AABBCCDD 00100008: 6f6f7420 ? 01234567 0010000c: 312e312e ? . => md 100000 10 00100000: 00000000 aabbccdd 01234567 312e312e .........#Eg1.1. 00100010: 3520284d 61722032 31203230 3032202d 5 (Mar 21 2002 - 00100020: 2031393a 35353a30 34290000 00000000 19:55:04)...... 00100030: 00000000 00000000 00000000 00000000 ................ => 同樣,這條命令也可以加上類型標識符.l, .w 和 .b : => mm.w 100000 00100000: 0000 ? 0101 00100002: 0000 ? 0202 00100004: aabb ? 4321 00100006: ccdd ? 8765 00100008: 0123 ? . => md 100000 10 00100000: 01010202 43218765 01234567 312e312e ....C!.e.#Eg1.1. 00100010: 3520284d 61722032 31203230 3032202d 5 (Mar 21 2002 - 00100020: 2031393a 35353a30 34290000 00000000 19:55:04)...... 00100030: 00000000 00000000 00000000 00000000 ................ => => mm.b 100000 00100000: 01 ? 48 00100001: 01 ? 61 00100002: 02 ? 6c 00100003: 02 ? 6c 00100004: 43 ? 6f 00100005: 21 ? 20 00100006: 87 ? 20 00100007: 65 ? 20 00100008: 01 ? . => md 100000 10 00100000: 48616c6c 6f202020 01234567 312e312e Hallo .#Eg1.1. 00100010: 3520284d 61722032 31203230 3032202d 5 (Mar 21 2002 - 00100020: 2031393a 35353a30 34290000 00000000 19:55:04)...... 00100030: 00000000 00000000 00000000 00000000 ................ nm 修改記憶體,地址不自動遞增。 儲存單元修正(恒定地址) => help nm nm [.b, .w, .l] address - memory modify, read and keep address => nm命令用於互動地往某個相同的地址寫入不同的資料。在訪問和修改裝置寄存器的時候,這將會非常有用。 => nm.b 100000 00100000: 00 ? 48 00100000: 48 ? 61 00100000: 61 ? 6c 00100000: 6c ? 6c 00100000: 6c ? 6f 00100000: 6f ? . => md 100000 8 00100000: 6f000000 115511ff ffffffff ffff1155 o....U.........U 00100010: 00000000 00000000 00000015 00000016 ................ Mw 用模型填充記憶體 mw 32000000 ff 10000(把記憶體0x32000000開始的0x10000位元組設為0xFF) => help mw mw [.b, .w, .l] address value [count] - write memory => mw是一種往儲存空間填寫某些資料的方法。如果調用時沒加計數參數,值將僅僅被寫到某一給定的地址。當使用了計數參數時,整個儲存地區都會寫入該值。 => md 100000 10 00100000: 0000000f 00000010 00000011 00000012 ................ 00100010: 00000013 00000014 00000015 00000016 ................ 00100020: 00000017 00000018 00000019 0000001a ................ 00100030: 0000001b 0000001c 0000001d 0000001e ................ => mw 100000 aabbccdd => md 100000 10 00100000: aabbccdd 00000010 00000011 00000012 ................ 00100010: 00000013 00000014 00000015 00000016 ................ 00100020: 00000017 00000018 00000019 0000001a ................ 00100030: 0000001b 0000001c 0000001d 0000001e ................ => mw 100000 0 6 => md 100000 10 00100000: 00000000 00000000 00000000 00000000 ................ 00100010: 00000000 00000000 00000015 00000016 ................ 00100020: 00000017 00000018 00000019 0000001a ................ 00100030: 0000001b 0000001c 0000001d 0000001e ................ => 它又是一條可以加標識符.l, .w和.b的命令: => mw.w 100004 1155 6 => md 100000 10 00100000: 00000000 11551155 11551155 11551155 .....U.U.U.U.U.U 00100010: 00000000 00000000 00000015 00000016 ................ 00100020: 00000017 00000018 00000019 0000001a ................ 00100030: 0000001b 0000001c 0000001d 0000001e ................ => mw.b 100007 ff 7 => md 100000 10 00100000: 00000000 115511ff ffffffff ffff1155 .....U.........U 00100010: 00000000 00000000 00000015 00000016 ................ 00100020: 00000017 00000018 00000019 0000001a ................ 00100030: 0000001b 0000001c 0000001d 0000001e ................ => Cp 拷貝一塊記憶體到另一塊 => help cp cp [.b, .w, .l] source target count - copy memory => cp用來複製儲存單元。 => cp 40000000 100000 10000 => cp 可以使用類型標識符 .l , .w和.b。 md– 顯示儲存單元內容 => help md md [.b, .w, .l] address [# of objects] - memory display => md採用十六進位和ASCII碼兩種形式來顯示儲存單元的內容。 => md 100000 00100000: 27051956 50504342 6f6f7420 312e312e ''''..VPPCBoot 1.1. 00100010: 3520284d 61722032 31203230 3032202d 5 (Mar 21 2002 - 00100020: 2031393a 35353a30 34290000 00000000 19:55:04)...... 00100030: 00000000 00000000 00000000 00000000 ................ 00100040: 00000000 00000000 00000000 00000000 ................ 00100050: 00000000 00000000 00000000 00000000 ................ 00100060: 00000000 00000000 00000000 00000000 ................ 00100070: 00000000 00000000 00000000 00000000 ................ 00100080: 00000000 00000000 00000000 00000000 ................ 00100090: 00000000 00000000 00000000 00000000 ................ 001000a0: 00000000 00000000 00000000 00000000 ................ 001000b0: 00000000 00000000 00000000 00000000 ................ 001000c0: 00000000 00000000 00000000 00000000 ................ 001000d0: 00000000 00000000 00000000 00000000 ................ 001000e0: 00000000 00000000 00000000 00000000 |