查看当前支持命令

1
2
--help
?

执行log如下:

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

uboot#?
? - alias for 'help'
base - print or set address offset
bdinfo - print Board Info structure
bootelf - Boot from an ELF image in memory
booti - boot arm64 Linux Image image from 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
cdp - Perform CDP network configuration
cmp - memory compare
cp - memory copy
crc32 - checksum calculation
ddr_info- ddr training info molchip soc
dhcp - boot image via network using DHCP/TFTP protocol
dm - Driver model low level access
dns - lookup the IP of a hostname
dump_efuse- Dump the content of the efuses
dump_osc- get FREQosc of the ring osc
echo - echo args to console
efuse_write- write the content of the efuses
env - environment handling commands
ethsw - Ethernet l2 switch commands
fdt - flattened device tree utility commands
go - start application at address 'addr'
gunzip - gunzip *.gz file
hash - hash_test molchip soc
help - print command description/usage
iminfo - print header information for application image
linklocal- acquire a network IP address using the link-local protocol
loop - infinite loop on address range
mc_mmc_dl_invalid- invalid dll
mc_mmc_dl_scan- scan corrected mmc delay line settings mmc_dl_test + mode + way + step + addr + sector + len
md - memory display
mdio - MDIO utility commands
mii - MII utility commands
mm - memory modify (auto-incrementing address)
mmc - MMC sub system
mmc_dl - scan corrected mmc delay line settings
mmc_dl_cmd_rx- scan corrected mmc delay line cmd rx dll
mmcinfo - display MMC info
mw - memory write (fill)
nand - NAND sub-system
nboot - boot from NAND device
nfs - boot image via network using NFS protocol
nm - memory modify (constant address)
pci - list and access PCI Configuration Space
ping - send ICMP ECHO_REQUEST to network host
printenv- print environment variables
pxe - commands to get and boot from pxe files
rarpboot- boot image via network using RARP/TFTP protocol
reboot - reboot molchip soc
reset - Perform RESET of the CPU
rsa_test- rsa_test molchip soc
run - run commands in an environment variable
saveenv - save environment variables to persistent storage
setenv - set environment variables
sf - SPI flash sub-system
sntp - synchronize RTC via network
source - run script from memory
sysboot - command to get and boot from syslinux files
tftpboot- boot image via network using TFTP protocol
tftpput - TFTP put command, for uploading files to a server
tftpsrv - act as a TFTP server and boot the first received file
version - print monitor, compiler and linker version
write_osc- write the byp select of the ring osc

信息查询

bdinfo

  • 命令用于查看开发板信息

image-20250428172954760

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
1. arch_number = 0x00000000
作用:表示架构编号。
值:0x00000000,通常表示默认或未设置的架构编号。
2. boot_params = 0x00000000
作用:表示启动参数的地址。
值:0x00000000,通常表示未设置或默认的启动参数地址。
3. DRAM bank = 0x00000000
作用:表示DRAM(动态随机存取存储器)银行的编号。
值:0x00000000,通常表示第一个DRAM银行。
4. -> start = 0x140000000
作用:表示DRAM的起始地址。
值:0x140000000,即4GB的起始地址。
5. -> size = 0x80000000
作用:表示DRAM的大小。
值:0x80000000,即128MB。
6. baudrate = 115200 bps
作用:表示串行端口的波特率。
值:115200,即每秒115200位。
7. TLB addr = 0x1BFFF0000
作用:表示TLB(Translation Lookaside Buffer,转换后备缓冲器)的地址。
值:0x1BFFF0000,这是一个特定的内存地址。
8. relocaddr = 0x1BFA8B000
作用:表示重定位地址。
值:0x1BFA8B000,这是代码和数据在内存中的新位置。
9. reloc off = 0x2E48B000
作用:表示重定位偏移量。
值:0x2E48B000,这是从原始位置到新位置的偏移量。
10. irq_sp = 0x1BFA591D0
作用:表示中断堆栈指针的地址。
值:0x1BFA591D0,这是一个特定的内存地址。
11. sp start = 0x1BFA591D0
作用:表示堆栈指针的起始地址。
值:0x1BFA591D0,这是一个特定的内存地址。
12. Early malloc usage: 1d0 / 8000
作用:表示早期动态内存分配的使用情况。
值:1d0 / 8000,表示已经使用了0x1D0字节,总大小为0x8000字节。
13. fdt_blob = 00000001bfa591e0
作用:表示设备树二进制(FDT)blob的地址。
值:0x00000001bfa591e0,这是一个特定的内存地址。

