U-Boot移植 - 3_U-Boot 命令使用

news2024/12/29 10:13:50

文章目录

  • U-Boot 命令使用
    • 1. 信息查询命令
    • 2. 环境变量操作命令
      • 2.1 修改环境变量
      • 2.2 新建环境变量
      • 2.3 删除环境变量
    • 3. 内存操作命令
      • 3.1 md 命令
      • 3.2 nm 命令
      • 3.3 mm 命令
      • 3.4 mw 命令
      • 3.5 cp 命令
      • 3.6 cmp 命令
    • 4. 网络操作命令
      • 4.1 ping 命令
      • 4.2 dhcp 命令
      • 4.3 nfs 命令
      • 4.4 tftp 命令
    • 5. EMMC 和 SD 卡操作命令
      • 5.1 mmc info 命令
      • 5.2 mmc rescan 命令
      • 5.3 mmc list 命令
      • 5.4 mmc dev 命令
      • 5.5 mmc part 命令
      • 5.6 mmc read 命令
      • 5.7 mmc write 命令
      • 5.8 mmc erase 命令
    • 6. FAT 格式文件系统操作命令
      • 6.1 fatinfo 命令
      • 6.2 fatls 命令
      • 6.3 fstype 命令
      • 6.4 fatload 命令
      • 6.5 fatwrite
    • 7 EXT 格式文件系统操作命令
    • 8. BOOT 操作命令
      • 8.1 bootz 命令
      • 8.2 bootm 命令
      • 8.3 boot 命令
    • 9. 其他常用命令
      • 9.1 reset 命令

U-Boot 命令使用

help命令查看所有指令

输入help,然后按下回车即可查看当前 uboot 所支持的命令:

=> help
?       - alias for 'help'
base    - print or set address offset
bdinfo  - print Board Info structure
bmode   - sd1|sd2|qspi1|normal|usb|sata|ecspi1:0|ecspi1:1|ecspi1:2|ecspi1:3|esdhc1|esdhc2|esdhc3|esdhc4 [noreset]
boot    - boot default, i.e., run 'bootcmd'
bootd   - boot default, i.e., run 'bootcmd'
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
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 /)
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
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
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
mdio    - MDIO utility commands
mii     - MII utility commands
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)
ping    - send ICMP ECHO_REQUEST to network host
pmic    - PMIC
printenv- print environment variables
protect - enable or disable FLASH write protection
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
usb     - USB sub-system
usbboot - boot from USB device
version - print monitor, compiler and linker versio

这只是 uboot 的一部分命令, 具体的命令列表以实际为准。图中的命令并不是 uboot 所支持的所有命令,前面说过 uboot 是可配置的,需要什么命令就使能什么命令。所以图中的命令是正点原子提供的 uboot 中使能的命令, uboot 支持的命令还有很多,而且也可以在 uboot 中自定义命令。这些命令后面都跟有命令说明,用于描述此命令的作用,但是命令具体怎么用呢?

输入“help(或?) 命令名”既可以查看命令的详细用法,以“bootz”这个命令为例,我们输入如下命令即可查看“bootz”这个命令的用法:

? bootz 或 help bootz
=> ? bootz
bootz - boot Linux zImage image from memory

Usage:
bootz [addr [initrd[:size]] [fdt]]
    - boot Linux zImage stored in memory
        The argument 'initrd' is optional and specifies the address
        of the initrd in memory. The optional argument ':size' allows
        specifying the size of RAW initrd.
        When booting a Linux kernel which requires a flat device-tree
        a third argument is required which is the address of the
        device-tree blob. To boot that kernel without an initrd image,
        use a '-' for the second argument. If you do not pass a third
        a bd_info struct will be passed instead

1. 信息查询命令

常用的和信息查询有关的命令有3个:bdinfoprintenvversion

  • bdinfo 板子信息
=> bdinfo
arch_number = 0x00000000
boot_params = 0x80000100
DRAM bank   = 0x00000000
-> start    = 0x80000000
-> size     = 0x20000000
eth0name    = FEC1
ethaddr     = (not set)
current eth = FEC1
ip_addr     = <NULL>
baudrate    = 115200 bps
TLB addr    = 0x9FFF0000
relocaddr   = 0x9FF55000
reloc off   = 0x18755000
irq_sp      = 0x9EF52EA0
sp start    = 0x9EF52E90

从打印信息可以得出DRAM的 「起始地址和大小、启动参数保存起始地址、波特率、sp(堆栈指针)起始地址」 等信息.

  • printenv 打印环境变量
    uboot 也支持 TAB 键自动补全功能,输入“print”然后按下 TAB 键就会自动补全命令,直接输入“print”也可以。输入“print”,然后按下回车键,
=> printenv
baudrate=115200
board_name=EVK
board_rev=14X14
boot_fdt=try
bootcmd=run findfdt;mmc dev ${mmcdev};mmc dev ${mmcdev}; if mmc rescan; then if run loadbootscript; then run bootscript; else if run loadimage; then run mmcboot; else run netboot; fi; fi; else run netboot; fi
bootcmd_mfg=run mfgtool_args;bootz ${loadaddr} ${initrd_addr} ${fdt_addr};
bootdelay=1
bootscript=echo Running bootscript from mmc ...; source
console=ttymxc0
enet1=0x2
ethact=FEC1
ethprime=FEC
fdt_addr=0x83000000
fdt_file=imx6ull-14x14-emmc-4.3-480x272-c.dtb
fdt_high=0xffffffff
findfdt=if test $fdt_file = undefined; then if test $board_name = EVK && test $board_rev = 9X9; then setenv fdt_file imx6ull-9x9-evk.dtb; fi; if test $board_name = EVK && test $board_rev = 14X14; then setenv fdt_file imx6ull-14x14-evk.dtb; fi; if test $fdt_file = undefined; then echo WARNING: Could not determine dtb to use; fi; fi;
image=zImage
initrd_addr=0x83800000
initrd_high=0xffffffff
ip_dyn=yes
loadaddr=0x80800000
loadbootscript=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${script};
loadfdt=fatload mmc ${mmcdev}:${mmcpart} ${fdt_addr} ${fdt_file}
loadimage=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${image}
logo_file=alientek.bmp
mfgtool_args=setenv bootargs console=${console},${baudrate} rdinit=/linuxrc g_mass_storage.stall=0 g_mass_storage.removable=1 g_mass_storage.file=/fat g_mass_storage.ro=1 g_mass_storage.idVendor=0x066F g_mass_storage.idProduct=0x37FF g_mass_storage.iSerialNumber="" clk_ignore_unused
mmcargs=setenv bootargs console=${console},${baudrate} root=${mmcroot}
mmcautodetect=yes
mmcboot=echo Booting from mmc ...; run mmcargs; if test ${boot_fdt} = yes || test ${boot_fdt} = try; then if run loadfdt; then bootz ${loadaddr} - ${fdt_addr}; else if test ${boot_fdt} = try; then bootz; else echo WARN: Cannot load the DT; fi; fi; else bootz; fi;
mmcdev=0
mmcpart=1
mmcroot=/dev/mmcblk0p2 rootwait rw
netargs=setenv bootargs console=${console},${baudrate} root=/dev/nfs ip=dhcp nfsroot=${serverip}:${nfsroot},v3,tcp
netboot=echo Booting from net ...; run netargs; if test ${ip_dyn} = yes; then setenv get_cmd dhcp; else setenv get_cmd tftp; fi; ${get_cmd} ${image}; if test ${boot_fdt} = yes || test ${boot_fdt} = try; then if ${get_cmd} ${fdt_addr} ${fdt_file}; then bootz ${loadaddr} - ${fdt_addr}; else if test ${boot_fdt} = try; then bootz; else echo WARN: Cannot load the DT; fi; fi; else bootz; fi;
panel=ATK-LCD-4.3-480x272
script=boot.scr
splashimage=0x88000000
splashpos=m,m
stderr=serial
stdin=serial
stdout=serial

