4. Uboot的介绍¶
4.1. uboot简介¶
uboot是从FADSROM、8xxROM、PPCBOOT逐步发展演化而来的。uboot发展至今,已经可以实现非常多的功能, 在操作系统方面,它不仅支持嵌入式Linux系统的引导,还支持NetBSD,VxWorks, QNX, RTEMS, ARTOS, LynxOS, Android等嵌入式操作系统的引导。在CPU架构方面, uboot支持PowerPC、MIPS、x86、ARM、NIOS、XScale等诸多常用系列的处理器。
一般来说BootLoader必须提供系统上电时的初始化代码,在系统上电时初始化相关环境后, BootLoader需要引导完整的操作系统,然后将控制器交给操作系统。 简单来说BootLoader是一段小程序,它在系统上电时执行,通过这段小程序可以将硬件 设备进行初始化,如CPU、SDRAM、Flash、串口、网络等,初始化完毕后调用操作系统内核。
4.2. 启动uboot¶
以野火imx8m-mini版本uboot为例,介绍uboot的使用, 在开发板上电uboot启动kernel之前按下键盘的空格或回车键, 进入uboot的命令模式。如下所示
可以看出uboot打印出了板子的一些基本信息,包括CPU、内存等信息。
4.3. uboot命令¶
当不清楚uboot支持什么命令时, 可输入 help 或 ? 可查看uboot支持的命令列表,如下所示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | ? - alias for 'help'
base - print or set address offset
bdinfo - print Board Info structure
blkcache - block cache diagnostics and control
bmode - sd1|sd2|qspi1|normal|usb|sata|ecspi1:0|ecspi1:1|ecspi1:2|ecspi1:3|esdhc1|esdhc2|esdhc3|esdhc4
bmode - getprisec
boot - boot default, i.e., run 'bootcmd'
bootd - boot default, i.e., run 'bootcmd'
bootefi - Boots an EFI payload from memory
bootelf - Boot from an ELF image in memory
bootm - boot application image from memory
bootp - boot image via network using BOOTP/TFTP protocol
bootvx - Boot vxWorks from an ELF image
bootz - boot Linux zImage image from memory
clocks - display clocks
cmp - memory compare
coninfo - print console devices and information
cp - memory copy
crc32 - checksum calculation
dcache - enable or disable data cache
dhcp - boot image via network using DHCP/TFTP protocol
dm - Driver model low level access
dtfile - dtoverlay utility commands
echo - echo args to console
editenv - edit environment variable
env - environment handling commands
erase - erase FLASH memory
exit - exit script
ext2load - load binary file from a Ext2 filesystem
ext2ls - list files in a directory (default /)
ext4load - load binary file from a Ext4 filesystem
ext4ls - list files in a directory (default /)
ext4size - determine a file's size
ext4write - create a file in the root directory
false - do nothing, unsuccessfully
fatinfo - print information about filesystem
fatload - load binary file from a dos filesystem
fatls - list files in a directory (default /)
fatmkdir - create a directory
fatrm - delete a file
fatsize - determine a file's size
fatwrite - write file into a dos filesystem
fdt - flattened device tree utility commands
flinfo - print FLASH memory information
fstype - Look up a filesystem type
fstypes - List supported filesystem types
fuse - Fuse sub-system
go - start application at address 'addr'
gpio - query and control gpio pins
help - print command description/usage
i2c - I2C sub-system
icache - enable or disable instruction cache
iminfo - print header information for application image
imxtract - extract a part of a multi-image
itest - return true/false on integer compare
ln - Create a symbolic link
load - load binary file from a filesystem
loadb - load binary file over serial line (kermit mode)
loads - load S-Record file over serial line
loadx - load binary file over serial line (xmodem mode)
loady - load binary file over serial line (ymodem mode)
loop - infinite loop on address range
ls - list files in a directory (default /)
md - memory display
mm - memory modify (auto-incrementing address)
mmc - MMC sub system
mmcinfo - display MMC info
mtest - simple RAM read/write test
mw - memory write (fill)
nfs - boot image via network using NFS protocol
nm - memory modify (constant address)
panic - Panic with optional message
ping - send ICMP ECHO_REQUEST to network host
pinmux - show pin-controller muxing
printenv - print environment variables
protect - enable or disable FLASH write protection
random - fill memory with random pattern
reset - Perform RESET of the CPU
run - run commands in an environment variable
save - save file to a filesystem
saveenv - save environment variables to persistent storage
setenv - set environment variables
setexpr - set environment variable as the result of eval expression
sf - SPI flash sub-system
showvar - print local hushshell variables
size - determine a file's size
sleep - delay execution for some time
source - run script from memory
test - minimal test like /bin/sh
tftpboot - boot image via network using TFTP protocol
true - do nothing, successfully
version - print monitor, compiler and linker version
|
可看到uboot支持很多的命令,功能十分强大,与linux类似,在执行某条uboot命令时, 可使用 tab 自动补全命令,在没有命令名冲突的情况下可以使用命令的前几个字母作为命令的输入, 例如想要执行 reset 命令,输入 res 或 re 即可。
当需要具体使用哪个命令时,可使用 “help 命令” 或 “? 命令” 的方式查看具体命令的使用说明。以 “help printenv” 为例,
1 2 3 4 5 6 7 8 | => help printenv
printenv - print environment variables
Usage:
printenv [-a]
- print [all] values of all environment variables
printenv name ...
- print value of environment variable 'name'
|
可以看到printenv命令的说明以及使用方法。
关于uboot命令的使用可参考uboot官方链接: http://www.denx.de/wiki/DULG/Manual 5.9. uboot Command Line Interface 部分。
4.3.1. uboot常见命令¶
uboot命令众多,下面介绍常用的uboot命令,详细的uboot命令使用方式请使用 help [命令] 查看。
命令 |
说明 |
举例 |
---|---|---|
help |
列出当前uboot所有支持的命令 |
|
help [命令] |
查看指定命令的帮助 |
help printenv |
reset |
重启uboot |
|
printenv |
打印所有环境参数的值 |
|
printenv [环境参数名] |
查看指定的环境参数值 |
printenv bootdelay |
setenv |
设置/修改/删除环境参数的值 |
setenv bootdelay 3 |
saveenv |
保存环境参数 |
|
ping |
检测网络是否连通 |
ping 192.168.0.1 |
md |
查看内存地址上的值 |
md.b 0x80000000 10 以字节查看0x80000000后0x10个数据 |
mw |
用于修改内存地址上的值 |
mw.b 0x80000000 ff 10 以字节修改0x80000000后0x10个数据为ff |
echo |
打印信息,与linux下的echo类似 |
|
run |
在执行某条环境参数命令 |
run bootcmd,执行bootcmd |
bootz |
在内存中引导内核启动 |
|
ls |
查看文件系统中目录下的文件 |
|
load |
从文件系统中加载二进制文件到内存 |
以上为用户较为常用使用的部分命令,具体的使用方式可使用 help [命令] 查看。
4.3.2. mmc命令¶
mmc命令能够对如sd卡以及emmc类的存储介质进行操作,以下进行简单说明, 对于mmc命令不熟悉可使用 help mmc 查看相关命令的帮助,常用功能如下所示
命令 |
说明 |
---|---|
mmc list |
查看板子上mmc设备 |
mmc dev |
查看/切换当前默认mmc设备 |
mmc info |
查看当前mmc设备信息 |
mmc part |
查看当前mmc设备分区 |
mmc read |
读取当前mmc设备数据 |
mmc write |
写入当前mmc设备数据 |
mmc erase |
擦除当前mmc设备数据 |
4.3.2.1. 查看mmc设备¶
使用 mmc list 查看板子上相关设备,本人使用的是emmc版本的开发板,插入sd卡,sd卡启动。 可看到打印信息如下。
1 2 3 4 | u-boot=> mmc list
FSL_SDHC: 1 (SD)
FSL_SDHC: 2
u-boot=>
|
使用 mmc dev 1 命令切换当前设备为sd设备。
1 2 3 4 | u-boot=> mmc dev 1
Run CMD11 1.8V switch
switch to partitions #0, OK
mmc1 is current device
|
使用 mmc info 查看当前使用的sd卡设备的信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | u-boot=> mmc info
Device: FSL_SDHC
Manufacturer ID: 3
OEM: 5344
Name: SD32G
Bus Speed: 200000000
Mode: UHS SDR104 (208MHz)
Rd Block Len: 512
SD version 3.0
High Capacity: Yes
Capacity: 29.7 GiB
Bus Width: 4-bit
Erase Group Size: 512 Bytes
u-boot=>
|
使用 mmc dev 2 命令切换当前设备为emmc设备。
1 2 3 | u-boot=> mmc dev 2
switch to partitions #0, OK
mmc2(part 0) is current device
|
使用 mmc info 查看当前使用的emmc卡设备的信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | u-boot=> mmc info
Device: FSL_SDHC
Manufacturer ID: 15
OEM: 100
Name: 8GTF4
Bus Speed: 200000000
Mode: HS400ES (200MHz)
Rd Block Len: 512
MMC version 5.1
High Capacity: Yes
Capacity: 7.3 GiB
Bus Width: 8-bit DDR
Erase Group Size: 512 KiB
HC WP Group Size: 8 MiB
User Capacity: 7.3 GiB WRREL
Boot Capacity: 4 MiB ENH
RPMB Capacity: 512 KiB ENH
u-boot=>
|
4.3.2.2. 查看分区信息¶
使用 mmc part 列出当前mmc设备分区
1 2 3 4 5 6 7 8 | u-boot=> mmc part
Partition Map for MMC device 2 -- Partition Type: DOS
Part Start Sector Num Sectors UUID Type
1 20480 1024000 ab7c5ea6-01 0c
2 1228800 14041088 ab7c5ea6-02 83
u-boot=>
|
以上第1分区是boot分区,存放内核和配置文件,第2分区是文件系统分区。
4.3.2.3. mmc操作¶
可使用以下指令对mmc存储介质以block为操作单位进行读、写、擦除操作,根据上面sd的信息可知, 一个block为512字节。
1 2 3 | mmc read addr blk# cnt #读
mmc write addr blk# cnt #写
mmc erase blk# cnt #擦除
|
简单实例:将mmc设备的的前10个block读取到0x40480000地址处: mmc read 0x40480000 0 10
4.3.3. 文件系统操作命令¶
uboot能够对ext2/3/4以及fat文件系统设备进行访问, 可使用fstype命令判断存储介质分区使用的是什么类型的文件系统。 以mmc介质为例,判断emmc的boot和文件系统分区的文件系统类型
1 2 3 4 5 6 7 8 9 10 11 | #sd卡分区
=> fstype mmc 1:1
fat
=> fstype mmc 1:2
ext4
#emmc分区
=> fstype mmc 2:1
fat
=> fstype mmc 2:2
ext4
|
野火linux开发板具有U盘功能,能够通过PC以访问U盘的形式访问/boot目录下的文件, /boot目录对应的即是 mmc 1:1 / mmc 2:1 分区。
而ext4分区对应的则是Debian根文件系统。
知道了文件系统的类型即可使用相对应的命令对分区内容进行操作了。
4.3.3.1. FAT格式文件系统¶
uboot提供了能够对于FAT格式文件系统操作的各个指令, 如下所示,详细可通过 help [命令] 查看
命令 |
说明 |
---|---|
fatinfo |
打印关于文件系统的信息 |
fatls |
查看存储设备的fat分区里的内容 |
fatload |
从fat分区里读出文件到指定的内存地址 |
fatwrite |
把内存上的数据存储到fat分区的一个文件里 |
fatmkdir |
创建文件夹 |
fatrm |
删除文件 |
4.3.3.1.1. 查看文件系统信息¶
使用fatinfo查看文件系统信息,打印信息如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #sd卡分区
u-boot=> fatinfo mmc 1:1
Interface: MMC
Device 1: Vendor: Man 000003 Snr 89a98d01 Rev: 15.13 Prod: SD32G▒
Type: Removable Hard Disk
Capacity: 30448.0 MB = 29.7 GB (62357504 x 512)
Filesystem: FAT16 "BOOT "
#emmc分区
u-boot=> fatinfo mmc 2:1
Interface: MMC
Device 2: Vendor: Man 000015 Snr fe5ccef7 Rev: 0.6 Prod: 8GTF4R
Type: Removable Hard Disk
Capacity: 7456.0 MB = 7.2 GB (15269888 x 512)
Filesystem: FAT16 "NO NAME "
|
4.3.3.1.2. 查看分区下的文件目录¶
使用fatls查看分区下的文件目录,打印信息如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #sd卡分区
u-boot=> fatls mmc 1:1
38 ID.txt
kernel/
3010 uEnv.txt
boot/
34 autorun.inf
System Volume Information/
dtbs/
3 file(s), 4 dir(s)
#emmc分区
u-boot=> fatls mmc 2:1
38 ID.txt
kernel/
2915 uEnv.txt
boot/
34 autorun.inf
System Volume Information/
3 file(s), 3 dir(s)
|
若想要查看其它目录下的文件列表,只要加上文件路径即可,如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #sd卡分区
u-boot=> fatls mmc 1:1 kernel/
./
../
203188 config-5.4.47-imx8mm
5834868 System.map-5.4.47-imx8mm
31908352 vmlinuz-5.4.47-imx8mm
3 file(s), 2 dir(s)
#emmc分区
u-boot=> fatls mmc 2:1 kernel/
./
../
5837468 System.map-5.4.47-imx8mm
31582720 vmlinuz-5.4.47-imx8mm
203218 config-5.4.47-imx8mm
3 file(s), 2 dir(s)
|
4.3.3.1.3. 读取文件内容¶
使用fatload将FAT文件系统的文件加载到内存中,如下所示
1 2 3 4 5 6 7 | #sd卡
u-boot=> fatload mmc 1:1 0x43000000 uEnv.txt
3010 bytes read in 11 ms (266.6 KiB/s)
#emmc
u-boot=> fatload mmc 2:1 0x43000000 uEnv.txt
3010 bytes read in 11 ms (266.6 KiB/s)
|
可使用md命令查看c2000000内存中的部分数据内容
1 2 3 4 5 6 7 8 9 10 | u-boot=> md.b 0x43000000 0x80
43000000: 23 44 6f 63 73 3a 20 68 74 74 70 73 3a 2f 2f 64 #Docs: https://d
43000010: 6f 63 2e 65 6d 62 65 64 66 69 72 65 2e 63 6f 6d oc.embedfire.com
43000020: 2f 70 72 6f 64 75 63 74 73 2f 6c 69 6e 6b 2f 7a /products/link/z
43000030: 68 2f 6c 61 74 65 73 74 2f 6c 69 6e 75 78 2f 65 h/latest/linux/e
43000040: 62 66 5f 69 2e 6d 78 36 75 6c 6c 2e 68 74 6d 6c bf_i.mx6ull.html
43000050: 0a 0a 75 6e 61 6d 65 5f 72 3d 35 2e 34 2e 34 37 ..uname_r=5.4.47
43000060: 2d 69 6d 78 38 6d 6d 0a 23 75 75 69 64 3d 0a 6d -imx8mm.#uuid=.m
43000070: 6d 63 5f 64 74 62 3d 66 72 65 65 73 63 61 6c 65 mc_dtb=freescale
u-boot=>
|
读取到的内容就是我们日常在/boot/uEnv.txt文件中的看到的内容了。
4.3.3.1.4. FAT文件系统其他操作¶
uboot还提供了FAT文件系统的其他操作命令,可用于创建目录、写入、删除等操作, 通常情况下在uboot中需要使用这类命令的场景很少,简单介绍如下:
fatmkdir:创建目录
fatrm:删除文件
fatwrite:把内存上的数据存储到FAT分区的一个文件里
4.3.3.2. ext4格式文件系统¶
ext4文件系统的命令使用方式和FAT使用方式相似,仅命令名不同, uboot提供的ext文件系统命令如下
命令 |
说明 |
---|---|
ext4ls |
查看存储设备的ext4分区里的内容 |
ext4load |
从ext4分区里读出文件到指定的内存地址 |
ext4write |
把内存上的数据存储到ext4分区的一个文件里 |
4.3.3.2.1. ext4文件系统操作¶
下面以将/etc/apt/sources.list的内容读取到内存实例,简单说明uboot对ext4文件系统操作。
1.查看/etc/apt目录中的文件内容,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #sd卡分区
u-boot=> ext4ls mmc 1:2 /etc/apt/
<DIR> 4096 .
<DIR> 4096 ..
<DIR> 4096 sources.list.d
<DIR> 4096 auth.conf.d
<DIR> 4096 apt.conf.d
858 sources.list
<DIR> 4096 trusted.gpg.d
<DIR> 4096 preferences.d
1743 trusted.gpg
#emmc分区
u-boot=> ext4ls mmc 2:2 /etc/apt/
<DIR> 4096 .
<DIR> 4096 ..
<DIR> 4096 sources.list.d
<DIR> 4096 auth.conf.d
<DIR> 4096 apt.conf.d
858 sources.list
<DIR> 4096 trusted.gpg.d
<DIR> 4096 preferences.d
1743 trusted.gpg
|
2.将/etc/apt/sources.list 文件读取到内存地址0x43000000处
1 2 3 4 5 6 7 | #sd卡
u-boot=> ext4load mmc 1:2 0x43000000 /etc/apt/sources.list
858 bytes read in 26 ms (32.2 KiB/s)
#emmc
u-boot=> ext4load mmc 2:2 0x43000000 /etc/apt/sources.list
858 bytes read in 26 ms (32.2 KiB/s)
|
3.查看内存0x8000 0000的部分数据内存
1 2 3 4 5 6 7 8 9 10 | u-boot=> md.b 0x43000000 0x80
43000000: 64 65 62 20 68 74 74 70 3a 2f 2f 6d 69 72 72 6f deb http://mirro
43000010: 72 73 2e 62 66 73 75 2e 65 64 75 2e 63 6e 2f 64 rs.bfsu.edu.cn/d
43000020: 65 62 69 61 6e 20 62 75 6c 6c 73 65 79 65 20 6d ebian bullseye m
43000030: 61 69 6e 20 63 6f 6e 74 72 69 62 20 6e 6f 6e 2d ain contrib non-
43000040: 66 72 65 65 0a 23 64 65 62 2d 73 72 63 20 68 74 free.#deb-src ht
43000050: 74 70 3a 2f 2f 6d 69 72 72 6f 72 73 2e 62 66 73 tp://mirrors.bfs
43000060: 75 2e 65 64 75 2e 63 6e 2f 64 65 62 69 61 6e 20 u.edu.cn/debian
43000070: 62 75 6c 6c 73 65 79 65 20 6d 61 69 6e 20 63 6f bullseye main co
u-boot=>
|
4.4. uboot环境参数介绍¶
uboot中环境参数为我们提供一种不修改uboot源码的情况下, 能够修改kernel启动倒计时、ip地址、以及向内核传递不同的参数等。
在板子上使用 printenv 可查看板子上所有的环境参数, 使用 setenv 添加/修改/删除环境参数,具体说明如下所示
1 2 3 4 5 6 7 8 9 10 11 12 13 | #设置新的环境参数名为abc,值为100
=> setenv abc 100
=> echo $abc
= 100
#将值修改为200
=> setenv abc 200
=> echo $abc
200
#删除abc环境参数
=> setenv abc
=> echo $abc
|
默认情况下使用setenv命令修改环境参数重启后就会消失, 若想要掉电保存需要执行 saveenv 将环境参数保存到存储介质。
uboot上有一些官方规定的环境变量,这些环境变量在uboot有着特殊的作用, 可通过以下链接查看: https://www.denx.de/wiki/view/DULG/UBootEnvVariables
4.5. 手动引导系统启动¶
手动引导系统启动只需要将内核和设备树加载到正确位置,并进行启动即可。以下命令则是手动引导系统的全部命令,可在uboot下手动执行。
1 2 3 4 5 6 7 8 9 10 11 | #sd卡启动
run args_mmc_old
fatload mmc 1:1 0x40480000 /kernel/vmlinuz-5.4.47-imx8mm
ext4load mmc 1:2 0x43000000 /usr/lib/linux-image-5.4.47-imx8mm/freescale/imx8mm-ebf-basic.dtb
booti 0x40480000 - 0x43000000
#emmc启动
run args_mmc_old
fatload mmc 2:1 0x40480000 /kernel/vmlinuz-5.4.47-imx8mm
ext4load mmc 2:2 0x43000000 /usr/lib/linux-image-5.4.47-imx8mm/freescale/imx8mm-ebf-basic.dtb
booti 0x40480000 - 0x43000000
|
可见,只需要三条命令就可以启动系统。
1、需要加载的文件
内核:vmlinuz-5.4.47-imx8mm
设备树:imx8mm-ebf-basic.dtb
2、文件存放位置
内核:mmc设备的第1个分区,也就是mmc 1:1/mmc 2:1,kernel目录下的vmlinuz-5.4.47-imx8mm
设备树:mmc设备的第2个分区,也就是mmc 1:2/mmc 2:2,/usr/lib/linux-image-5.4.47-imx8mm/freescale/目录下的imx8mm-ebf-basic.dtb
3、 加载位置
内核:0x40480000
设备树:0x43000000