1. 前言
這篇文章是UBOOT命令介紹的下篇,接著上篇文章介紹剩下的幾個命令用法。
主要是涉及的命令是:磁盤分區、磁盤文件加載、內核引導、二進制文件加載、跳轉命令、磁盤文件系統格式等等。
2. UBOOT命令
2.1 fatls –列出指定目錄下的文件
查看幫助:
TINY4412 # ? fatls
fatls - list files in a directory (default /)
列出一個目錄文件
?
Usage:
fatls [directory]
?
- list files from 'dev' on 'interface' in a 'directory'
復制代碼[:part]>
參數說明:
: mmc 或 usb;
dev: 設備編號;
part: 設備分區號;
[directory]: 目錄, 是可選, 可以不寫,不寫默認 / 目錄
復制代碼
查看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 [bytes]
- load binary file 'filename' from 'dev' on 'interface'
to address 'addr' from dos filesystem
復制代碼[:part]>
參數說明:
: mmc 或 usb;
dev: 設備編號(可以通過啟動時查看或者列出存儲器);
part: 設備分區號;
: DDR 內存地址
: 要加載二進制文件( 包含完整路徑)
[bytes]:要加載數據大小,字節為單位。可選的,可以不寫, 不寫時候默認等于文件大小。
加載文件需要SD或者EMMC有完好的文件系統。
復制代碼
先將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 # 修改完直接按ctrl+c 結束
?
③再次查看數據
TINY4412 # md.b 48000000 10
48000000: 05 06 07 08 e9 09 b9 66 d1 6b d5 6e d4 79 a6 79 .......f.k.n.y.y 修改之后的數據
?
將修改之前的數據與修改之后的比較,發現已經修改成功!
其他類似命令:
mm.w:一次修改 2 字節
mm.l:一次修改 4 字節
復制代碼
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
emmc close
?
對設備讀寫操作,需要先打開,讀寫完畢,再關閉。
示例:
emmc close 1 打開設備1
emmc open 1 關閉設備1
?
emmc close 0 打開設備0
emmc open 0 關閉設備0
復制代碼
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 - print partition information //打印分區信息
fdisk -c []
- create partition //創建分區(分區單位是M)
復制代碼
(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 用法格式
- format by FAT32 on 'interface'
?
其他兩個命令,用法一樣!
復制代碼(only>
(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
+關注
關注
87文章
11292瀏覽量
209328 -
命令
+關注
關注
5文章
683瀏覽量
22011 -
Uboot
+關注
關注
4文章
125瀏覽量
28214
發布評論請先 登錄
相關推薦
評論