printenv

打印环境变量

image-20250428173009044

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
1. arch=arm
作用:指定架构类型。
值:arm,表示使用ARM架构。
2. baudrate=115200
作用:指定串行端口的波特率。
值:115200,即每秒115200位。
3. board=molchip
作用:指定板子的名称。
值:molchip,表示使用的板子是molchip。
4. board_name=molchip
作用:指定板子的名称(重复定义)。
值:molchip,表示使用的板子是molchip。
5. bootcmd=mmc read 0x140000000 0x0 0x10000;mmc read 0x142000000 0x10000 0x200;booti 0x140000000 - 0x142000000;
作用:定义启动命令。
值:
mmc read 0x140000000 0x0 0x10000:从MMC/SD卡的起始位置(块0)读取16384个块(0x10000)到地址0x140000000。
mmc read 0x142000000 0x10000 0x200:从MMC/SD卡的第65536个块(0x10000)读取512个块(0x200)到地址0x142000000。
booti 0x140000000 - 0x142000000:使用加载到0x140000000的内核和加载到0x142000000的设备树(DTB)启动系统。
6. bootdelay=10
作用:指定启动延迟时间。
值:10,表示启动加载器在自动启动前等待10秒,以便用户可以中断启动过程并进入命令行模式。
7. cpu=armv8
作用:指定CPU架构版本。
值:armv8,表示使用ARMv8架构。
8. fdtcontroladdr=1bfa591e0
作用:指定设备树控制地址。
值:0x1bfa591e0,这是一个特定的内存地址,用于存储设备树控制信息。
9. soc=molchip
作用:指定系统-on-chip(SoC)的名称。
值:molchip,表示使用的SoC是molchip。
10. stderr=uart@0x18200000
作用:指定标准错误输出的设备。
值:uart@0x18200000,表示标准错误输出使用地址为0x18200000的UART设备。
11. stdin=uart@0x18200000
作用:指定标准输入的设备。
值:uart@0x18200000,表示标准输入使用地址为0x18200000的UART设备。
12. stdout=uart@0x18200000
作用:指定标准输出的设备。
值:uart@0x18200000,表示标准输出使用地址为0x18200000的UART设备

version

image-20250428173019701

环境变量

setenv

修改env到ram

setenv bootargs ‘mem=mem_total earlycon console=ttyS0,115200 root=/dev/mmcblk0p3 rootfstype=ext2 rw init=/linuxrc blkdevparts=mmcblk0:32M(kernel),128M(rootfs),2048M(app)’

1
setenv bootargs 'mem=mem_total earlycon console=ttyS0,115200 root=/dev/mmcblk0p3  rootfstype=ext2 rw init=/linuxrc  blkdevparts=mmcblk0:32M(kernel),128M(dtb),2048M(rootfs)'

删除环境变量

1
setenv bootargs 'mem=mem_total earlycon console=ttyS0,115200 root=/dev/mmcblk0p3 rootfstype=ext2 rw blkdevparts=mmcblk0:32M(kernel),128M(dtb),2048M(rootfs),4096M(userdata)'

setenv bootcmd ‘mmc read 0x140000000 0x0 0x10000;mmc read 0x142000000 0x10000 0x200;booti 0x140000000 - 0x142000000;’

1
setenv bootargs 'mem=mem_total earlycon console=ttyS0,115200 root=/dev/mmcblk0p3 rootfstype=ext2 rw  rootwait blkdevparts=mmcblk0:32M(kernel),128M(dtb),2048M(rootfs),4096M(userdata)'

