移植 U-boot常见命令和重要环境变量

本文详细介绍了U-boot中的常见命令和重要环境变量,包括查询命令如bdinfo、printenv、version,环境变量管理如setenv、saveenv,内存查看与修改命令md、nm、mm、mw,网络相关命令如ipaddr、ethaddr、dhcp、ping等,以及EMMC、SD卡、EXT格式文件系统和BOOT相关命令的使用方法。这些知识对于嵌入式系统的开发和调试至关重要。

U-boot官方提供的命令有很多,并且支持自定义命令。但在实际开发中,即落实到具体某一款开发板时,并不需要那么多的命令,所以半导体厂商或开发板生产厂商会配置自己的uboot

1.查询命令

        1.1 bdinfo

                查看芯片中各设备使用的地址

                使用方式:bdinfo

        1.2 printenv

                查看芯片中的环境变量,注意:uboot中的环境变量都是字符串

                使用方式:printenv

        1.3 version

                查看uboot版本号

                使用方式:version

2.环境变量相关命令

        2.1 setenv

                设置环境变量的值,此时值存放在 DRAM 中

                使用方式:1)单一赋值        setenv XXX 000 

                                  2)多值赋值        setenv bootargs 'console=ttySTM0,115200 root=/dev/mmcblk2p2 rootwait rw' (单引号内的四组值都属于XXX,值之间用空格分开)

                                  3)删除环境变量        setenv XXX        //即赋空值,重启 uboot 此变量消失

        2.2 saveenv

                保存环境变量的值,将值保存到外部 flash 中(一般环境变量存放在外部 flash 中,uboot启动时会将环境变量从外部 flash 读取到 DRAM 中)

                使用方式:saveenv        //紧跟 setenv 后

