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文章
11219浏览量
208872 -
命令
+关注
关注
5文章
678浏览量
21981 -
Uboot
+关注
关注
4文章
125浏览量
28157
发布评论请先 登录
相关推荐
评论