setenv author

saveenv

用于保存env到flash

内存操作

md 命令

1
md[.b, .w, .l] address [# of objects]

也就是分别以 1 个字节、 2 个字节、 4 个字节来显示内存值。 address 就是要查看的内存起始地址, [# of objects]表示要查看的数据长度,这个数据长度单位不是字节,而是跟你所选择的显示格式有关。比如你设置要查看的内存长度问为 20(十六进制为 0x14),如果显示格式为.b 的话那就表示 20 个字节;如果显示格式为.w 的话就表示 20 个 word,也就是 202=40 个字节;如果显示格式为.l 的话就表示 20 个 long,也就是 204=80 个字节。

1
2
3
md.b 80000000 10
md.w 80000000 10
md.l 80000000 10

image-20250428173036083

nm命令

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

1
nm [.b, .w, .l] address

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

mm

mm 命令也是修改指定地址内存值的,使用 mm 修改内存值的时候地址会自增,而使用命令 nm 的话地址不会自增。比如以.l 格式修改从地址 0x80000000 开始的连续 4个内存块(4*4=12个字节)的数据为 0X05050505,操作如图 所示:

mw 命令

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

1
mw [.b, .w, .l] address value [count]

mw 命令同样可以以.b、 .w 和.l 来指定操作格式, address 表示要填充的内存起始地址, value为要填充的数据, count 是填充的长度。比如使用.l 格式将以 0X80000000 为起始地址的 0x10 个内存块(0x10 * 4=64 字节)填充为 0X0A0A0A0A,命令如下:

1
mw.l 80000000 0A0A0A0A 10

**cp **

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

1
cp [.b, .w, .l] source target count

cp 命令同样可以以.b、 .w 和.l 来指定操作格式, source 为源地址, target 为目的地址, count为拷贝的长度。我们使用.l 格式将 0x80000000 处的地址拷贝到 0X80000100 处,长度为 0x10 个内存块(0x10 * 4=64 个字节),命令如下所示:

1
cp.l 80000000 80000100 10

image-20250428173112871

cmp 命令

1
cmp [.b, .w, .l] addr1 addr2 count

cmp 命令同样可以以.b、 .w 和.l 来指定操作格式, addr1 为第一段内存首地址, addr2 为第二段内存首地址, count 为要比较的长度。我们使用.l 格式来比较 0x80000100 和 0X80000200 这两个地址数据是否相等,比较长度为 0x10 个内存块(16 * 4=64 个字节),命令如下所示:

1
cmp.l 80000100 80000200 10

image-20250428173133062

网络操作

uboot 是支持网络的,我们在移植 uboot 的时候一般都要调通网络功能,因为在移植 linux kernel 的时候需要使用到 uboot 的网络功能做调试。uboot 支持大量的网络相关命令,比如 dhcp、ping、 nfs 和 tftpboot等。

image-20250428173137228

ping 命令

1
2
ping 192.168.1.117

dhcp命令

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

nfs命令

nfs 也就是网络**文件系统,通过 nfs 可以在计算机之间通过网络来分享资源**,比如我们将linux 镜像和设备树文件放到 Ubuntu 中,然后在 uboot 中使用 nfs 命令将 Ubuntu 中的 linux 镜像和设备树下载到开发板的 DRAM 中。

   我们一般使用 uboot 中的 nfs 命令将 Ubuntu 中的文件下载到开发板的 DRAM 中,在使用之前需要开启 Ubuntu 主机的 NFS 服务,并且要新建一个 NFS 使用的目录,以后所有要通过NFS 访问的文件都需要放到这个 NFS 目录中。准备好以后就可以使用 nfs 命令来将 zImage 下载到开发板 DRAM 的 0X80800000 地址处,命令如下:
1
nfs 80800000 192.168.1.105:/home/wanli/linux/nfs/zImage

命 令 中 的 “ 80800000 ” 表 示 zImage 保 存 地 址 ,“

192.168.1.105:/home/zuozhongkai/linux/nfs/zImage”表示 zImage 在 192.168.1.250 这个主机中,路径为

home/wanli/linux/nfs/zImage

image-20250428173231748

ftp命令

tftp 命令的作用和 nfs 命令一样,都是用于通过网络下载东西到 DRAM 中,只是 tftp 命令使用的 TFTP 协议, Ubuntu 主机作为 TFTP 服务器。因此需要在 Ubuntu 上搭建 TFTP 服务器,需要安装 tftp-hpa 和 tftpd-hpa,命令如下:

1
sudo apt-get install tftp-hpa tftpd-hpa 
1
2
mkdir /home/wanli/linux/tftpboot
chmod 777 /home/wanli/linux/tftpboot

最后配置 tftp,打开文件安装完成以后新建文件/etc/xinetd.d/tftp,然后在里面输入如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server tftp
{

socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /home/wanli/linux/tftpboot/
disable = no
per_source = 11
cps = 100 2
flags = IPv4
}
1
sudo service tftpd-hpa start

打开/etc/default/tftpd-hpa 文件,将其修改为如下所示内容

1
2
3
4
5
6
# /etc/default/tftpd-hpa

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/wanli/linux/tftpboot"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="-l -c -s"

TFTP_DIRECTORY 就是我们上面创建的 tftp 文件夹目录,以后我们就将所有需要通过TFTP 传输的文件都放到这个文件夹里面,并且要给予这些文件相应的权限。最后输入如下命令, 重启 tftp 服务器:

1
sudo service tftpd-hpa restart

uboot 中的 tftp 命令格式如下:

1
tftpboot [loadAddress] [[hostIPaddr:]bootfilename]

看 起 来 和 nfs 命 令 格式 一 样 的 , loadAddress 是 文 件 在 DRAM 中 的存 放 地 址 ,[[hostIPaddr:]bootfilename]是要从 Ubuntu 中下载的文件。但是和 nfs 命令的区别在于, tftp 命令不需要输入文件在 Ubuntu 中的完整路径,只需要输入文件名即可。比如我们现在将 tftpboot 文件夹里面的 zImage 文件下载到开发板 DRAM 的 0X80800000 地址处,命令如下:

1
tftp 80800000 zImage

image-20250428173245639

emmc和sd卡操作

uboot 支持 EMMC 和 SD 卡,因此也要提供 EMMC 和 SD 卡的操作命令。一般认为 EMMC和 SD 卡是同一个东西,所以没有特殊说明,mmc 是一系列的命令,其后可以跟不同的参数。

image-20250428173429095

加上 SD 卡一共有两个 MMC 设备, FSL_SDHC:0 是 SD卡, FSL_SDHC:1(eMMC)是 EMMC,。默认会将 EMMC 设置为当前 MMC 设备,这就是为什么输入“mmc info”查询到的是 EMMC 设备信息,而不是 SD 卡。要想查看 SD 卡信息,就要使用命令“mmc dev”来将 SD 卡设置为当前的 MMC 设备。mmc dev 命令用于切换当前 MMC 设备,命令格式如下:

mmc dev

1
mmc dev [dev] [part]

[dev]用来设置要切换的 MMC 设备号, [part]是分区号。如果不写分区号的话默认为分区 0。使用如下命令切换到 SD 卡:

1
mmc dev 0 //切换到 SD 卡, 0 为 SD 卡, 1 为 eMMC

有时候 SD 卡或者 EMMC 会有多个分区,**第 0 个分区存放 uboot,第 1 个分区存放 Linux 镜像文件和设备树,第 2 个分区存放根文件系统。**要将数据写到 MMC 设备里面,可以使用命令“mmc write”,格式如下:’

mmc write

1
mmc write addr blk# cnt

addr 是要写入 MMC 中的数据在 DRAM 中的起始地址, blk 是要写入 MMC 的块起始地址(十六进制), cnt 是要写入的块大小,一个块为 512 字节。我们可以使用命令mmc write来升级 uboot,也就是在 uboot 中更新 uboot。

   通过 nfs 或者 tftp 命令将新的 u-boot.bin 下载到开发板的 DRAM 中,然后再使用命令“mmc write”将其写入到 MMC设备中。我们就来更新一下 SD 中的 uboot,先查看一下 SD 卡中的 uboot 版本号,注意编译时间,输入命令:

mmc dev 0 //切换到 SD 卡

version //查看版本号

image-20250428173439158

然后将编译出来的 u-boot.imx(u-boot.bin 前面加了一些头文件)拷贝到 Ubuntu 中的nfs对应目录下。最后使用 nfs命令将其下载到 0x80800000 地址处,命令如下:

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

1
2
mmc dev 0
mmc write 80800000 2 33E

image-20250428173456033

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

image-20250428173500946

千万不要写 SD 卡或者 EMMC 的前两个块(扇区),里面保存着分区表!

** 千万不要写 SD 卡或者 EMMC 的前两个块(扇区),里面保存着分区表!**

** 千万不要写 SD 卡或者 EMMC 的前两个块(扇区),里面保存着分区表!**

FAT格式文件操作

fatinfo

1
fatinfo <interface> [<dev[:part]>]

interface 表示接口,比如 mmc, dev 是查询的设备号, part 是要查询的分区。比如我们要查询 EMMC 分区 1 的文件系统信息,命令如下:

1
fatinfo mmc 1:1

image-20250428173510834

fatls

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

1
fatls <interface> [<dev[:part]>] [directory]

interface 是要查询的接口,比如 mmc, dev 是要查询的设备号, part 是要查询的分区, directory是要查询的目录。比如查询 EMMC 分区 1 中的所有的目录和文件,输入命令:

1
fatls mmc 1:1

从上图可以看出, emmc 的分区 1 中存放着两个文件,文件分别是 linux 镜像(zimage)文件和设备树。并且在 emmc 的分区 1 中有6个文件,没有目录。

fstype

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

1
fstype <interface> <dev>:<part>

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

1
2
3
fstype mmc 1:0
fstype mmc 1:1
fstype mmc 1:2

image-20250428173524440

上图可以看出,分区 0 格式未知,因为分区 0 存放的 uboot,并且分区 0 没有格式化,所以文件系统格式未知分区 1 的格式为 fat,分区 1 用于存放 linux 镜像和设备树。分区 2 的格式为 ext4,用于存放 Linux 的跟文件系统。

fatload 命令

   fatload 命令用于**将指定的文件读取到 DRAM** 中,命令格式如下:
1
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 地址处,命令如下:

1
fatload mmc 1:1 80800000 zImage

image-20250428173530806

从上图可以看出在 153ms 内读取了 6071136 个字节的数据,速度为 29.2MiB/s,速度是非常快的,因为这是从EMMC 里面读取的,而 EMMC 是 8 位的,速度肯定会很快的。

   zImage 大小为 6777096(0X67 6908)个字节,接下来使用命令 fatwrite 将其写入到 EMMC 的分区 1 中,文件名字为 zImage,命令如下
1
fatwrite mmc 1:1 80800000 zImage 0x676908

完成以后使用“fatls”命令查看一下 EMMC 分区 1 里面的文件,结果如图

EXT格式文件操作

uboot 有 ext2 和 ext4 这两种格式的文件系统的操作命令,常用的就四个命令,分别为:

ext2load、 ext2ls、 ext4load、 ext4ls 和 ext4write。这些命令的含义和使用与 fatload、 fatls 和 fatwrit一样,只是 ext2 和 ext4 都是针对 ext 文件系统的。比如 ext4ls 命令, EMMC 的分区 2 就是 ext4格式的,使用 ext4ls 就可以查询 EMMC 的 2 中的文件和目录,输入命令:

ext4ls mmc 1:2

image-20250428173542360

boot操作命令

其他常用命令