3.内存(DRAM)相关命令

        3.1 md

                查看内存里的值

                使用方式:md[.b .w .l] address [# of objects]

                                .b .w .l 分别表示 byte word long,即用 1 字节  2 字节  4 字节为度,显示内存

                                address 表示要查看的 内存的起始地址

                                [# of objects]表示要显示多少个度,注意:uboot命令中的数字都是十六进制的,且不用加 0x 前缀

                                如:想看 0xc0100000 往后的20个字节        md.b c0100000 14

        3.2 nm

                设置内存里的值

                使用方式:第一步. nm[.b .w .l] adress

                                  第二步. 0x12

                                  第三步. q

                                  如:修改 0xc0100000 地址的值为 0x12 

                                

        3.3 mm

                设置内存里的值,且会连续询问下个度的内存地址是否更改值

                使用方式:第一步. mm[.b .w .l] adress

                                  第二步. 0x12345678

                                              地址递增,重复询问

                                  第三步. q

                                  如:修改 0xc0100000 ,度=四字节 的值为0x12345678

                                   

        3.4 mw

                使用指定数据填充一段内存

                使用方式:mw[.b .w .l] address value [count]

                                value = 要填充的值,count = 度的个数

                                如:想用 0x12345678 填充 0xc0100000 往后的20个字节        mw.l c0100000 12345678 5

        3.5 cp

                数据复制

                使用方式:cp[.b .w .l] source target count

                                source = 源地址,target = 目标地址,count = 度的个数

                                如:cp.l c0100000 c0100100 10

        3.6 cmp

                比较两段内存里的值是否相等

                使用方式:cmp[.b .w .l] addr1 addr2 count

                                add1 和 add2 = 内存首地址,count = 度的个数

                                如:cmp.l c0100000 c0100100 10

4.网络相关命令

        4.1 ipaddr

                开发板 ip 地址,可以不设置,用 dhcp 命令从路由器获取

                使用方式:setenv ipaddr 192.168.1.250

        4.2 ethaddr

                开发板 MAC 地址

                使用方式:setenv ethaddr b8:ae:1d:01:01:00

        4.3 gatewayip

                网关地址

                使用方式:setenv gatewayip 192.168.1.1

        4.4 netmask

                子网掩码

                使用方式:setenv netmask 255.255.255.0

        4.5 serverip

                服务器 ip 地址,就是开发板连接的调试主机的 ip ,比如虚拟机中的 Ubuntu

                使用方式:setenv serverip 192.168.1.249

        4.6 ping

                连接该 ip 地址,注意:uboot 不具有接受 ping 的功能,只能发起连接,不能处理连接请求

                使用方式:ping 192.168.1.249

        4.7 dhcp

                从路由器获取 ip 地址,也可通过 TFTP 启动 Linux 内核。注意:若开发板与电脑直连,此命令无效

                使用方式:dhcp

        4.8 nfs

                Network File System 网络文件系统,可以使计算机之间互相传输文件(使用之前应确保已开启 NFS 服务)。例如将 bootfs 放在 Ubuntu 中,通过 nfs 命令将之下载到开发板的 DRAM 中启动,即网络调试,方便开发调试 Linux内核和设备树

                使用方式:nfs loadAddress hostIPaddr:bootfilename

                                 loadAddress = DRAM 首地址,hostIPaddr:bootfilename = 要加载的文件及其 IP 地址加绝对路径

                                 如:nfs c20000000 192.168.1.249:/home/linux/nfs/uImage

        4.9 tftp(常用,uImage 和 .dtb 从 Ubuntu 中挂载启动时,设置 bootcmd 环境变量用)

                Trivial File Transfer Protocol 简单文件传输协议,属于 TCP/IP 协议族,一般是基于 UDP 实现的,端口号为 69(使用需下载)

                使用方式:tftpboot loadAddress hostIPaddr:bootfilename

                                与 nfs 不同的是,不需要写绝对路径,只用文件名即可,但要确保此文件在 tftpboot 文件夹内

                                如:tftp c2000000 uImage        //此处命令 tftpboot 未写全依然可行,因为在 uboot 的命令中,只有 tftpboot 命令前4位是 tftp,uboot 能自动匹配补全

        4.10 MII

                读取 PHY 芯片寄存器的值,调试 PHY 芯片用。但是在 STM32MP157 中由于 ST 官方提供的 uboot 在每次网络通讯完成后都会关闭 ETHMAC 时钟,所以导致 MII 命令不可用,对此可以在使用 MII 命令前先使能 ETHMAC 时钟,将 0x50000218 寄存器的 bit8 - 10 置 1 。

                1)先 ping 一下其他设备。目的是让 PHY 芯片开始工作,与远端设备连接,设置好网络状态,此时才能使用 MII 命令获取信息

                2)使能 ETHMAC 时钟。修改寄存器 0x50000218 的 bit8 - 10 为 1

                         

                3)使用 MII 命令

                使用方式:

mii device列出可用设备
mii device <devname>设置此设备
mii info   <addr>显示 PHY 芯片信息  //addr = PHY 芯片地址
mii read   <addr> <reg> 显示 PHY 芯片中某个寄存器信息  //reg = 
mii write  <addr> <reg> <data> 更改 PHY 芯片中某个寄存器 //data = 要写入的信息
mii modify <addr> <reg> <data> <mask>修改 PHY 芯片中某个寄存器中 mask 标记位的值  //mask = 要更改的标识位
mii dump   <addr> <reg>美化打印 = mii read

        4.11 MDIO

                Management Data Input/Output 管理数据输入输出,包含在 IEEE802.3 协议中,是专用于 MAC 和 PHY 的实时、半双工、串行总线接口,由 MDIO(Management Data Input/Output)线和 MDC(Management Data Clock)线组成,主要用于配置 PHY 芯片状态、读取寄存器、读取 PHY 地址、获取 LINK 状态等,但与网口 MII、RMII(TX_CLK、RX_CLK)等数据通讯无关,MDIO 接口最多可挂载 32 个 PHY 设备

                使用方式:

