将之前自学的知识整理了一下笔记,以便回忆
信息查询命令
1、help/?:查看所支持命令
=> ? md
md - memory display
Usage:
md [.b, .w, .l] address [# of objects]
2、bdinfo:查询板子信息
=> bdinfo
arch_number = 0x00000000
boot_params = 0x80000100
DRAM bank = 0x00000000
-> start = 0x80000000
-> size = 0x20000000
eth0name = FEC1
ethaddr = b8:ae:1d:01:00:00
current eth = FEC1
ip_addr = 192.168.31.100
baudrate = 115200 bps
TLB addr = 0x9FFF0000
relocaddr = 0x9FF47000
reloc off = 0x18747000
irq_sp = 0x9EF44EA0
sp start = 0x9EF44E90
FB base = 0x00000000
3、printenv:输出环境变量信息
=> printenv
baudrate=115200
board_name=EVK
board_rev=14X14
boot_fdt=try
bootargs=comsole=tty1 console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.31.121:/home/lxz/linux/nfs/rootfs,proto=tcp rw ip=192.168.31.102:192.168.31.121:192.168.31.1:255.255.255.0::eth0:off
bootcmd=tftp 80800000 zImage;tftp 83000000 imx6ull-alientek-emmc.dtb;bootz 80800000 - 83000000
bootcmd_mfg=run mfgtool_args;bootz ${loadaddr} ${initrd_addr} ${fdt_addr};
bootdelay=3
bootscript=echo Running bootscript from mmc ...; source
console=ttymxc0
ethact=FEC1
ethaddr=b8:ae:1d:01:00:00
省略...
4、version:版本号
=> version
U-Boot 2016.03 (Oct 17 2023 - 10:40:58 +0800)
arm-linux-gnueabihf-gcc (Linaro GCC 4.9-2017.01) 4.9.4
GNU ld (Linaro_Binutils-2017.01) 2.24.0.20141017 Linaro 2014_11-3-git
环境变量命令
5、setenv:设置环境变量
=> setenv cc 123
=> printenv cc
cc=123
=>
6、saveenv:保存环境变量
=> saveenv
Saving Environment to MMC...
Writing to MMC(1)... done
内存操作命令
1、显示内存值:md
md[.b, .w, .l] address [# of objects]
md.b 80000000 14 //查看0x80000000开始的20个字节的内存值 uboot中的命令数字都是十六进制
2、修改内存值:nm
nm [.b, .w, .l] address
nm.l 80000000
=> nm.l 80000000
80000000: 0500e031 ? 修改的值
80000000: 修改的值 ? q
=>
3、自增修改指定地址的内存值:mm
4、指定数据填充内存:mw
mw [.b, .w, .l] address value [count]
=> mw.l 80000000 0A0A0A0A 10
=> md.l 80000000 10
80000000: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a
80000010: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a
80000020: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a
80000030: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a
5、数据拷贝:cp
cp [.b, .w, .l] source target count
cp.l 80000000 80000100 10
6、比较内存值是否相等:cmp
cmp [.b, .w, .l] addr1 addr2 count
=> cmp.l 80000000 80000100 10
Total of 16 word(s) were the same
=> cmp.l 80002000 80003000 10
Total of 16 word(s) were the same
=> cmp.l 80002000 80008000 10
word at 0x80002000 (0x00) != word at 0x80008000 (0xeb0049d6)
Total of 0 word(s) were the same
=>
网络操作命令
使用命令前需要先设置好uboot网络有关的环境变量,确保网络正常。
=> printenv ipaddr
ipaddr=192.168.31.100
=> printenv serverip
serverip=192.168.31.54
=> printenv ethaddr
ethaddr=b8:ae:1d:01:00:00
=> printenv gatewayip
gatewayip=192.168.31.1
=> printenv netmask
netmask=255.255.255.0
=>
1、检查网络是否正常:ping(只能在 uboot 中 ping 其他的机器,其他机器不能 ping uboot,因为 uboot 没有对 ping 命令做处理,如果用其他的机器 ping uboot 的话会失败!)
=> ping 192.168.31.54
FEC1 Waiting for PHY auto negotiation to complete... done
Using FEC1 device
host 192.168.31.54 is alive
=>
2、自动获取ip:dhcp
从路由器获取IP,如果是连接电脑则会不成功。
3、网络文件系统:nfs(Network File System)
nfs [loadAddress] [[hostIPaddr:]bootfilename]
nfs 80800000 192.168.1.253:/home/tux/nfs/zImage
4、tftp
tftpboot [loadAddress] [[hostIPaddr:]bootfilename]
tftp 80800000 zImage
EMMC/SD卡操作命令
设备操作命令头:mmc
1、mmc info :输出当前选择的mmc设备
2、mmc rescan:扫描开发板上的所有mmc设备
3、mmc list:列出所有的mmc设备
4、mmc dev:切换当前mmc设备
mmc dev [dev] [part]
5、mmc part:查看分区
EMMC 里面烧写了 Linux 系统的话,EMMC 是有 3 个分区的,第 0 个分区存放 uboot,第 1 个分区存放 Linux 镜像文件和设备树,第 2 个分区存放根文件系统。
mmc read addr blk# cnt
mmc read 80800000 600 10
=> mmc read 80800000 600 10
MMC read: dev # 1, block # 1536, count 16 ... 16 blocks read: OK
=> md.b 80800000 2000
80800000: 28 67 cf c8 62 61 75 64 72 61 74 65 3d 31 31 35 (g..baudrate=115
80800010: 32 30 30 00 62 6f 61 72 64 5f 6e 61 6d 65 3d 45 200.board_name=E
80800020: 56 4b 00 62 6f 61 72 64 5f 72 65 76 3d 31 34 58 VK.board_rev=14X
80800030: 31 34 00 62 6f 6f 74 5f 66 64 74 3d 74 72 79 00 14.boot_fdt=try.
80800040: 62 6f 6f 74 61 72 67 73 3d 63 6f 6d 73 6f 6c 65 bootargs=comsole
80800050: 3d 74 74 79 31 20 63 6f 6e 73 6f 6c 65 3d 74 74 =tty1 console=tt
省略...
6、mmc write:写数据到mmc设备
mmc write addr blk# cnt
// addr 是要写入 MMC 中的数据在 DRAM 中的起始地址,blk 是要写入 MMC 的块起始地址
(十六进制),cnt 是要写入的块大小,一个块为 512 字节。
mmc write 80800000 2 33E
//例子(1)
//先将uboot下载到DRAM
=>tftp 80800000 u-boot.imx
FEC1 Waiting for PHY auto negotiation to complete... done
Using FEC1 device
TFTP from server 192.168.31.54; our IP address is 192.168.31.100
Filename 'u-boot.imx'.
Load address: 0x80800000
Loading: #############################
2.1 MiB/s
done
Bytes transferred = 424960 (67c00 hex)
//然后写到mmc 设备对应分区里,这里写到SD卡 分区0 第二块,
mmc dev 0 0
mmc write 80800000 2 33E
424960/512 转16进制 = 33E
千万不能写 SD 卡或者 EMMC 的前两个块(扇区),里面保存着分区表!
//例子(2) 更新 EMMC 对应的 uboot
mmc dev 1 0 //切换到 EMMC 分区 0
tftp 80800000 u-boot.imx //下载 u-boot.imx 到 DRAM
mmc write 80800000 2 32E //烧写 u-boot.imx 到 EMMC 中
mmc partconf 1 1 0 0 //分区配置,EMMC 需要这一步!
千万不能写 SD 卡或者 EMMC 的前两个块(扇区),里面保存着分区表!
7、mmc erase:擦除命令
mmc erase blk# cnt
// blk 为要擦除的起始块,cnt 是要擦除的数量
FAT格式文件系统操作命令
需要在 uboot 中对 SD 卡或者 EMMC 中存储的文件进行操作,文件操作相关的命令有:fatinfo、fatls、fstype、fatload 和 fatwrite,只支持FAT格式系统。
1、fatinfo:查询指定 MMC 设备分区的文件系统信息
fatinfo <interface> [<dev[:part]>]
interface 表示接口,dev 是查询的设备号,part 是要查询的分区
fatinfo mmc 1:1
2、fatls:查询 FAT 格式设备的目录和文件信息
fatls <interface> [<dev[:part]>] [directory]
fatls mmc 1:1 //查所有文件
=>fatls mmc 1:1
6725336 zimage
36325 imx6ull-alientek-emmc.dtb
2 file(s), 0 dir(s)
3、fstype:查看 MMC 设备某个分区的文件系统格式
fstype <interface> <dev>:<part>
fstype mmc 1:0
fstype mmc 1:1
fstype mmc 1:2
=> fstype mmc 1:0
Failed to mount ext2 filesystem...
** Unrecognized filesystem type **
=> fstype mmc 1:1
fat
=> fstype mmc 1:2
ext4
=>
4、fatload:将指定的文件读取到 DRAM 中
fatload <interface> [<dev[:part]> [<addr> [<filename> [bytes [pos]]]]]
fatload mmc 1:1 80800000 zImage // EMMC 分区 1 中的 zImage 文件读取到 DRAM 中的
0X80800000 地址处
5、fatwrite:用于将 DRAM 中的数据写入到 MMC 设备中
fatwrite <interface> <dev[:part]> <addr> <filename> <bytes>
// interface 为接口,比如 mmc,dev 是设备号,part 是分区,addr 是要写入的数据在 DRAM
中的起始地址,filename 是写入的数据文件名字,bytes 表示要写入多少字节的数据。
例子:通过 fatwrite 命令在 uboot 中更新 linux 镜像文件和设备树,先将文件读取到DRAM,再从DRAM写到EMMC
1、tftp 80800000 zImage //tftp下载到DRAM
2、fatwrite mmc 1:1 80800000 zImage 6788f8 //根据uboot大小写到EMMC分区中
3、fatls mmc 1:1 //查询一下文件
EXT格式文件系统命令
uboot 支持 ext2 和 ext4 这两种格式的文件系统的操作命令,一般的命令有 ext2load、ext2ls、ext4load、ext4ls 和 ext4write。这些命令的含义和使用与 fatload、fatls 和 fatwrite 一样,只是 ext2 和 ext4 都是针对 ext 文件系统的,使用 ext4ls 就可以查询 EMMC 的分区 2 中的文件和目录。
ext4ls mmc 1:2
=> ext4ls mmc 1:2
<DIR> 4096 .
<DIR> 4096 ..
<DIR> 16384 lost+found
<DIR> 4096 bin
<DIR> 4096 dev
<DIR> 4096 drivers
<DIR> 4096 etc
<DIR> 4096 lib
<SYM> 11 linuxrc
<DIR> 4096 mnt
<DIR> 4096 proc
<DIR> 4096 root
46 rootfs
<DIR> 4096 sbin
<DIR> 4096 sys
<DIR> 4096 tmp
<DIR> 4096 usr
27766784 v
<DIR> 4096 中文测试
84 .ash_history
BOOT操作命令
uboot 的本质工作是引导 Linux,一般使用 boot(引导)命令来启动 Linux。常用的跟 boot 有关的命令有:bootz、bootm 和 boot。
1、bootz:启动 DRRM中的 zImage 镜像文件
启动 Linux,需要先将 Linux 镜像文件拷贝到 DRAM 中,如果使用到设备树的话也需要 将设备树拷贝到 DRAM 中。可以从 EMMC 或者 NAND 等存储设备中将 Linux 镜像和设备树文 件拷贝到 DRAM,也可以通过 nfs 或者 tftp 将 Linux 镜像文件和设备树文件下载到 DRAM 中。 不管用那种方法,只要能将 Linux 镜像和设备树文件存到 DRAM 中就行,然后使用 bootz 命令 来启动,bootz 命令用于启动 zImage 镜像文件。
bootz [addr [initrd[:size]] [fdt]]
// addr 是 Linux 镜像文件在 DRAM 中的位置,initrd 是 initrd 文件在
DRAM 中的地址,如果不使用 initrd 的话使用‘-’代替即可,fdt 就是设备树文件在 DRAM 中
的地址。
// 方法(1):将zImage下载到DRAM的0X80800000地址处,然后将设备树下载到 DRAM 中的 0X83000000 地址处,最后之后命令 bootz 启动
tftp 80800000 zImage
tftp 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb
bootz 80800000 - 83000000
//方法(2):使用命令 fatload 将 镜像和 设备树 从 EMMC 的分区 1 中拷贝到 DRAM 中,然后使用命令 bootz 启动
fatload mmc 1:1 80800000 zImage
fatload mmc 1:1 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb
bootz 80800000 - 83000000
2、bootm:启动 zImage 镜像文件中的uImage镜像
//不使用设备树的话启动 Linux 内核
bootm addr //addr 是 uImage 镜像在 DRAM 中的首地址
//使用设备树启动内核
bootm [addr [initrd[:size]] [fdt]] //addr 是 uImage 在 DRAM 中的首地址,initrd 是 initrd 的地址,fdt 是设备树(.dtb)文件 ,在 DRAM 中的首地址,如果 initrd 为空的话,同样是用“-”来替代
3、boot:读取环境变量 bootcmd 来启动 Linux 系统
uboot 倒计时结束以后就会启动 Linux 系统,其实就是执行的 bootcmd 中的启动 命令。
//(1)通过tftp下载到DRAM中启动
=> printenv bootcmd
bootcmd=tftp 80800000 zImage;tftp 83000000 imx6ull-alientek-emmc.dtb;bootz 80800000 - 83000000
=>
//(2)通过加载EMMC中的镜像文件到DRAM驱动
setenv bootcmd 'fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull-14x14-
emmc-7-1024x600-c.dtb; bootz 80800000 - 83000000'
注:启动 Linux 内核的时候可能会遇到如下错误
“Kernel panic – not Syncing: VFS: Unable to mount root fs on unknown-block(0,0)”
这个错误的原因是 linux 内核没有找到根文件系统,这个很正常,因为没有设置 uboot 的bootargs 环境变量,
4、go:到指定地址运行应用
go addr [arg ...]
// 使用 tftp 命令将 xxx.bin下载到开发板 DRAM 的 0X87800000(这个应用的链接首地址) 地址处
tftp 87800000 xxx.bin
go 87800000
5、run:运行环境变量中定义的命令
run bootcmd
// run 命令最大的作用在于运行我们自定义的环境变量
// 比如定义环境变量 mybootemmc 表示从 emmc 启动,
定义 mybootnet 表示从网络启动,定义 mybootnand 表示从 NAND 启动。如果要切换启动方式
的话只需要运行“run mybootxxx(xxx 为 emmc、net 或 nand)”即可。
例子:根据之前学习给出自己的板子情况
//emmc启动
setenv mybootemmc 'fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull14x14-emmc-7-1024x600-c.dtb;bootz 80800000 - 83000000'
//nand启动
setenv mybootnand 'nand read 80800000 4000000 800000;nand read 83000000 6000000
100000;bootz 80800000 - 83000000'
//网络启动
setenv mybootnet 'tftp 80800000 zImage; tftp 83000000imx6ull-14x14-emmc-7-1024x600-c.dtb;
bootz 80800000 - 83000000'
saveenv
//然后 run 对应的环境变量即可
6、mtest:开发板DDR内存读写测试
mtest [start [end [pattern [iterations]]]]
// start是要测试的DRAM 开始地址,end 是结束地址,比如我们测试 0X80000000~0X80001000
这段内存,输入“mtest 80000000 80001000”
=> mtest 80000000 80001000
Testing 80000000 ... 80001000:
Pattern FFFFFFFF Writing... Reading...Iteration: 248
=>