Environment size: 2595/8188 bytes

这里有很多的环境变量, 比如 「baudrate、 board_name、 board_rec、 boot_fdt、 bootcmd」 等。比如bootdelay这个环境变量就表示 uboot 启动延时时间,默认 bootdelay=3,也就默认延时 3秒。前面说的 3 秒倒计时就是由 bootdelay 定义的。另外uboot中的环境变量都是字符串。

  • version 版本信息
=> version

U-Boot 2016.03 (Jun 15 2023 - 23:09:07 +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

当前uboot 版本号为 2016.03,编译日期,编译器为arm-linux-gnueabihf-gcc。

2. 环境变量操作命令

2.1 修改环境变量

  • 命令 setenv 用于设置或者修改环境变量的值

  • 命令 saveenv 用于保存修改后的环境变量

一般环境变量是存放在外部 flash 中的,uboot 启动的时候会将环境变量从 flash 读取到 DRAM 中。所以使用命令 setenv 修改的DRAM中的环境变量值,修改以后要使用 saveenv 命令将修改后的环境变量保存到 flash 中,否则的话uboot 下一次重启会继续使用以前的环境变量值

比如要将环境变量 bootdelay 改为 5,就可以使用如下所示命令:

setenv bootdelay 5
saveenv

上述命令执行过程下

=> setenv bootdelay 5
=> saveenv
Saving Environment to MMC...
Writing to MMC(0)... done

使用命令 saveenv 保存修改后的环境变量的话会有保存过程提示信息,根据提示可以看出环境变量保存到了 MMC(0)中,也就是 SD 卡中。因为我们现在将 uboot烧写到了 SD 卡里面,所以会保存到 MMC(0)中。如果烧写到 EMMC 里面就会提示保存到MMC(1),也就是 EMMC 设备,同理,如果是 NAND 版本核心板的话就会提示保存到 NAND中。

修改 bootdelay 以后,重启开发板, uboot 就是变为 5 秒倒计时

U-Boot 2016.03 (Jun 15 2023 - 23:09:07 +0800)

CPU:   Freescale i.MX6ULL rev1.1 792 MHz (running at 396 MHz)
CPU:   Industrial temperature grade (-40C to 105C) at 42C
Reset cause: POR
Board: I.MX6U ALPHA|MINI
I2C:   ready
DRAM:  512 MiB
MMC:   FSL_SDHC: 0, FSL_SDHC: 1
In:    serial
Out:   serial
Err:   serial
switch to partitions #0, OK
mmc0 is current device
Net:   FEC1
Error: FEC1 address not set.

Normal Boot
Hit any key to stop autoboot:  5

有时候修改的环境变量值可能会有空格, 比如 bootcmd、 bootargs 等, 这个时候环境变量值就得用单引号括起来,比如下面修改环境变量 bootargs 的值:

setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
saveenv

上面命令设置 bootargs 的值为“console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw”,其中“console=ttymxc0,115200”“root=/dev/mmcblk1p2”“rootwait”“rw”相当于四组“值”,这四组“值”之间用空格隔开,所以需要使用单引号‘’将其括起来,表示这四组“值”都属于环境变量 bootargs。

2.2 新建环境变量

  • 命令 setenv 也可以用于新建命令,用法和修改环境变量一样

比如我们新建一个环境变量author, author 的值:kaka,

setenv author kaka
saveenv

使用命令 printenv 查看当前环境变量

=> printenv
author=kaka
baudrate=115200
board_name=EVK
board_rev=14X14

2.3 删除环境变量

删除环境变量也是使用命令 setenv,要删除一个环境变量只要给这个环境变量赋空值即可,比如删除掉上面新建的 author 这个环境变量,命令如下:

setenv author
saveenv

3. 内存操作命令

内存操作命令就是用于直接对 DRAM 进行读写操作 ,常用的内存操作命令有 md、 nm、mm、 mw、 cp 和 cmp 。

3.1 md 命令

md 命令用于显示内存值,格式如下:

=> help md
md - memory display

Usage:
md [.b, .w, .l] address [# of objects]
  • 命令中的[.b .w .l]对应 byte、 word 和 long,也就是分别以 1 个字节、2 个字节、4 个字节来显示内存值。

  • address 就是要查看的内存起始地址

  • [# of objects]表示要查看的数据长度,这个数据长度单位不是字节,而是跟所选择的显示格式有关。比如设置要查看的内存长度为20(十六进制为 0x14),如果显示格式为.b 的话那就表示 20 个字节;如果显示格式为.w 的话就表示 20 个 word,也就是 20x2=40 个字节;如果显示格式为.l 的话就表示 20 个 long,也就是20x4=80 个字节。

另外要注意:
uboot 命令中的数字都是十六进制的!不是十进制的!

比如想查看以 0X80000000 开始的 20 个字节的内存值,显示格式为.b 的话,应该使用如下所示命令:

md.b 80000000 14

而不是:

md.b 80000000 20  

分析下面三个命令的区别:

md.b 80000000 10
md.w 80000000 10
md.l 80000000 10
=> md.b 80000000 10
80000000: ef ea 5b f6 e7 ff ee bf 7d f7 e7 f5 af fb 9b fb    ..[.....}.......
=> md.w 80000000 10
80000000: eaef f65b ffe7 bfee f77d f5e7 fbaf fb9b    ..[.....}.......
80000010: fdfe feff fa68 ff2a fd7d 77bf feff db74    ....h.*.}..w..t.
=> md.l 80000000 10
80000000: f65beaef bfeeffe7 f5e7f77d fb9bfbaf    ..[.....}.......
80000010: fefffdfe ff2afa68 77bffd7d db74feff    ....h.*.}..w..t.
80000020: e755d7f5 fef6ffdf ffe3ff77 fefe9ffe    ..U.....w.......
80000030: dffff77f f9ef8bee fd5f5517 a2efff6f    .........U_.o...

3.2 nm 命令

nm 命令用于修改指定地址的内存值,命令格式如下:

=> help nm
nm - memory modify (constant address)

Usage:
nm [.b, .w, .l] address

nm 命令同样可以以.b、 .w 和.l 来指定操作格式,比如现在以.l 格式修改 0x80000000 地址的数据为 0x12345678。输入命令:

=> nm.l 80000000
80000000: f65beaef ? 12345678
80000000: 12345678 ? q
=>

80000000 表示现在要修改的内存地址, f65beaef表示地址 0x80000000 现在的数据,?后面就可以输入要修改后的数据0x12345678,输入完成以后按下回车,然后再输入‘q’即可退出

修改完成以后在使用命令 md 来查看一下有没有修改成功

=> md.l 80000000 1
80000000: 12345678                               xV4.

3.3 mm 命令

mm 命令也是修改指定地址内存值时候地址会自增

=> help mm
mm - memory modify (auto-incrementing address)

Usage:
mm [.b, .w, .l] address

比如以.l 格式修改从地址 0x80000000 开始的连续 3 个内存块(3*4=12个字节)的数据为 0X05050505

=> mm.l 80000000
80000000: 12345678 ? 05050505
80000004: bfeeffe7 ? 05050505
80000008: f5e7f77d ? 05050505
8000000c: fb9bfbaf ? q

//使用命令 md 查看修改后的值
=> md.l 80000000 3
80000000: 05050505 05050505 05050505             ............

3.4 mw 命令

命令 mw 用于使用一个指定的数据填充一段内存,命令格式如下:

=> help mw
mw - memory write (fill)

Usage:
mw [.b, .w, .l] address value [count]

mw 命令同样可以以.b、 .w 和.l 来指定操作格式, address 表示要填充的内存起始地址, value为要填充的数据, count 是填充的长度。

比如使用.l 格式将以 0X80000000 为起始地址的 0x10 个内存块(0x10 * 4=64 字节)填充为 0X0A0A0A0A

=> 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    ................

3.5 cp 命令

cp 是数据拷贝命令,用于将 DRAM 中的数据从一段内存拷贝到另一段内存中,或者把 NorFlash 中的数据拷贝到 DRAM 中。命令格式如下:

=> help cp
cp - memory copy

Usage:
cp [.b, .w, .l] source target count

cp 命令同样可以以.b、 .w 和.l 来指定操作格式, source 为源地址, target 为目的地址, count为拷贝的长度。

使用.l 格式将 0x80000000 处的地址拷贝到 0X80000100 处,长度为 0x10 个内存块(0x10 * 4=64 个字节)

=> md.l 80000000 10
80000000: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a    ................
80000010: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a    ................
80000020: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a    ................
80000030: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a    ................
=> md.l 80000100 10
80000100: dfd4ddff ffbeff8f f7faebfd bbeafbff    ................
80000110: fe4ddfd5 7bfeebba 7ffff7ff ffbf3feb    ..M....{.....?..
80000120: f5fffd5d eebebeee 3bfef7ed aabbeeaf    ]..........;....
80000130: f377ffb5 ffb3abbb d7f7f7ef bbbefade    ..w.............
=>
=> cp.l 80000000 80000100 10
=> md.l 80000100 10
80000100: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a    ................
80000110: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a    ................
80000120: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a    ................
80000130: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a    ................

3.6 cmp 命令

cmp 是比较命令,用于比较两段内存的数据是否相等,命令格式如下:

=> help  cmp
cmp - memory compare

Usage:
cmp [.b, .w, .l] addr1 addr2 count

cmp 命令同样可以以.b、 .w 和.l 来指定操作格式, addr1 为第一段内存首地址, addr2 为第二段内存首地址, count 为要比较的长度。

使用.l 格式来比较 0x80000000 和 0X80000100 这两个地址数据是否相等,比较长度为 0x10 个内存块(16 * 4=64 个字节)

=> cmp.l 80000000 80000100 10
Total of 16 word(s) were the same

比如地址0x80000000 和 0x800000200,长度为 0X10

=> cmp.l 80000000 80000200 10
word at 0x80000000 (0xa0a0a0a) != word at 0x80000200 (0x57f67ff7)
Total of 0 word(s) were the same

4. 网络操作命令

uboot 是支持网络的,在移植 uboot 的时候一般都要调通网络功能,因为在移植 linux kernel 的时候需要使用到 uboot 的网络功能做调试

uboot 支持大量的网络相关命令,比如 dhcp、ping、 nfs 和 tftpboot 。

在使用 uboot 的网络功能之前先用网线将开发板的 ENET2 接口和电脑或者路由器连接起来, I.MX6U-ALPHA 开发板有两个网口: ENET1 和 ENET2,要连接 ENET2。

在这里插入图片描述

建议开发板和主机 PC 都连接到同一个路由器上

环境变量描述
ipaddr开发板 ip 地址,可以不设置,使用 dhcp 命令来从路由器获取 IP 地址。
ethaddr开发板的 MAC 地址,一定要设置。
gatewayip网关地址。
netmask子网掩码。
serverip服务器 IP 地址,也就是 Ubuntu 主机 IP 地址,用于调试代码

u-boot中环境变量设置命令如下所示:

setenv ipaddr 192.168.1.50
setenv ethaddr b8:ae:1d:01:00:00
setenv gatewayip 192.168.1.1
setenv netmask 255.255.255.0
setenv serverip 192.168.1.253
saveenv

注意,网络地址环境变量的设置要根据自己的实际情况,确保 Ubuntu 主机和开发板的 IP地址在同一个网段内,比如现在的开发板和电脑都在 192.168.1.0 这个网段内,所以设置开发板的 IP 地址为 192.168.1.50,我的 Ubuntu 主机的地址为 192.168.1.253,因此 serverip 就是192.168.1.253。 ethaddr 为网络 MAC 地址,是一个 48bit 的地址,如果在同一个网段内有多个开发板的话一定要保证每个开发板的 ethaddr 是不同的,否则通信会有问题!设置好网络相关的环境变量以后就可以使用网络相关命令了。

4.1 ping 命令

开发板的网络能否使用,是否可以和服务器(Ubuntu 主机)进行通信,通过 ping 命令就可以验证,直接 ping 服务器的 IP 地址即可,比如我的服务器 IP 地址为 192.168.1.253

=> ping 192.168.1.253
FEC1 Waiting for PHY auto negotiation to complete.... done
Using FEC1 device
host 192.168.1.253 is alive

注意!只能在 uboot 中 ping 其他的机器,其他机器不能 ping uboot,因为 uboot 没有对 ping命令做处理,如果用其他的机器 ping uboot 的话会失败!

4.2 dhcp 命令

dhcp 用于从路由器获取 IP 地址,前提得开发板连接到路由器上的,如果开发板是和电脑直连的,那么 dhcp 命令就会失效。直接输入 dhcp 命令即可通过路由器获取到 IP 地址

在这里插入图片描述

开发板通过 dhcp 获取到的 IP 地址为 192.168.1.137。同时在图30.4.4.3 中可以看到“warning: no boot file name;”、“TFTP from server 192.168.1.1”这样的字样。这是因为 DHCP 不单单是获取 IP 地址,其还会通过 TFTP 来启动 linux 内核,输入“? dhcp”即可查看 dhcp 命令详细的信息

=> ? dhcp
dhcp - boot image via network using DHCP/TFTP protocol

Usage:
dhcp [loadAddress] [[hostIPaddr:]bootfilename]

4.3 nfs 命令

nfs(Network File System)网络文件系统,通过 nfs 可以在计算机之间通过网络来分享资源。

比如将 linux 镜像和设备树文件放到 Ubuntu 中,然后在 uboot 中使用 nfs 命令将 Ubuntu 中的 linux 镜像和设备树下载到开发板的 DRAM 中。这样做的目的是为了方便调试 linux 镜像和设备树,也就是网络调试。

原因是嵌入式linux开发不像单片机开发,可以直接通过 JLINK 或 STLink 等仿真器将代码直接烧写到单片机内部的 flash 中,嵌入式 Linux 通常是烧写到 EMMC、 NAND Flash、 SPI Flash 等外置 flash 中,但是嵌入式 Linux 开发也没有 MDK, IAR 这样的 IDE,更没有烧写算法,因此不可能通过点击一个“download”按钮就将固件烧写到外部 flash 中。虽然半导体厂商一般都会提供一个烧写固件的软件,但是这个软件使用起来比较复杂,这个烧写软件一般用于量产的。其远没有 MDK、 IAR的一键下载方便,在 Linux 内核调试阶段,如果用这个烧写软件的话将会非常浪费时间,而这个时候网络调试的优势就显现出来了,可以通过网络将编译好的 linux 镜像和设备树文件下载到 DRAM 中,然后就可以直接运行。  

我们一般使用 uboot 中的 nfs 命令将 Ubuntu 中的文件下载到开发板的 DRAM 中,在使用之前需要开启 Ubuntu 主机的 NFS 服务,并且要新建一个 NFS 使用的目录,以后所有要通过NFS 访问的文件都需要放到这个 NFS 目录中。我设置的/home/kaka/linux/nfs这个目录为我的 NFS 文件目录。 uboot 中的 nfs 命令格式如下所示:

=> help nfs
nfs - boot image via network using NFS protocol

Usage:
nfs [loadAddress] [[hostIPaddr:]bootfilename]

loadAddress 是要保存的 DRAM 地址, [[hostIPaddr:]bootfilename]是要下载的文件地址。

这里我们将正点原子官方编译出来的 Linux 镜像文件 zImage 下载到开发板 DRAM 的 0x80800000这个地址处。

=> nfs 80800000 192.168.1.253:/home/kaka/linux/nfs/zImage
Using FEC1 device
File transfer via NFS from server 192.168.1.253; our IP address is 192.168.1.50
Filename '/home/kaka/linux/nfs/zImage'.
Load address: 0x80800000
Loading: #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         ################################################
done
Bytes transferred = 5901752 (5a0db8 hex)

会以“#”提示下载过程,下载完成以后会提示下载的数据大小,这里下载的 6785272 字节(出厂系统在不断的更更新中,因此以实际的 zImage 大小为准),而 zImage 的大小就是 5901752字节

kaka@kaka-virtual-machine:~/linux/nfs$ ls zImage -l
-rw-rw-r-- 1 kaka kaka 5901752 9月  25  2021 zImage
kaka@kaka-virtual-machine:~/linux/nfs$ 

4.4 tftp 命令

tftp 命令的作用和 nfs 命令一样,都是用于通过网络下载东西到 DRAM 中,只是 tftp 命令使用的 TFTP 协议, Ubuntu 主机作为 TFTP 服务器。

在使用之前需要在 Ubuntu 上搭建 TFTP 服务器,并且要新建一个 TFTP 使用的目录,以后所有要通过 TFTP 访问的文件都需要放到这个 TFTP目录中。我设置的/home/kaka/linux/tftpboot这个目录为我的 TFTP 文件目录。并且要给予这些文件相应的权限。

kaka@kaka-virtual-machine:~/linux/tftpboot$ pwd
/home/kaka/linux/tftpboot
kaka@kaka-virtual-machine:~/linux/tftpboot$ ls
imx6ull-alientek-emmc.dtb  zImage

uboot 中的 tftp 命令格式如下:

=> help tftpboot
tftpboot - boot image via network using TFTP protocol

Usage:
tftpboot [loadAddress] [[hostIPaddr:]bootfilename]

看 起来 和 nfs 命令格 式一 样的 , loadAddress 是文 件在 DRAM 中的 存放 地址 ,[[hostIPaddr:]bootfilename]是要从 Ubuntu 中下载的文件。但是和 nfs 命令的区别在于, tftp 命令 不需要输入文件在 Ubuntu 中的完整路径,只需要输入文件名即可

比如现在将 tftpboot 文件夹里面的 zImage 文件下载到开发板 DRAM 的 0X80800000 地址处,命令如下

=> tftpboot 80800000 zImage
Using FEC1 device
TFTP from server 192.168.1.253; our IP address is 192.168.1.50
Filename 'zImage'.
Load address: 0x80800000
Loading: #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #########################################################
         1.9 MiB/s
done
Bytes transferred = 5604048 (5582d0 hex)

5. EMMC 和 SD 卡操作命令

uboot 支持 EMMC 和 SD 卡,因此也要提供 EMMC 和 SD 卡的操作命令。一般认为 EMMC和 SD 卡是同一个东西,uboot 中常用于操作 MMC 设备的命令为“mmc”。

mmc 有关的命令

=> help mmc
mmc - MMC sub system

Usage:
mmc info - display info of the current MMC device
mmc read addr blk# cnt
mmc write addr blk# cnt
mmc erase blk# cnt
mmc rescan
mmc part - lists available partition on current mmc device
mmc dev [dev] [part] - show or set current mmc device [partition]
mmc list - lists available devices
mmc hwpartition [args...] - does hardware partitioning
  arguments (sizes in 512-byte blocks):
    [user [enh start cnt] [wrrel {on|off}]] - sets user data area attributes
    [gp1|gp2|gp3|gp4 cnt [enh] [wrrel {on|off}]] - general purpose partition
    [check|set|complete] - mode, complete set partitioning completed
  WARNING: Partitioning is a write-once setting once it is set to complete.
  Power cycling is required to initialize partitions after set to complete.
mmc bootbus dev boot_bus_width reset_boot_bus_width boot_mode
 - Set the BOOT_BUS_WIDTH field of the specified device
mmc bootpart-resize <dev> <boot part size MB> <RPMB part size MB>
 - Change sizes of boot and RPMB partitions of specified device
mmc partconf dev boot_ack boot_partition partition_access
 - Change the bits of the PARTITION_CONFIG field of the specified device
mmc rst-function dev value
 - Change the RST_n_FUNCTION field of the specified device
   WARNING: This is a write-once field and 0 / 1 / 2 are the only valid values.
mmc setdsr <value> - set DSR register value

mmc 后面跟不同的参数可以实现不同的功能

命令描述
mmc info输出 MMC 设备信息
mmc read读取 MMC 中的数据。
mmc wirte向 MMC 设备写入数据。
mmc rescan扫描 MMC 设备。
mmc part列出 MMC 设备的分区。
mmc dev切换 MMC 设备。
mmc list列出当前有效的所有 MMC 设备。
mmc hwpartition设置 MMC 设备的分区。
mmc bootbus……设置指定 MMC 设备的 BOOT_BUS_WIDTH 域的值。
mmc bootpart……设置指定 MMC 设备的 boot 和 RPMB 分区的大小。
mmc partconf……设置指定 MMC 设备的 PARTITION_CONFG 域的值。
mmc rst复位 MMC 设备
mmc setdsr设置 DSR 寄存器的值。

5.1 mmc info 命令

mmc info 命令用于输出当前选中的 mmc info 设备的信息

=> mmc dev 1
switch to partitions #0, OK
mmc1(part 0) is current device
=>
=> mmc info
Device: FSL_SDHC
Manufacturer ID: 15
OEM: 100
Name: 8GTF4
Tran Speed: 52000000
Rd Block Len: 512
MMC version 4.0
High Capacity: Yes
Capacity: 7.3 GiB
Bus Width: 8-bit
Erase Group Size: 512 KiB

当前选中的 MMC 设备是EMMC,版本为 5.0,容量为 7.1GiB(EMMC为 8GB),速度为 52000000Hz=52MHz, 8 位宽的总线。

5.2 mmc rescan 命令

mmc rescan 命令用于扫描当前开发板上所有的 MMC 设备,包括 EMMC 和 SD 卡

5.3 mmc list 命令

mmc list 命令用于来查看当前开发板一共有几个 MMC 设备

=> mmc list
FSL_SDHC: 0 (SD)
FSL_SDHC: 1
  • 可以看出当前开发板有两个 MMC 设备: FSL_SDHC:0 和 FSL_SDHC:1 (eMMC),这是因为现在用的是 EMMC 版本的核心板,加上 SD 卡一共有两个 MMC 设备, FSL_SDHC:0 是 SD卡, FSL_SDHC:1(eMMC)是 EMMC,。

  • 默认会将 EMMC 设置为当前 MMC 设备,这就是为什么输入“mmc info”查询到的是 EMMC 设备信息,而不是 SD 卡。要想查看 SD 卡信息,就要使用命令“mmc dev”来将 SD 卡设置为当前的 MMC 设备。

5.4 mmc dev 命令

mmc dev 命令用于切换当前 MMC 设备

mmc dev [dev] [part] - show or set current mmc device [partition]

[dev]用来设置要切换的 MMC 设备号, [part]是分区号。如果不写分区号的话默认为分区 0。

使用如下命令切换到 SD 卡:

=> mmc dev 0	//切换到 SD 卡, 0 为 SD 卡, 1 为 eMMC
switch to partitions #0, OK
mmc0 is current device

=> mmc info
Device: FSL_SDHC
Manufacturer ID: 3
OEM: 5344
Name: SC16G
Tran Speed: 50000000
Rd Block Len: 512
SD version 3.0
High Capacity: Yes
Capacity: 14.8 GiB
Bus Width: 4-bit
Erase Group Size: 512 Bytes

切换到 SD 卡成功,mmc0 为当前的 MMC 设备,输入命令“mm cinfo”即可查看 SD 卡的信息

5.5 mmc part 命令

有时候 SD 卡或者 EMMC 会有多个分区,可以使用命令“mmc part”来查看其分区,比如查看 EMMC 的分区情况,输入如下命令:

mmc dev 1 //切换到 EMMC
mmc part //查看 EMMC 分区
=> mmc dev 1
switch to partitions #0, OK
mmc1(part 0) is current device

=> mmc part

Partition Map for MMC device 1  --   Partition Type: DOS

Part    Start Sector    Num Sectors     UUID            Type
  1     20480           262144          7f7f44cd-01     0c
  2     282624          14987264        7f7f44cd-02     83
  • 此时 EMMC 有两个分区, 第一个分区起始扇区为 20480,长度为 262144 个扇区; 第二个分区起始扇区为 282624,长度为 14594048 个扇区。

  • 如果 EMMC 里面烧写了 Linux 系统的话, EMMC 是有 3 个分区的,第 0 个分区存放 uboot,第 1 个分区存放Linux 镜像文件和设备树,第 2 个分区存放根文件系统

但是只有两个分区,那是因为第 0 个分区没有格式化,所以识别不出来,实际上第 0 个分区是存在的。一个新的 SD卡默认只有一个分区,那就是分区 0,所以前面的 uboot 烧写到 SD 卡,其实就是将 u-boot.bin烧写到了 SD 卡的分区 0 里面。后面学习 Linux 内核移植的时候再讲解怎么在 SD 卡中创建并格式化第二个分区,并将 Linux 镜像文件和设备树文件存放到第二个分区中。   

如果要将 EMMC 的分区 2 设置为当前 MMC 设备,可以使用如下命令:

mmc dev 1 2

5.6 mmc read 命令

mmc read 命令用于读取 mmc 设备的数据,命令格式如下:

mmc read addr blk# cnt

addr 是数据读取到 DRAM 中的地址, blk 是要读取的块起始地址(十六进制),一个块是 512字节,这里的块和扇区是一个意思,在 MMC 设备中我们通常说扇区, cnt 是要读取的块数量(十六进制)

比如从 EMMC 的第 1536(0x600)个块开始,读取 16(0x10)个块的数据到 DRAM 的0X80800000 地址处,命令如下:

mmc dev 1 0 //切换到 MMC 分区 0
mmc read 80800000 600 10 //读取数据
=> mmc dev 1 0
switch to partitions #0, OK
mmc1(part 0) is current device

=> mmc read 80800000 600 10
MMC read: dev # 1, block # 1536, count 16 ... 16 blocks read: OK

还看不出来读取是否正确,通过 md.b 命令查看 0x80800000 处的数据就行了,查看 16*512=8192(0x2000)个字节的数据

=> md.b 80800000 2000
80800000: 74 5b 05 6d 62 61 75 64 72 61 74 65 3d 31 31 35    t[.mbaudrate=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 6e 73 6f 6c 65    bootargs=console
80800050: 3d 74 74 79 6d 78 63 30 2c 31 31 35 32 30 30 20    =ttymxc0,115200
80800060: 72 6f 6f 74 3d 2f 64 65 76 2f 6e 66 73 20 6e 66    root=/dev/nfs nf
80800070: 73 72 6f 6f 74 3d 31 39 32 2e 31 36 38 2e 31 2e    sroot=192.168.1.
80800080: 32 35 33 3a 2f 68 6f 6d 65 2f 6b 61 6b 61 2f 6c    253:/home/kaka/l
80800090: 69 6e 75 78 2f 6e 66 73 2f 72 6f 6f 74 66 73 2c    inux/nfs/rootfs,
808000a0: 70 72 6f 74 6f 3d 74 63 70 20 72 77 20 69 70 3d    proto=tcp rw ip=
808000b0: 31 39 32 2e 31 36 38 2e 31 2e 35 30 3a 31 39 32    192.168.1.50:192

可以看到“baudrate=115200.board_name=EVK.board_rev=14X14.”等字样,这个就是 uboot 中的环境变量。

5.7 mmc write 命令

要将数据写到 MMC 设备里面,可以使用命令“mmc write”,格式如下

mmc write addr blk# cnt
  • addr 是要写入 MMC 中的数据在 DRAM 中的起始地址, blk 是要写入 MMC 的块起始地址(十六进制), cnt 是要写入的块大小,一个块为 512 字节。

  • 使用命令“mmc write”来升级 uboot,也就是在 uboot 中更新 uboot。这里要用到 nfs 或者 tftp 命令,通过 nfs 或者 tftp 命令将新的 u-boot.bin 下载到开发板的 DRAM 中,然后再使用命令“mmc write”将其写入到 MMC设备中

我们就来更新一下 SD 中的 uboot,先查看一下 SD 卡中的 uboot 版本号,注意编译时间,输入命令

mmc dev 0 //切换到 SD 卡
version //查看版本号

在这里插入图片描述

可以看出当前 SD 卡中的 uboot 是 2020 年 3 月 12 日 15:11:51 编译的。现在重新编译一下 uboot,然后将编译出来的 u-boot.imx(u-boot.bin 前面加了一些头文件)拷贝到 Ubuntu 中的tftpboot 目录下。最后使用 tftp 命令将其下载到 0x80800000 地址处,命令如下:

tftp 80800000 u-boot.imx

下载过程如图

在这里插入图片描述

可以看出, u-boot.imx 大小为 379904 字节, 379904/512=742,所以我们要向 SD 卡中写入742 个块,如果有小数的话就要加 1 个块。使用命令“mmc write”从 SD 卡分区 0 第 2 个块(扇区)开始烧写,一共烧写 742(0x2E6)个块,命令如下:

mmc dev 0 0
mmc write 80800000 2 2E6

烧写过程如图

在这里插入图片描述

烧写成功,重启开发板(从 SD 卡启动),重启以后再输入 version 来查看版本号

在这里插入图片描述

此时的 uboot 是 2020 年 10 月 27 号 11:44:31 编译的, 说明 uboot更新成功。这里就学会了如何在 uboot 中更新 uboot 了,如果要更新 EMMC 中的 uboot 也是一样的。

同理,如果要在 uboot 中更新 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 的前两个块(扇区),里面保存着分区表!

5.8 mmc erase 命令

如果要擦除 MMC 设备的指定块就是用命令“mmc erase”,命令格式如下:

mmc erase blk# cnt

blk 为要擦除的起始块, cnt 是要擦除的数量。

6. FAT 格式文件系统操作命令

有时候需要在 uboot 中对 SD 卡或者 EMMC 中存储的文件进行操作,这时候就要用到文件操作命令,跟文件操作相关的命令有: fatinfo、 fatls、 fstype、 fatload 和 fatwrite,但是这些文件操作命令只支持 FAT 格式的文件系统!

6.1 fatinfo 命令

fatinfo 命令用于查询指定 MMC 设备分区的文件系统信息,格式如下:

=> help fatinfo
fatinfo - print information about filesystem

Usage:
fatinfo <interface> [<dev[:part]>]
    - print information about filesystem from 'dev' on 'interface'

interface 表示接口,比如 mmc, dev 是查询的设备号, part 是要查询的分区

比如我们要查询 EMMC 分区 1 的文件系统信息,

=> fatinfo mmc 1:1
Interface:  MMC
  Device 1: Vendor: Man 000015 Snr 0b9b4f75 Rev: 0.6 Prod: 8GTF4R
            Type: Removable Hard Disk
            Capacity: 7456.0 MB = 7.2 GB (15269888 x 512)
Filesystem: FAT32 "NO NAME    "

EMMC 分区 1 的文件系统为 FAT32 格式的

6.2 fatls 命令

fatls 命令用于查询 FAT 格式设备的目录和文件信息,命令格式如下:

=> help fatls
fatls - list files in a directory (default /)

Usage:
fatls <interface> [<dev[:part]>] [directory]
    - list files from 'dev' on 'interface' in a 'directory'

interface 是要查询的接口,比如 mmc, dev 是要查询的设备号, part 是要查询的分区, directory是要查询的目录。

比如查询 EMMC 分区 1 中的所有的目录和文件,输入命令:

在这里插入图片描述

从上图可以看出, emmc 的分区 1 中存放着 8 个文件

6.3 fstype 命令

fstype 用于查看 MMC 设备某个分区的文件系统格式,命令格式如下:

=> help fstype
fstype - Look up a filesystem type

Usage:
fstype <interface> <dev>:<part>
- print filesystem type
fstype <interface> <dev>:<part> <varname>
- set environment variable to filesystem type

正点原子 EMMC 核心板上的 EMMC 默认有 3 个分区,查看一下这三个分区的文件系统格式,输入命令:fstype mmc 1:0

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
  • 分区 0 格式未知,因为分区 0 存放的 uboot,并且分区 0 没有格式化,所以文件系统格式未知。

  • 分区 1 的格式为 fat,分区 1 用于存放 linux 镜像和设备树。

  • 分区 2 的格式为 ext4,用于存放 Linux 的根文件系统(rootfs)。

6.4 fatload 命令

fatload 命令用于将指定的文件读取到 DRAM 中,命令格式如下:

=> help fatload
fatload - load binary file from a dos filesystem

Usage:
fatload <interface> [<dev[:part]> [<addr> [<filename> [bytes [pos]]]]]

interface 为接口,比如 mmc, dev 是设备号, part 是分区, addr 是保存在 DRAM 中的起始地址, filename 是要读取的文件名字。 bytes 表示读取多少字节的数据,如果 bytes 为 0 或者省略的话表示读取整个文件。 pos 是要读的文件相对于文件首地址的偏移,如果为 0 或者省略的话表示从文件首地址开始读取。

将 EMMC 分区 1 中的 zImage 文件读取到 DRAM 中的0X80800000 地址处,命令如下:

fatload mmc 1:1 80800000 zImage

在这里插入图片描述

6.5 fatwrite

fatwirte 命令用于将 DRAM 中的数据写入到 MMC 设备中,命令格式如下:

fatwrite <interface> <dev[:part]> <addr> <filename> <bytes>

interface 为接口,比如 mmc, dev 是设备号, part 是分区, addr 是要写入的数据在 DRAM中的起始地址, filename 是写入的数据文件名字, bytes 表示要写入多少字节的数据。

7 EXT 格式文件系统操作命令

uboot 有 ext2 和 ext4 这两种格式的文件系统的操作命令,常用的就四个命令,分别为:ext2load、 ext2ls、 ext4load、 ext4ls 和 ext4write。这些命令的含义和使用与 fatload、 fatls 和 fatwrite一样,只是 ext2 和 ext4 都是针对 ext 文件系统的。

比如 ext4ls 命令, EMMC 的分区 2 就是 ext4格式的,使用 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 home
<DIR>       4096 include
<DIR>       4096 lib
<SYM>         11 linuxrc
<DIR>       4096 mnt
<DIR>       4096 music
<DIR>       4096 proc
<DIR>       4096 root
<DIR>       4096 sbin
<DIR>       4096 share
<DIR>       4096 sys
<DIR>       4096 tmp
<DIR>       4096 usr
<DIR>       4096 var
<DIR>       4096 video
<DIR>       4096 get

8. BOOT 操作命令

uboot 的本质工作是引导 Linux,所以 uboot 肯定有相关的 boot(引导)命令来启动 Linux。常用的跟 boot 有关的命令有: bootz、 bootm 和 boot。

8.1 bootz 命令

  • 要启动 Linux,需要先将 Linux 镜像文件拷贝到 DRAM 中,如果使用到设备树的话也需要将设备树拷贝到 DRAM 中。

  • 可以从 EMMC 或者 NAND 等存储设备中将 Linux 镜像和设备树文件拷贝到 DRAM,也可以通过 nfs 或者 tftp 将 Linux 镜像文件和设备树文件下载到 DRAM 中。

  • 不管用那种方法,只要能将 Linux 镜像和设备树文件存到 DRAM 中就行然后使用 bootz 命令来启动, bootz 命令用于启动 zImage 镜像文件

bootz 命令格式如下:

bootz [addr [initrd[:size]] [fdt]]

命令 bootz 有三个参数, addr 是 Linux 镜像文件在 DRAM 中的位置, initrd 是 initrd 文件在DRAM 中的地址,如果不使用 initrd 的话使用‘-’代替即可, fdt 就是设备树文件在 DRAM 中的地址

使用网络来启动 Linux 系统

首先将 I.MX6U-ALPHA 开发板的 Linux 镜像和设备树发送到 Ubuntu 主机中的 tftpboot 文件夹下

kaka@kaka-virtual-machine:~/linux/tftpboot$ ls
imx6ull-alientek-emmc.dtb  zImage

使用 tftp 命令将zImage 下载到DRAM的0X80800000地址处,然后将设备树imx6ull-alientek-emmc.dtb 下载到 DRAM 中的0X83000000地址处,最后命令 bootz 启动,命令如下:

tftp 80800000 zImage
tftp 83000000 imx6ull-alientek-emmc.dtb 
bootz 80800000 - 83000000  

从 EMMC 中启动 Linux 系统

  • 需要使用命令 fatload 将 zImage 和imx6ull-alientek-emmc.dtb 从EMMC 的分区 1 中拷贝到 DRAM 中,然后使用命令 bootz 启动即可。

  • 先使用命令 fatls 查看要下 EMMC 的分区 1 中有没有 Linux 镜像文件和设备树文件,如果没有的话用 fatwrite 命令将 tftpboot 中的 zImage 和 imx6ull-alientek-emmc.dtb 文件烧写到 EMMC 的分区 1 中。然后使用命令 fatload 将 zImage 和 imx6ull-14x14-emmc-7-1024x600-c.dtb文件拷贝到 DRAM 中,地址分别为 0X80800000 和 0X83000000,最后使用 bootz 启动,命令如下:

fatload mmc 1:1 80800000 zImage
fatload mmc 1:1 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb
bootz 80800000 - 83000000

在这里插入图片描述

8.2 bootm 命令

bootmbootz 功能类似,但是 bootm 用于启动 uImage 镜像文件。如果不使用设备树的话启动 Linux 内核的命令如下:

bootm addr

addr 是 uImage 镜像在 DRAM 中的首地址。
如果要使用设备树,那么 bootm 命令和 bootz 一样,命令格式如下

bootm [addr [initrd[:size]] [fdt]]

其中 addr 是 uImage 在 DRAM 中的首地址, initrd 是 initrd 的地址, fdt 是设备树(.dtb)文件在 DRAM 中的首地址,如果 initrd 为空的话,同样是用“-”来替代。

8.3 boot 命令

boot 命令也是用来启动 Linux 系统的,只是 boot 会读取环境变量 bootcmd 来启动 Linux 系统, bootcmd 是一个很重要的环境变量

其名字分为“boot”和“cmd”,也就是“引导”和“命令”,说明这个环境变量保存着引导命令,其实就是启动的命令集合,具体的引导命令内容是可以修改的。比如我们要想使用 tftp 命令从网络启动 Linux 那么就可以设置 bootcmd 为“tftp 80800000 zImage; tftp imx6ull-alientek-emmc.dtb; bootz 80800000 - 83000000”,然后使用 saveenv 将 bootcmd 保存起来。

然后直接输入 boot 命令即可从网络启动Linux 系统,命令如下:

setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-alientek-emmc.dtb;bootz 80800000 - 83000000'
saveenv
boot

在这里插入图片描述

uboot 倒计时结束以后就会启动 Linux 系统,其实就是执行的 bootcmd 中的启动命令。只要不修改 bootcmd 中的内容,以后每次开机 uboot 倒计时结束以后都会使用 tftp 命令从网络下载 zImage 和 imx6ull-alientek-emmc.dtb,然后启动 Linux。

如果想从 EMMC 启动那就设置 bootcmd 为“fatload mmc 1:1 80800000 zImage; fatload mmc1:1 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb; bootz 80800000 - 83000000”,然后使用 boot命令启动即可,命令如下:

setenv bootcmd 'fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull-14x14-
emmc-7-1024x600-c.dtb; bootz 80800000 - 83000000'
savenev
boot

如果不修改 bootcmd 的话,每次开机 uboot 倒计时结束以后都会自动从 EMMC 里面读取zImage 和 imx6ull-14x14-emmc-7-1024x600-c.dtb,然后启动 Linux。

9. 其他常用命令

9.1 reset 命令

reset 命令顾名思义就是复位的,输入“reset”即可复位重启

=> help reset
reset - Perform RESET of the CPU

Usage:
reset

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/714496.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pinia基础使用 (vite vue3)

Pinia 概念 是 Vue 的存储库&#xff0c;它允许您跨组件/页面共享状态。 Vue官方推荐状态库 Pinia 的优点 pinia 符合直觉&#xff0c;易于学习。 pinia 是轻量级状态管理工具&#xff0c;大小只有1KB. pinia 模块化设计&#xff0c;方便拆分。 pinia 没有 mutations&#x…

Linux多进程数据交换--共享内存

个人博客地址: https://cxx001.gitee.io 基础 在linux系统开发当中&#xff0c;时常需要在多个进程之间交换数据&#xff0c;在多个进程之间交换数据&#xff0c;有很多方法&#xff0c;但最高效的方法莫过于共享内存。 linux共享内存是通过tmpfs这个文件系统来实现的&#x…

【漏洞案例】记一次aws-key泄露导致火币交易所被攻击案例

全球最大的加密货币交易所之一火币悄然修复了一个数据泄露事件&#xff0c;该泄露事件可能导致该公司的云存储被访问。火币无意中共享了一组凭证&#xff0c;授予其所有 Amazon Web Services S3 存储桶写入权限。 该公司使用 S3 存储桶来托管其 CDN 和网站。任何人都可以使用这…

shell中sed命令常用用法总结

1、sed命令匹配文本内容进行替换 #-i 可以直接在原始文本中匹配替换&#xff0c;s/匹配内容/需要替换的内容/g &#xff0c;g是以一行为全局&#xff0c;有g说明每行中匹配到的都需要替换&#xff0c;没有g说明&#xff0c;只需要替换每行中的第一个匹配到的。 sed -i s/pool …

前端 鱼骨图 elenemt ui

展示图 代码 <template><div><divclass"fishbone":style"{ height: calc((${topChiderH} ${topChiderH}) 33px) }"><div class"top-box"><divclass"flex-items"ref"topChilderen":style"…

使用预训练CNN生成图像嵌入(image embeddings)

文章目录 什么是图像嵌入&#xff1f;来自 Kaggle 的狗品种图像数据集从狗品种图像数据集生成图像嵌入参考 什么是图像嵌入&#xff1f; 图像嵌入是图像的低维表示。换句话说&#xff0c;它是图像的密集向量表示&#xff0c;可用于分类等许多任务。 例如&#xff0c;这些深度…

(0020) H5-Vue-router+Element-ui 搭建非常简单的dashboard

参考学习&#xff1a; Vue Vue-router Element-ui 搭建一个非常简单的dashboard demo demo参考&#xff1a;https://github.com/wangduanduan/vue-el-dashboard 在线预览 效果图&#xff1a; 使用到的技术&#xff1a; Vue Vue-router Element-ui webpack Normalize.css v…

final关键字 抽象类

final关键字 可以修饰类、属性、方法和局部变量【参数】。 使用场景 1、当不希望 类被继承时&#xff0c;可以用final修饰。比如不希望子类重写父类时。 2、当不希望子类重写父类的某个方法。注意&#xff1a;此时不能重写但能继承父类此方法使用。 3、当不希望类的某个属…

windows下在注册表中添加右键pycharm打开目录

1、winregedit打开注册表&#xff0c;并在shell下创建项&#xff0c;修改如下图右侧内容 2、在PyCharm下创建command项&#xff0c;并修改其内容 3、重启电脑 4、显示

比ping还好用的排障命令

遇到网络故障的时候&#xff0c;你一般会最先使用哪条命令进行排障&#xff1f; 除了Ping&#xff0c;还有Traceroute、Show、Telnet又或是Clear、Debug等等。 今天安排的&#xff0c;是Traceroute排障命令详解&#xff0c;给你分享2个经典排障案例哈。 01 Traceroute原理和功…

Cisco ISR 4000 Series IOS XE Release Dublin-17.11.1a ED

Cisco ISR 4000 Series IOS XE Release Dublin-17.11.1a ED 思科 4000 系列集成服务路由器 请访问原文链接&#xff1a;https://sysin.org/blog/cisco-isr-4000/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 思科 4000 系列…

Matlab无人机算法开发套件上新,快速实现控制算法到无人机平台的移植

在现有的旋翼无人机市场中&#xff0c;绝大部分可二次开发的产品都只提供C、C等SDK&#xff0c;但在科研类无人机这一细分领域中&#xff0c;更多的开发者偏好或善于使用Matlab进行算法的开发和验证。为了助力从事控制算法理论研究的开发者&#xff0c;能够独立完成控制算法到无…

举例说明什么是循环神经网络

循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;是一种处理时间序列数据和自然语言等具有顺序信息的数据的神经网络模型。与普通的前馈神经网络&#xff08;Feedforward Neural Network&#xff09;不同&#xff0c;RNN具有循环连接&#xff0c;使得网络能…

【Java】-【IDEA 编译项目时报错:GC overhead limit exceeded】

文章目录 问题简述问题分析解决方案解决方案一解决方案二 问题简述 以前项目启动都是好好的&#xff0c;没有任何问题&#xff0c;最近启动时却报错&#xff1a; java.lang.OutOfMemoryError: ...(此处忽略) GC overhead limit exceeded问题分析 错误是发生在编译阶段&#…

STM32单片机CAN总线汽车灯光控制系统远近光刹车双闪

实践制作DIY- GC0151---CAN总线汽车灯光控制系统 基于STM32单片机设计---CAN总线汽车灯光控制系统 二、功能介绍&#xff1a; OLED主控板&#xff1a;STM32F103C系列最小系统OLED显示3个按键&#xff08;大灯开关、大灯自动/手动、大灯近光/远光&#xff09;左转按键右转按键双…

docker学习(七)docker daemon

1.Docker 的CS模式 1.1.Docker 的C/S模式介绍 在 Docker Client 中来运行 Docker 的各种命令&#xff0c;这些命令会传送给在 Docker 的宿主机上运行的 Docker 守护进程。而 Docker 守护进程是负责实现 Docker 各种功能的。 如图所示&#xff0c;Docker 守护进程运行在宿主机…

超参数调试、Batch正则化和程序框架

1、归一化网络的激活函数&#xff08;Normalizing activations in a network &#xff09; 规范化&#xff0c;方法如下&#xff0c;减去均值再除以标准偏差&#xff0c;为了使数值稳定&#xff0c; 通常将&#x1d700;作为分母&#xff0c;以防&#x1d70e; 0的情况 &…

使用maven profile 实现一次打包多版本依赖的fat jar

基于一种特殊情况: 需要开发通用代码,但底层依赖的jar有不同版本,使用一次maven 命令编译来同时生成多个fat jar。 测试代码结构: log4j-v1/log4j-v2 有一个同名类被maintest引用。 maintest pom.xml如下 <?xml version="1.0" encoding="UTF-8"…

Docker的安装以及Docker私有仓库的搭建

Docker的安装 # 1、yum 包更新到最新 yum update # 2、安装需要的软件包&#xff0c; yum-util 提供yum-config-manager功能&#xff0c;另外两个是devicemapper驱动依赖的 yum install -y yum-utils device-mapper-persistent-data lvm2 # 3、 设置yum源 yum-config-manage…

基于QT设计的无人机地面站(摄像头录像拍摄)

一、功能需求 通过QT设计一款无人机地面站软件,需要包含基本的RTSP拉流功能,对接无人机平台的RTSP流。此外,需要完成拍照、录像、OSD叠加功能;完成按钮控制云台进行拍照、录像、变焦、指点运动等。在此基础上,完成对应的目标跟踪识别。 技术要求 (1)采用QT平台,设计W…