mdio list列出 MDIO 总线上的设备
mdio read <phydev> [<devad>.]<reg>显示 PHY 芯片中某个寄存器信息
mdio write <phydev> [<devad>.]<reg> <data>更改 PHY 芯片中某个寄存器
mdio rx <phydev> [<devad>.]<reg>显示 PHY 芯片的扩展寄存器的值
mdio wx <phydev> [<devad>.]<reg> <data>更改 PHY 芯片的扩展寄存器的值

5. EMMC 和 SD卡相关命令

        uboot 不特意区分 EMMC 和 SD 卡,操作用统一的命令 mmc ,后跟不同的参数实现不同的功能

命令功能示例
mmc info查看当前 MMC 的设备信息

mmc info 或 mmcinfo(两个不同命令)

mmc read读取 MMC 中数据

mmc read addr blk# cnt  //addr=读取到DRAM地址 blk=要读取的块起始地址 cnt=要读的块数量

如:mmc read c0000000 400 10

注:数值全是十六进制

mmc write向 MMC 写入数据
mmc rescan扫描所有 MMC 设备mmc rescan
mmc part查看当前 MMC 设备的分区mmc part
mmc dev切换 MMC 设备

mmc dev [dev] [part]  //dev=设备号 part=分区号

如:mmc dev 1(eMMc)或 mmc dev 0(SD卡)

注:分区号不写默认分区0

mmc list查看所有有效的 MMC 设备mmc list
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 寄存器的值

若出现 Card did not respond to voltage select! 是当前未选定 MMC,先 mmc dev 1 选定一个

6. EXT 格式文件系统相关命令

        uboot 有 ext2 和 ext4 两种格式的文件系统命令,STM32MP1 中 Linux内核、设备树和根文件系统的镜像是 ext4 格式

        6.1 ext4ls

                查询 EXT4 格式设备中的目录和文件信息

                使用方式:ext4ls <interface> <dev[:part]> [directory]

                                interface = 要查询的接口;

                                dev = 要查询的设备号;

                                part = 要查询的分区;

                                directory = 要查询的目录;

                                如:ext4ls mmc 1:2

        6.2 ext4load(常用,uImage 和 .dtb 从 EMMC 中启动时,设置 bootcmd 环境变量用)

                将指定文件载入到 DRAM 中

                使用方式:ext4load interface dev:part addr filename bytes pos

                                interface = 文件所在的接口;

                                dev = 文件所在的设备号;

                                part = 文件所在的分区;

                                addr = 保存到 DRAM 中的首地址;

                                filename = 指定文件名称;

                                bytes = 载入字节数,若 = 0 或省略 = 读取整个文件;

                                pos = 距离文件首地址的偏移量,若 = 0 或省略 = 从文件首地址开始

                                如:ext4load mmc 1:2 c2000000 uImage

        6.3 ext4write

                将 DRAM 中的数据写入到 MMC 设备中

                使用方式:ext4write <interface> <dev[:part]> <addr> <absolute filename path> [sizebytes] [file offset]

                                interface = MMC 或接口;

                                dev = 写入的设备号;

                                part = 写入的分区;

                                addr = 文件所在 DRAM 中的首地址;

                                absolute filename path = 文件名加绝对路径

                                sizebytes = 写入多少字节

                                file offset = 文件内偏移量,光标位置

                                如:ext4write mmc 1:2 c0000000 /uImage 0x6f99e0

