嵌入式Linux開發-uboot常用命令介紹(下篇)
1. 前言

這篇文章是UBOOT命令介紹的下篇,接著上篇文章介紹剩下的幾個命令用法。
主要是涉及的命令是:磁盤分區、磁盤文件加載、內核引導、二進制文件加載、跳轉命令、磁盤文件系統格式等等。
2. UBOOT命令
2.1 fatls –列出指定目錄下的文件
查看幫助:
TINY4412 # ? fatls fatls - list files in a directory (default /) 列出一個目錄文件 Usage: fatls
參數說明:
查看SD卡中的文件列表(查看之前SD需要有完好的分區才行,可以通過fdisk進行分區,從U-BOOT和內核地址之后開始分區,防止將U-BOOT和內核清除)
TINY4412 # fatls mmc 0 / Partition1: Start Address(0x71c53a), Size(0x2025c6) system volume information/ 12345/ 0 file(s), 2 dir(s) 共用兩個目錄,0個文件----進過確認正確的
查看子目錄下的文件:
TINY4412 # fatls mmc 0 /12345 Partition1: Start Address(0x71c53a), Size(0x2025c6) ./ ../ 5567/ 0 file(s), 3 dir(s)
2.2 從一個MMC文件系統(fat)中加載一個二進制文件到DDR
查看幫助:
TINY4412 # help fatload fatload - fatload - load binary file from a dos filesystem Usage: fatload
參數說明:
先將SD卡從開發板取出(開發板不要斷電),通過讀卡器插入 PC,復制一些文件到卡里,然后再重新插入開發板中
(SD卡拔出來時開發板不要斷電,目的想測試一下 mmc rescan 命令作用)。SD卡拔掉之后,UBOOT一樣可以運行,因為程序已經拷貝到DDR中運行了,只要不斷電U-BOOT就可以正常運行。
文件拷貝完將SD卡再放回開發板,先不要重新掃描 mmc 設備,直接輸入 fatls 就會出錯:
TINY4412 # fatls mmc 0 /* 打印錯誤信息,因為開發板沒有斷電,設備0是SD卡*/ count: 1 # Tx: Inverter delay / Rx: Inverter delay count: 2 ## Tx: Basic delay / Rx: Inverter delay count: 3 ## Tx: Inverter delay / Rx: Basic delay count: 4 ### Tx: Basic delay / Rx: Basic delay count: 5 # Tx: Disable / Rx: Basic delay count: 6 ## Tx: Disable / Rx: Inverter delay count: 7 ### Tx: Basic delay / Rx: Disable count: 8 ### Tx: Inverter delay / Rx: Disable mmc read failed ERROR: -19 data.dest: 0xc3cfbbdc data.blocks: 1 data.blocksize: 512 MMC_DATA_READ ** Can't read from device 0 ** ** Unable to use mmc 0:1 for fatls ** TINY4412 #
掃描設備0,再讀出信息:
TINY4412 # mmc rescan 0 掃描設備 TINY4412 # fatls mmc 0 列出設備的文件目錄 /* 成功列出了SD卡文件目錄信息*/ Partition1: Start Address(0xa203d2), Size(0x2037b2) system volume information/ 4783928 zimage 277108 u-boot.bin 127245 纇/u-boot.pdf 5268 2015-12-30txt 731729 shell, - a.pdf 5 file(s), 1 dir(s)
開始測試 fatload 命令:
TINY4412 # fatload mmc 0 48000000 zimage 將 zimage文件加載到DDR的48000000地址處 Partition1: Start Address(0xa203d2), Size(0x2037b2) reading zimage 4783928 bytes read 成功加載文件的大小(字節單位) TINY4412 # md.b 48000000 打印出DDR 48000000地址處的數據 48000000: 00 00 a0 e1 00 00 a0 e1 00 00 a0 e1 00 00 a0 e1 ................ 48000010: 00 00 a0 e1 00 00 a0 e1 00 00 a0 e1 00 00 a0 e1 ................ 48000020: 02 00 00 ea 18 28 6f 01 00 00 00 00 38 ff 48 00 .....(o.....8.H. 48000030: 01 70 a0 e1 02 80 a0 e1 00 20 0f e1 03 00 12 e3 .p....... ......
2.3 cmp --比較內存數據是否相同
查看幫助 TINY4412 # ? cmp cmp - memory compare 內存比較 Usage: cmp [.b, .w, .l] addr1 addr2 count 格式 注意:count 是用十六進制表示 cmp .b :以1個字節方式 cmp .w :以2 個字節方式 cmp .l :以4 個字節方式 格式: Cmp.b 地址1 地址2 比較數據的數量 ① 比較DRR兩個地址數據是否相等 TINY4412 # cmp.b 48000000 49000000 10 比較兩個地址數據---數量是10個 byte at 0x48000000 (0x00) != byte at 0x49000000 (0xff) Total of 0 bytes were the same 共有0字節是相同的 TINY4412 # ② 從MMC讀取1個扇區的數據到DDR的兩個地址 TINY4412 # mmc read 0 48000000 1 1 MMC read: dev # 0, block # 1, count 1 ... 1 blocks read: OK TINY4412 # mmc read 0 49000000 1 1 MMC read: dev # 0, block # 1, count 1 ... 1 blocks read: OK ③ 再次比較兩個地址的數據 TINY4412 # cmp.b 48000000 49000000 10 ( 注意:這里的10是十六進制的10 ,轉成十進制就是16) Total of 16 bytes were the same 共有16個字節都是一樣的。
2.4 mm --地址以自動增加的方式修改內存數據
查看幫助: TINY4412 # ? mm mm - memory modify (auto-incrementing address) 修改內存(增加的地址) Usage: mm [.b, .w, .l] address 格式: address要修改的地址 ① 先將DDR某處數據打印出來,方便修改完比較 TINY4412 # md.b 48000000 10 48000000: a3 69 d3 18 e9 7d b9 66 d1 6b d5 6e d4 79 a6 79 .i...}.f.k.n.y.y ② 修改數據 TINY4412 # mm.b 48000000 48000000: a3 ? 5 //把a3 修改為5 48000001: 69 ? 6 //把69 修改為6 48000002: d3 ? 7 48000003: 18 ? 8 48000004: e9 ? 不想修改直接按下<回車鍵>跳過 48000005: 7d ? 9 48000006: b9 ? TINY4412 #
2.5 cp –內存拷貝
查看幫助: TINY4412 # ? cp cp - memory copy 內存復制 Usage: 用法格式 cp [.b, .w, .l] source target count 注意這里的數量是用16進制表示的 格式:cp.b 源地址 目標地址 數量 ① 讀出DDR兩個地址的數據,方便后面比較 TINY4412 # md.b 45000000 10 顯示數據 45000000: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................ TINY4412 # md.b 49000000 10 顯示數據 49000000: a3 69 d3 18 e9 7d b9 66 d1 6b d5 6e d4 79 a6 79 .i...}.f.k.n.y.y ② 將DDR的4900000地址前10個字節拷貝到45000000地址處 TINY4412 # cp 49000000 45000000 10 ③ 將兩處地址的數據再顯示出來 TINY4412 # md.b 45000000 10 45000000: a3 69 d3 18 e9 7d b9 66 d1 6b d5 6e d4 79 a6 79 .i...}.f.k.n.y.y TINY4412 # md.b 49000000 10 49000000: a3 69 d3 18 e9 7d b9 66 d1 6b d5 6e d4 79 a6 79 .i...}.f.k.n.y.y 拷貝之后,將兩處地址數據再次比較,兩邊數據是一樣的。
2.6 loady - 使用串口下載二進制數據到內存中
U-BOOT支持的串口傳輸模式:
loadb - load binary file over serial line (kermit mode) loads - load S-Record file over serial line loady - load binary file over serial line (ymodem mode)
串口下載文件到DDR,上面是U-BOOT支持串口的3種傳輸模式。
CRT串口終端支持的協議:
查看幫助: TINY4412 # ? loady Unknown command '' - try 'help' without arguments for list of all known commands loady - load binary file over serial line (ymodem mode) 用在串行線加載二進制文件(ymodem模式) Usage: loady [ off ] [ baud ] - load binary file over serial line with offset 'off' and baudrate 'baud' 參數說明: [ off ]: DDR 內存地址, 可選。 [ baud ]:使用多快的波特率下載, 可選,不填就表示默認的115200波特率。 示例: loady 0x40000000 115200
測試loady命令:
(1)下載文件到內存
TINY4412 # loady 40000000 下載文件到DDR 40000000地址 ## Ready for binary (ymodem) download to 0x40000000 at 0 bps...
(2)對比數據內容
(3)執行代碼
上面下載的bin文件是一個按鍵的裸機程序,可以用go命令跳轉到指定地址去執行下載的代碼。
TINY4412 # go 40000000 ## Starting application at 0x40000000 ... 跳轉過去之后,按下按鍵測試! 測試結果正常,按鍵程序可以正常執行。
2.7 go–CPU 跳轉到指定的地址執行代碼
一旦 go 指令執行后, CPU 就會去執行指定地址處的代碼。
查看幫助:
TINY4412 # ? go go - start application at address 'addr' 在addr處啟動應用程序 Usage: go addr [arg ...] - start application at address 'addr' passing 'arg' as arguments 作為參數傳遞的參數
測試go命令
將SD卡第一個扇區數據讀到DDR內存中等待執行。讀8個扇區 TINY4412 # mmc read 0 45000000 1 8 MMC read: dev # 0, block # 1, count 8 ... 8 blocks read: OK 跳轉到45000000地址去執行程序 TINY4412 # go 45000000 ## Starting application at 0x45000000 ... 開始執行地址處的代碼,因為扇區1開始存放的是BL1代碼,重新執行啟動了UBOOT OK U-Boot 2010.12 (Jan 01 2016 - 02:37:55) for TINY4412 CPU: S5PC220 [Samsung SOC on SMP Platform Base on ARM CortexA9] APLL = 1400MHz, MPLL = 800MHz Board: TINY4412 DRAM: 1023 MiB ...........................................................................................................
2.8 打開關閉emmc設備引導分區
查看幫助: TINY4412 # ? emmc emmc - Open/Close eMMC boot Partition 打開/關閉emmc引導分區 Usage: emmc open
2.9 movi 子系統----從MMC向DDR讀寫數據
該指令在產品發布時需要用到,用來固化內核和UBOOT。
查看幫助:
TINY4412 # ? movi movi - movi - sd/mmc r/w sub system for SMDK board Usage: movi init - Initialize moviNAND and show card info movi read zero {fwbl1 | u-boot} {device_number} {addr} - Read data from sd/mmc 讀取數據從sd / mmc movi write zero {fwbl1 | u-boot} {device_number} {addr} - Read data from sd/mmc 讀取數據從sd / mmc movi read {u-boot | kernel} {device_number} {addr} - Read data from sd/mmc 讀取數據從sd / mmc movi write {fwbl1 | u-boot | kernel} {device_number} {addr} - Write data to sd/mmc 寫入數據到sd / mmc movi read rootfs {device_number} {addr} [bytes(hex)] - Read rootfs data from sd/mmc by size 從sd/mmc讀取rootfs數據大小 movi write rootfs {device_number} {addr} [bytes(hex)] - Write rootfs data to sd/mmc by size 寫rootfs sd/mmc的數據大小 movi read {sector#} {device_number} {bytes(hex)} {addr} - instead of this, you can use "mmc read" movi write {sector#} {device_number} {bytes(hex)} {addr} - instead of this, you can use "mmc write"
(1)把 sd 卡中 u-boot 的第一階段的 bl1 數據復制到內存,然后再寫入 emmc 對應位置
movi read fwbl1 0 40000000; //從SD(設備編號為)拷貝bl1到DDR內存地址 emmc open 1; //打開EMMC設備 movi write zero fwbl1 1 40000000; //將DDR地址處數據寫入到EMMC對應位置 emmc close 1; //關閉EMMC設備
用法示例:
TINY4412 # movi read fwbl1 0 40000000; reading FWBL1 ..device 0 Start 1, Count 16 MMC read: dev # 0, block # 1, count 16 ... 16 blocks read: OK 從SD卡第1個扇區開始讀,連續讀16個扇區 completed TINY4412 # emmc open 1; eMMC OPEN Success.!! !!!Notice!!! !You must close eMMC boot Partition after all image writing! !eMMC boot partition has continuity at image writing time.! !So, Do not close boot partition, Before, all images is written.! TINY4412 # movi write zero fwbl1 1 40000000; writing FWBL1 ..device 1 Start 0, Count 16 MMC write: dev # 1, block # 0, count 16 ... 16 blocks written: OK 從EMMC第0個扇區寫,連續寫16個扇區 completed TINY4412 # emmc close 1; eMMC CLOSE Success.!! 因為SD卡的特性,第0個扇區不能使用,數據只能從第1個扇區開始存放。 EMMC可以直接從第0個扇區存放數據。 所以-----EMMC的第0個扇區相當于SD卡的第1個扇區
(2)把sd卡中u-boot的BL2 數據復制到內存,然后再寫入 emmc 對應位置
movi read bl2 0 40000000; //從SD(設備編號為0)拷貝bl2到DDR內存地址 emmc open 1; //打開EMMC設備 movi write zero bl2 1 40000000; //將DDR地址處數據寫入到EMMC對應位置 emmc close 1; //關閉EMMC設備
示例:
TINY4412 # movi read bl2 0 40000000 reading BL2 ..device 0 Start 17, Count 32 MMC read: dev # 0, block # 17, count 32 ... 32 blocks read: OK //從SD卡的第17個扇區開始讀,連續讀32個扇區。 //查看UBOOT燒寫腳本可知,BL2是從SD卡第17扇區開始燒寫的 completed TINY4412 # emmc open 1 eMMC OPEN Success.!! !!!Notice!!! !You must close eMMC boot Partition after all image writing! !eMMC boot partition has continuity at image writing time.! !So, Do not close boot partition, Before, all images is written.! TINY4412 # movi write zero bl2 1 40000000 writing BL2 ..device 1 Start 16, Count 32 MMC write: dev # 1, block # 16, count 32 ... 32 blocks written: OK //向EMMC的第17個扇區開始寫,連續寫32個扇區。 completed TINY4412 # emmc close 1 eMMC CLOSE Success.!!
(3)把 sd 卡中 u-boot 復制到內存,然后再寫入 emmc 對應位置
movi read u-boot 0 40000000; 將SD卡的U-BOOT.Bin讀到DDR內存空間 emmc open 1; 打開EMMC設備 movi write zero u-boot 1 40000000; 將DDR的數據寫入EMMC設備 emmc close 1; 關閉EMMC
示例:
TINY4412 # movi read u-boot 0 40000000 reading bootloader..device 0 Start 49, Count 656 MMC read: dev # 0, block # 49, count 656 ... 656 blocks read: OK 從SD卡第49個扇區開始,讀取656個扇區到DDR內存 completed TINY4412 # emmc open 1 eMMC OPEN Success.!! !!!Notice!!! !You must close eMMC boot Partition after all image writing! !eMMC boot partition has continuity at image writing time.! !So, Do not close boot partition, Before, all images is written.! TINY4412 # movi write zero u-boot 1 40000000 writing bootloader..device 1 Start 48, Count 656 MMC write: dev # 1, block # 48, count 656 ... 656 blocks written: OK 向EMMC的第49個扇區,連續寫入656個扇區到DDR內存 completed TINY4412 # emmc close 1 eMMC CLOSE Success.!!
(4)把 sd 卡中 u-boot 安全加密數據復制到內存,然后再寫入 emmc 對應位置
movi read tzsw 0 40000000; 將安全加密數據拷貝到DDR emmc open 1; 打開EMMC設備 movi write zero tzsw 1 40000000; 將DDR數據寫入EMMC emmc close 1; 關閉EMMC設備
示例:
TINY4412 # movi read tzsw 0 40000000 reading 0 TrustZone S/W.. Start 705, Count 320 MMC read: dev # 0, block # 705, count 320 ... 320 blocks read: OK 從SD卡的第705個扇區開始,連續讀取320個扇區到DDR Completed 安全加密數據是從SD的705個扇區存放的 TINY4412 # emmc open 1 eMMC OPEN Success.!! !!!Notice!!! !You must close eMMC boot Partition after all image writing! !eMMC boot partition has continuity at image writing time.! !So, Do not close boot partition, Before, all images is written.! TINY4412 # movi write zero tzsw 1 40000000; writing 1 TrustZone S/W.. Start 704, Count 320 MMC write: dev # 1, block # 704, count 320 ... 320 blocks written: OK 寫入EMMC completed TINY4412 # emmc close 1 eMMC CLOSE Success.!!
(5)把 sd 卡中內核數據復制到內存,然后再寫入 emmc 對應位置
movi read kernel 0 40000000; 將SD卡的內核數據讀到DDR內存中 movi write kernel 1 40000000; 將DDR的數據寫入EMMC中
示例:
TINY4412 # movi read kernel 0 40000000 reading kernel..device 0 Start 1057, Count 12288 MMC read: dev # 0, block # 1057, count 12288 ... 12288 blocks read: OK 從SD卡1057扇區開始,連續讀12288個扇區到DDR completed TINY4412 # movi write kernel 1 40000000 writing kernel..device 1 Start 1057, Count 12288 MMC write: dev # 1, block # 1057, count 12288 ... 12288 blocks written: OK將DDR的數據寫入EMMC,從1057開始寫,連續寫12288個扇區 completed
2.10 movi 精簡命令-一鍵拷貝
將UBOOT和內核數據固化到EMMC精簡命令:
movi r f 0 40008000;emmc open 1;movi w z f 1 40008000;emmc close 1; movi r b 0 40008000;emmc open 1;movi w z b 1 40008000;emmc close 1; movi r u 0 40008000;emmc open 1;movi w z u 1 40008000;emmc close 1; movi r t 0 40008000;emmc open 1;movi w z t 1 40008000;emmc close 1; movi r k 0 40008000;movi w k 1 40008000;
2.11 bootcmd命令的使用
bootcmd命令是設置U-BOOT啟動成功后執行的命令代碼。
示例:
set bootcmd 'mmc read 0 40000000 421 1;md.b 40000000' 格式:setenv ‘ 需要執行的命令’ Save //保存設置
2.12 執行二進制文件–>bootm命令
bootm命令是用來引導經過U-Boot的工具mkimage打包后的kernel image的。
查看幫助:
TINY4412 # ? bootm bootm - boot application image from memory //bootm從內存中啟動應用程序 Usage: bootm [addr [arg ...]] - boot application image stored in memory passing arguments 'arg ...'; when booting a linux kernel, 'arg' can be the address of an initrd image //傳遞參數的參數…”;當引導linux內核,“參數”可以是映像文件的地址 Sub-commands to do part of the bootm sequence. The sub-commands must be issued in the order below (it's ok to not issue all sub-commands): start [addr [arg ...]] loados - load OS image 加載操作系統映像 cmdline - OS specific command line processing/setup 操作系統特定的命令行處理/設置 bdt - OS specific bd_t processing 操作系統特定bd_t處理 prep - OS specific prep before relocation or go go - start OS 啟動操作系統
示例:
(1)直接引導內核
TINY4412 # mmc read 0 40007fc0 421 3000 將SD卡內核讀到DDR內存空間----內核映像是從SD卡1057扇區開始存放的,連續占用了12288個扇區 (注意: 421是0x421 3000是0x3000) MMC read: dev # 0, block # 1057, count 12288 ... 12288 blocks read: OK TINY4412 # bootm 40007fc0 執行DDR--40007fc0地址處的二進制文件 Boot with zImage Starting kernel ... Uncompressing Linux... done, booting the kernel.
(2)設置UBOOT啟動成功自動引導內核
TINY4412 # setenv bootcmd 'mmc read 0 40007fc0 421 3000;bootm 40007fc0' U-BOOT啟動成功之后自動執行 TINY4412 # save 保存設置 或者使用bootcmd=movi read kernel 0 40008000;movi read rootfs 0 41000000 100000;bootm 40008000 41000000
2.13 分區命令-fdisk
查看幫助:
TINY4412 # ? fdisk fdisk - fdisk for sd/mmc. //硬盤分區工具 Usage: fdisk -p
(1)查看分區信息示例
TINY4412 # fdisk -p 0 //查看SD卡分區信息 分區 大小 扇區開始地址 扇區數量(512字節一個扇區) 分區ID名稱 partion # size(MB) block start # block count partition_Id 1 1028 7456058 2106822 0x06 4 0 28049408 441 0x00
(2)給SD卡分區示例
(分區時–會自行在SD卡開頭大約66M后的空間開始分區,因為開頭部分需要用來存放內核與U-BOOT)
TINY4412 # fdisk -c 0 320 2057 520 //給SD卡分區, -c 表示分區 fdisk is completed //提示分區完成 分區 大小 扇區開始地址 扇區數量(512字節一個扇區) 分區ID名稱 partion # size(MB) block start # block count partition_Id 1 4416 6090216 9045762 0x0C 2 320 134343 656788 0x83 3 2062 791131 4224341 0x83 4 524 5015472 1074744 0x83
2.14 指定EMMC的分區文件系統格式
U-BOOT支持格式化的文件系統格式:
fatformat- fatformat - disk format by FAT32 ext3format- ext3format - disk format by ext3 ext2format- ext2format - disk format by ext2
查看 fatformat命令使用幫助:
TINY4412 # ? fatformat fatformat - fatformat - disk format by FAT32 指定磁盤的格式位FAT32 Usage: fatformat
(1)指定分區命令-用法示例
fatformat mmc 0:1 //表示將第0個盤的第一個分區初始化為 fat ext3format mmc 0:2 //表示將第0個盤的第二個分區初始化為 ext3 ext2format mmc 0:3 //表示將第0個盤的第三個分區初始化為 ext2 ext3format mmc 0:4 //表示將第0個盤的第四個分區初始化為 ext3
(2)SD卡分區文件系統格式化完畢,將SD卡插入電腦,查看SD卡的分區信息
(3)將SD卡掛載進虛擬機,查看設備節點。
Linux 嵌入式
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。