7. BOOT 相关命令

        7.1 bootm(常用,设置 bootcmd 环境变量时,最后用此命令启动)

                用于启动 DRAM 中的 uImage 镜像文件

                使用方式:bootm addr arg ...

                                addr = uImage 在 DRAM 中的地址

                                arg = initrd 在 DRAM 中的地址,若不需要 = - 

                                        (boot loader iniTIalized RAM disk 由 boot loader 初始化的内存盘。分离思想,kernel 只保留基本的启动代码,而把各种驱动模块分割给 initrd,这样可以在不改变 kernel 的情况下,仅修改 initrd 就能灵活支持各种硬件,增加了灵活性,同时也减小了 kernel 的大小

                                           在配置了 initrd 的情况下,kernel 启动后会插入一个阶段,即在加载真正的根文件系统前会先加载 initrd,它可以为根文件系统做好准备工作。比如 usb 设备是启动较慢的设备,若将它的驱动编译进内核,启动时通常不能成功访问 usb 设备中的根文件系统,此时可以用 initrd 来加载 usb 设备驱动,并休眠几秒等待初始化完成后再挂载 usb 设备中的根文件系统。Linux2.6 内核支持两种格式的 initrd,一种是Linux2.4 内核的 image-initrd,核心文件为 /linuxrc,另一种是 cpio 格式的 cpio-initrd,核心文件是 /init,这两种 initrd 的处理流程并不相同

                                           initrd 不是必须的,如果采用非模块的方式将所需的所有功能都编译进内核中,并保证能够成功启动,则只需一个内核文件即可)

                                ... = 设备树文件在 DRAM 中的地址

                                如:bootm c2000000 - c4000000

        7.2 bootz

                用于启动 DRAM 中的 zImage 镜像文件

                        (vmlinux:编译Linux内核得到的原始 elf 格式文件,未压缩,不能用作 Linux 镜像,可用于定位内核问题

                        Image:使用 objcopy 处理 vmlinux 后获得的二进制内核镜像,未压缩,可用作 Linux 镜像

                        zImage:使用 gzip 压缩 Image 后,再用 objcopy 命令生成的 Linux内核镜像,经常用作 Linux 镜像

                        uImage:zImage 前增加一个64字节的头,说明内核版本、加载位置、生成时间、大小等信息,是老版本 uboot 专用镜像)

                使用方式:bootz [addr [initrd[:size]] [fdt]]

                                addr = zImage 在 DRAM 中的地址

                                initrd = initrd文件在 DRAM 中的地址,若不需要 = -

                                size = 指定 initrd 的大小,可忽略

                                fdt = 设备树文件在 DRAM 中的地址

                                如:bootm c2000000 - c4000000

        7.3 boot 或 bootd(半导体厂商可能不用,需修改使能)

                执行环境变量 bootcmd 中的命令。bootcmd 是一个命令集合,在开发板启动中 uboot 倒计时结束时会自动执行 bootcmd 中的命令

                使用方式:第一步. 设置环境变量 bootcmd 的值

                                  第二步. saveenv

                                  第三步. boot 或 bootd

                                  如:setenv bootcmd 'ext4load mmc 1:2 c2000000 uImage;ext4load mmc 1:2 c4000000 stm32mp157.dtb;bootm c2000000 -c4000000'

                                        saveenv

                                        boot

8. UMS 命令

        uboot 下将开发板的某个 Flash 虚拟成U盘(U盘个数 = 挂载的设备分区个数),可以实现电脑和开发板之间的直接文件传递。注意:虚拟出的U盘在 Windows 下是无法操作的,因为 Flash 设备格式为 ext4,而 Windows 不支持,因此当 Windows 报错U盘识别有问题让格式化时,千万不要格式化!格式化会改变 Flash 设备格式,导致开发板不可用。一般会挂载到相同版本的 Linux 开发环境下。结束挂载 CTRL+C,结束进程

        使用方式:ums <USB_controller> [<devtype>] <dev[:part]>

                        USB_controller = usb 接口索引,指定一个 USB SLAVE 接口(USB_OTG)

                        devtype = 要挂载的 Flash 设备类(mmc)

                        dev = 要挂载的 Flash 设备

                        part = 要挂载的 Flash 设备的分区

                        如:ums 0 mmc 1

9. 其他命令

        9.1 reset

                复位重启

                使用方式:reset

        9.2 go

                运行指定地址处的应用

                使用方式:go addr [arg ...]

                                addr = 应用在 DRAM 中的首地址

                                arg ... = 可用参数

        9.3 run

                运行某个环境变量中的命令

                使用方式:run bootcmd

        9.4 mtest

                内存读写测试命令,不 Ctrl+C 停止进程就会一直测试

                使用方式:mtest [start [end [pattern [iterations]]]]

                                start = 要测试的 DRAM 首地址

                                end = 要测试的 DRAM 尾地址

                                pattern =

                                iterations =

                                如:mtest c0000000 c0001000

        9.5 bmp

                在 LCD 上显示 bmp 格式的图片                

命令功能参数含义示例
bmp info <imageAddr>显示 BMP 图片信息imageAddr:图片在 RAM 中的地址bmp info c0000000
bmp display <imageAddr> [x,y]显示 BMP 图片[x,y]:指定图片左上角在屏幕上的显示坐标bmp display c0000000 0 0

        9.6 eraseenv

                擦除所有默认环境变量,之后需手动一一赋值

                用处之一是,当传递的 bootargs 环境变量被 uboot 里的 bootcmd 脚本文件覆写,导致命令错误,启动不成功时使用

        9.7 print

                打印出环境变量的值

                使用方式:print name

环境变量

        1) bootcmd

                保存 uboot 默认命令,倒计时结束后执行。一般用来启动操作系统内核,若其值为空,uboot 会使用默认的值,定义在文件 include/env_default.h 中为 CONFIG_BOOTCOMMAND,可以在 stm32mp1.h 文件中通过设置宏的方式来设置 bootcmd 的默认值

                示例:setenv bootcmd 'ext4load mmc 1:2 c2000000 uImage;ext4load mmc 1:2 c4000000 stm32mp157d-xxx.dtb;bootm c2000000 - c4000000'

                示例:setenv bootcmd 'tftp c2000000 uImage;tftp c4000000 stm32mp157d-xxx.dtb;bootm c2000000 - c4000000'

        2) bootargs

                保存 uboot 传递给 操作系统内核的参数。比如 Linux 内核所使用的 console、root 和 rootfstype

                示例:setenv bootargs 'console=ttySTM0,115200 root=/dev/mmcblk2p3 rootwait rw'

                示例:setenv bootargs 'console=ttySTM0,115200 root=/dev/nfs nfsroot=192.168.1.100:/home/linux/nfs/rootfs,proto=tcp rw ip=192.168.1.200:192.168.1.100:192.168.1.1:255.255.255.0::eth0:off'

                2.1)console

                        设置 Linux 终端。即 uboot 通过 Linux 的哪个终端与 Linux 进行交互。一般设置串口终端。

                        示例中 console=ttySTM0,115200 ,是因为 STM32MP1 的串口 4 在 Linux 中就是 /dev/ttySTM0 ,115200 为串口波特率

                2.2)root

                        以 Linux 的视角设置 根文件系统 存放位置

                        示例中 root=/dev/mmcblk2p3 ,即指明根文件系统存放在 mmcblk2 设备的分区 3 中,这取决于开发板的 mmc 设备和各设备的分区情况。在 STM32MP1 开发板中 /dev/mmcblk2 表示 EMMC ,所以是放在 EMMC 的分区 3 中

                        若是用 nfs 挂载,格式为:root=/dev/nfs nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>] ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>:<dns0-ip>:<dns1-ip>  即

                        root=/dev/nfs nfsroot=[<服务端 IP>:]<根文件系统绝对路径>[,<NFS 其他可选选项,一般不设置>] ip=<客户端 IP>:<服务端 IP>:<网关地址>:<子网掩码>:<客户机名字,一般不设置为空>:<网卡名>:<自动配置,一般不用填 off >:<DNS0服务器IP地址,不用>:<DNS1服务器IP地址,不用>

                        示例:root=/dev/nfs nfsroot=192.168.70.250:/home/linux/nfs/rootfs,proto=tcp rw ip=192.168.70.200:192.168.70.250:192.168.70.1:255.255.255.0::eth0:off
 

                2.3)rootfstype

                        指定 根文件系统 类型,一般配合 root 使用。若根文件系统为 ext 格式,此变量可省略,若为 yaffs 、jffs 或 ubifs 类型的话,就需要设置此变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值