Linux-Uboot命令

news2025/1/21 12:12:58

help命令

进入 uboot 的命令行模式后输入“help”或者“?”,然后按下回车即可查看当前 uboot 所支持的命令。

查看某一个命令的帮助信息:?+命令名称    或       help+命令名称

信息查询命令

常用的和信息查询有关的命令有 3 个: bdinfo、 printenv 和 version。

“bdinfo”命令用于查看板子信息,直接输入“bdinfo”即可。可得出 DRAM 的起始地址和大小、启动参数保存起始地址、波特率、sp(堆栈指针)起始地址等信息。

“printenv”命令用于输出环境变量信息, uboot 也支持 TAB 键自动补全功能,输入“print”,按下 TAB 键就会自动补全命令,直接输入“print”也可以。

环境变量的操作命令

环境变量操作有两个命令: setenv 和 saveenv

setenv命令

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

saveenv命令

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

命令 saveenv 使用格式为:

saveenv

命令setenv使用格式。比如将环境变量 bootdelay 改为 5,命令如下所示:

setenv bootdelay 5
saveenv

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

自定环境变量(新建环境变量)

命令 setenv 也可以用于新建命令,用法和修改环境变量一样,比如新建一个环境变量author,author的值为名字首字母,可用如下命令:

setenv author lyp
saveenv

删除环境变量

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

setenv author
saveenv

内存操作命令

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

md命令

用于显示内存值,格式: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,也就是 20*2=40 个字节;如果显示格式为.l 的话就表示 20 个 long,也就是20*4=80 个字节。

uboot 命令中的数字都是十六进制的!不是十进制的!比如查看以 0X80000000 开始的 20 个字节的内存值,显示格式为.b 的话,应该使用如下所示命令:

md.b 80000000 14

可以不用写0x前缀。

nm 命令

nm 命令用于修改指定地址的内存值,命令格式:nm [.b, .w, .l] address

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

nm.l 80000000

输入上述命令以后如图:

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

mm 命令

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

mw 命令

命令 mw 用于使用一个指定数据填充一段内存,命令格式如下: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 来查看,效果如下图:

cp命令

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

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

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

cp.l 80000000 80000100 10

cmp 命令

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

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

结果如下:

网络操作命令

uboot 是支持网络的,我们在移植 uboot 的时候一般都要调通网络功能,因为在移植 linux kernel 时需要用到 uboot 的网络功能做调试。在使用 uboot 的网络功能之前先用网线将开发板的 ENET2接口和电脑或者路由器连接起来, I.MX6U-ALPHA 开发板有两个网口: ENET1 和 ENET2,一定要连接 ENET2(左侧)。

保证开发板和电脑在同一个网段内

ping命令

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

ping 192.168.1.253

结果如下:

从图中可看出, 192.168.1.253 这个主机存在,说明 ping 成功, uboot 的网络工作正常。

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

ping之前要设置环境变量

开发板和电脑都在 192.168.1.0 这个网段内,所以设置开发板的 IP 地址为 192.168.1.50。

Ubuntu 主机的地址为 192.168.1.253,因此 serverip 就是192.168.1.253。

ethaddr 为网络 MAC 地址,是一个 48bit 的地址,如果在同一个网段内有多个开发板的话一定要保证每个开发板的 ethaddr 是不同的也就是MAC地址在同一个网段内是唯一的,否则通信会有问题!设置好网络相关的环境变量以后就可以使用网络相关命令。

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

dhcp命令

dhcp 用于从路由器获取 IP 地址,前提得开发板连接到路由器上,如果开发板和电脑直连, dhcp 命令就会失效。直接输入 dhcp 命令即可通过路由器获取到 IP 地址。DHCP 不单单是获取 IP 地址,其还会通过 TFTP 来启动 linux 内核,但一般不用其启动linux内核。

nfs命令

        nfs(Network File System)网络文件系统,通过 nfs 可在计算机之间通过网络来分享资源,比如我们将 linux 镜像和设备树文件放到 Ubuntu 中,然后在 uboot 中使用 nfs 命令将 Ubuntu 中的 linux 镜像和设备树下载到开发板的 DRAM 中。这样做的目的是为了方便调试 linux 镜像和设备树,也就是网络调试,通过网络调试是 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 目录中。

uboot 中的 nfs 命令格式如下:

nfs [loadAddress] [[hostIPaddr:]bootfilename]

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

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

首先将文件 zImage 通过 FileZilla 发送到 Ubuntu 中 的 NFS 目录下,准备好以后就可以使用 nfs 命令将 zImage 下载到开发板 DRAM 的 0X80800000 地址处,如下命令:

nfs 80800000 192.168.1.253:/home/lyp/linux/nfs/zImage

命令中的 “80800000” 表示zImage保存地址“192.168.1.253:/home/lyp/linux/nfs/zImage”表示 zImage 在 192.168.1.253 这个主机中,所在路径为/home/zuozhongkai/linux/nfs/zImage。

下载过程如下:

下载完成后可用md命令查看前100字节数据,后100字节数据,再用winhex软件打开zImage,来对比一下数据是否一致。

tftp命令

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

sudo apt-get install tftp-hpa tftpd-hpa
sudo apt-get install xinetd

和 NFS 一样, TFTP 也需要一个文件夹来存放文件,在用户目录下新建一个目录,如下:

mkdir /home/lyp/linux/tftpboot
chmod 777 /home/lyp/linux/tftpboot

最后配置 tftp,安装完成以后新建文件/etc/xinetd.d/tftp, 如果没有/etc/xinetd.d 目录的话自行创建, 然后在里面输入如下内容:

server tftp
{
    socket_type = dgram
    protocol = udp
    wait = yes
    user = root
    server = /usr/sbin/in.tftpd
    server_args = -s /home/lyp/linux/tftpboot/
    disable = no
    per_source = 11
    cps = 100 2
    flags = IPv4
}

完了以后启动 tftp 服务,命令如下:

sudo service tftpd-hpa start

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

# /etc/default/tftpd-hpa

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

TFTP_DIRECTORY 就是上面创建的 tftp 文件夹目录,以后我们就将所有需要通过TFTP 传输的文件都放到这个文件夹里面,并且要给予这些文件相应的权限。

最后输入如下命令, 重启 tftp 服务器:

sudo service tftpd-hpa restart

之后就可以直接使用了,uboot 中的 tftp 命令格式如下:

tftpboot [loadAddress] [[hostIPaddr:]bootfilename]

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

tftp 80800000 zImage

uboot 中关于网络的命令中最常用的就是 ping、 nfs 和 tftp 这三个命令。使用 ping 命令来查看网络的连接状态,使用 nfs 和 tftp 命令来从 Ubuntu 主机中下载文件。

EMMC和SD卡操作命令

uboot 支持 EMMC 和 SD 卡,因此也要提供 EMMC 和 SD 卡的操作命令。一般认为 EMMC
和 SD 卡是同一个东西,统一使用 MMC 来代指 EMMC 和 SD 卡。uboot 中常用于操作 MMC 设备的命令为“mmc”。mmc 是一系列的命令,其后可以跟不同的参数,输入“? mmc”即可查看 mmc 有关的命令。

mmc info命令

mmc info 命令用于输出当前选中的 mmc info 设备的信息,输入命令“mmc info”即可。

从上图可以看出,当前选中的 MMC 设备是EMMC,版本为 5.0,容量为 7.1GiB(EMMC为 8GB),速度为 52000000Hz=52MHz, 8 位宽的总线。mmcinfo,“mmc”和“info”之间没有空格与 mmc info命令功能相同。

mmc rescan 命令

mmc rescan 命令用于扫描当前开发板上所有的 MMC 设备,包括 EMMC 和 SD 卡,输入“mmc rescan”即可。

mmc list 命令

mmc list 命令用于来查看当前开发板一共有几个 MMC 设备,输入“mmc list”,结果如下图:

可看出当前开发板有两个 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 设备。

mmc dev 命令

mmc dev 命令用于切换当前 MMC 设备,命令格式如下:

mmc dev [dev] [part]

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

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

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

结果如下:

从上图中可看出,切换到 SD 卡成功, mmc0 为当前的 MMC 设备,输入命令“mmc info”即可查看 SD 卡的信息,查看结果如下:

可以看出当前 SD 卡为 3.0 版本的,容量为 14.8GiB(16GB 的 SD 卡), 4 位宽的总线。

mmc part 命令

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

mmc dev 1    //切换到 EMMC
mmc part     //查看 EMMC 分区

结果如下图:

从上图中可看出,此时 EMMC 有两个分区, 第一个分区起始扇区为 20480,长度为 262144 个扇区; 第二个分区起始扇区为 282624,长度为 14594048 个扇区。

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 1                 //切换到 MMC 分区 1
mmc read 80800000 600 10    //读取数据

通过 md.b 命令查看 0x80800000 处的数据就行了,查看 16*512=8192(0x2000)个字节的数据,命令如下:

md.b 80800000 2000

结果如下:

可看到“baudrate=115200.board_name=EVK.board_rev=14X14.”等字样,这个就是 uboot 中的环境变量。 EMMC 核心板 uboot 环境变量的存储起始地址就是1536*512=786432。

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的大小,然后除以512得到要写入的块的数量,要向 SD 卡中写入n 个块,如果有小数的话就要加 1 个块。使用命令“mmc write”从 SD 卡分区 0 第 2 个块(扇区)开始烧写,一共烧写 n(转换为16进制)个块,命令如下:

mmc dev 0 0
mmc write 80800000 2 2E6

烧写成功后,重启开发板(从 SD 卡启动),重启以后再输入 version 来查看版本号。发现编译时间变化了,如果要更新 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 需要这一步!

mmc erase命令

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

mmc erase blk# cnt

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

FAT 格式文件系统操作命令

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

对于I.MX6U来说,SD/EMMC分为三个分区:

第一个:存放uboot

第二个:存放Linux zImage和.dtb文件。(FAT格式)

第三个:系统的根文件系统(EXT4格式)

FAT格式文件系统操作命令是针对第二个分区,也就是FAT格式的文件系统的命令,后面还有EXT格式文件系统操作命令。

fatinfo 命令

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

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

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

fatinfo mmc 1:1

fatls 命令

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

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

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

fatls mmc 1:1

fstype 命令

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

fstype <interface> <dev>:<part>

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

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

结果如下:

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

fatload 命令(重要)

uboot启动系统,将系统从MMC中读取到DRAM中就是使用此命令。

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

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

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

结果如下:

boot操作命令

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

bootz 命令

要启动 Linux,需要先将 Linux 镜像文件拷贝到 DRAM 中,如果用到设备树的话也需要将设备树拷贝到 DRAM 中。可以从 EMMC 或者 NAND 等存储设备中将 Linux 镜像和设备树文件拷贝到 DRAM,也可以通过 nfs 或者 tftp 将 Linux 镜像文件和设备树文件下载到 DRAM 中。然后使用 bootz 命令来启动, bootz 命令用于启动 zImage 镜像文件, bootz 命令格式如下:

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

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

使用网络和 EMMC 两种方法来启动 Linux 系统:首先将开发板的 Linux 镜像和设备树发送到 Ubuntu 主机中的 tftpboot 文件夹下。选择好对应设备的设备树文件。给予设备树文件可执行权限,正点原子出场所提供的几个设备树文件如下,

首先来通过网络启动 Linux,使用 tftp 命令将zImage 下载到DRAM的0X80800000地址处,然后将设备树.dtb 下载到 DRAM 中的 0X83000000 地址处。

tftp 80800000 zImage
tftp 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb
bootz 80800000 - 83000000

上图为通过tftp和bootz命令从网络启动 Linux 系统。

如果我们要从 EMMC 中启动 Linux 系统的话需要使用命令 fatload 将 zImage 和设备树文件.dtb 从EMMC 的分区 1 中拷贝到 DRAM 中,然后使用命令 bootz 启动即可。

先使用命令 fatls 查看要下 EMMC 的分区 1 中有没有 Linux 镜像文件和设备树文件,如果没有参考fatwrite 命令将 tftpboot 中的 zImage 和 imx6ull-14x14-emmc-7-1024x600-c.dtb 文件烧写到 EMMC 的分区 1 中。然后使用命令 fatload 将 zImage 和 .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

命令运行结果如下:

bootm 命令

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

bootm addr

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

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

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

boot 命令

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

“boot”和“cmd”,也就是“引导”和“命令”,说明这个环境变量保存着引导命令,其实就是启动的命令集合,具体的引导命令内容是可以修改的。

比如要想使用 tftp 命令从网络启动 Linux 那么就可以设置 bootcmd 为“tftp80800000 zImage; tftp 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb; bootz 80800000 -83000000”,然后使用 saveenv 将 bootcmd 保存起来。然后直接输入 boot 命令即可从网络启动Linux 系统,命令如下:

setenv bootcmd 'tftp 80800000 zImage; 
                tftp 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb;
                bootz 80800000 - 83000000'
saveenv
boot

运行结果如下:

uboot 倒计时结束以后就会启动 Linux 系统,其实就是执行的 bootcmd 中的启动命令。只要不修改 bootcmd 中的内容,以后每次开机 uboot 倒计时结束以后都会使用 tftp 命令从网络下载 zImage 和 imx6ull-14x14-emmc-7-1024x600-c.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

运行结果如下:

其他一些常用命令

reset命令

复位的,输入“reset”即可复位重启

go 命令

go 命令用于跳到指定的地址处执行应用,命令格式如下:

go addr [arg ...]

addr 是应用在 DRAM 中的首地址,我们可以编译一下裸机例程的实验 13_printf,然后将编译出来的 printf.bin 拷贝到 Ubuntu 中的 tftpboot 文件夹里面。

注意,这里要拷贝 printf.bin 文件,不需要在前面添加IVT信息,因为uboot已初始化好 DDR 了。

使用 tftp 命令将 printf.bin下载到开发板 DRAM 的 0X87800000 地址处,裸机例程的链接首地址就是 0X87800000,最后使用 go 命令启动 printf.bin 这个应用,命令如下:

tftp 87800000 printf.bin
go 87800000

run 命令

run 命令用于运行环境变量中定义的命令,比如可通过“run bootcmd”来运行 bootcmd 中的启动命令,但是 run 命令最大的作用在于运行我们自定义的环境变量。在后面调试 Linux 系统时常常要在网络启动和 EMMC/NAND 启动之间来回切换,而 bootcmd 只能保存一种启动方式,如果要换另外一种启动方式的话就得重写 bootcmd,会很麻烦。这里就可以通过自定义环境变量来实现不同的启动方式,比如定义环境变量 mybootemmc 表示从 emmc 启动,定义 mybootnet 表示从网络启动。如果要切换启动方式的话只需要运行“run mybootxxx(xxx 为 emmc、 net 或 nand)”即可。

创建环境变量 mybootemmc、 mybootnet 和 mybootnand,命令如下:

setenv mybootemmc 'fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull-
14x14-emmc-7-1024x600-c.dtb;bootz 80800000 - 83000000'
setenv mybootnet 'tftp 80800000 zImage; tftp 83000000imx6ull-14x14-emmc-7-1024x600-c.dtb;
bootz 80800000 - 83000000'
saveenv

创建环境变量成功以后就可以使用 run 命令来运行 mybootemmc、 mybootnet 或 mybootnand
来实现不同的启动:

run mybootemmc或 run mybootnet

mtest 命令

mtest 命令是一个内存读写测试命令,可用来测试自己开发板上的 DDR,命令格式如下:

mtest [start [end [pattern [iterations]]]]

start 是要测试的 DRAM 开始地址, end 是结束地址,比如我们测试 0X80000000~0X80001000这段内存,输入“mtest 80000000 80001000”,结果如下:

从图中可以看出,测试范围为 0X80000000~0X80001000,已测试了 486 次,要结束测试就按下“Ctrl+C”。

常用uboot命令就这些,每个都经常用到。

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

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

相关文章

3D工业相机及品牌集合

3D相机可以获取物理世界的空间信息&#xff0c;即立体三维的物理信息&#xff0c;不仅可以拍摄到场景的二维图像&#xff0c;而且能获取物体之间的位置关系&#xff0c;再经过进一步深化处理&#xff0c;还能完成三维建模等应用。 3D相机三种方案 1、结构光 通常采用特定波长…

如何使用ETLCloud拉通金蝶云

一、ETLCloud集成组件 ETLCloud采用了一种创新的基于平台底座的理念。它通过将组件和平台进行分离&#xff0c;用户可以在平台上自行下载和安装所需的组件&#xff0c;而无需升级整个底座版本。这样用户就可以通过不断升级组件来增强数据集成平台的处理能力。同时&#xff0c;…

论文阅读:SOLOv2: Dynamic, Faster and Stronger

目录 概要 Motivation 整体架构流程 技术细节 小结 论文地址&#xff1a;[2003.10152] SOLOv2: Dynamic and Fast Instance Segmentation (arxiv.org) 代码地址&#xff1a;GitHub - WXinlong/SOLO: SOLO and SOLOv2 for instance segmentation, ECCV 2020 & NeurIPS…

阿里云ECS服务器vCPU是什么意思?

阿里云ECS服务器vCPU和CPU是什么意思&#xff1f;CPU和vCPU有什么区别&#xff1f;一台云服务器ECS实例的CPU选项由CPU物理核心数和每核线程数决定&#xff0c;CPU是中央处理器&#xff0c;一个CPU可以包含若干个物理核&#xff0c;通过超线程HT&#xff08;Hyper-Threading&am…

一文读懂什么是 OCR 识别

在数字化时代&#xff0c;信息处理和数据管理是企业运营的重要环节。然而&#xff0c;手工输入信息存在效率低和准确性低的问题&#xff0c;严重影响了企业的工作流程和决策过程。因此&#xff0c;OCR&#xff08;Optical Character Recognition&#xff09;识别技术的应用变得…

必看——HTTP怎么升级成HTTPS

将HTTP升级为HTTPS主要涉及获取SSL/TLS证书并在您的服务器上配置它。这个过程可以增强网站的安全性&#xff0c;通过加密客户端和服务器之间的通信来保护数据。下面是一个基本的步骤指南&#xff1a; 1.购买SSL/TLS证书&#xff1a;您可以从许多证书颁发机构&#xff08;CA&…

期货程序化软件 日内抄单软件期货交易程序

按钮&#xff1a;锁定合约、设置、合约、<(折叠按钮) 锁定合约&#xff1a;点击锁定合约后&#xff0c;合约列表不再接受点击事件。再次点击锁定合约按钮可以进行解锁。 设置按钮&#xff1a;点击设置按键后&#xff0c;打开设置窗口&#xff0c;进行交易相关的设置。 合…

10.网络游戏逆向分析与漏洞攻防-游戏网络架构逆向分析-接管游戏发送数据的操作

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;接管游戏连接服务器的操作 码云地址&#xff08;master 分支&#xff09;&#xff1a;染指/titan 码云版本号&#xff1a;00820853d5492fa7b6e32407d46b5f9c01930ec6 代码下载地址&#xff0c;在 ti…

账户名密码是怎样被窃取的,简单模拟攻击者权限维持流程。

前言 在我们进行渗透测试的时候&#xff0c;常常需要进行权限维持&#xff0c;常见的 Javascript窃取用户凭证是一种常见的攻击手法。之前我们可能学习过钓鱼网页的使用&#xff0c;如果我们通过渗透测试进入到用户的服务器&#xff0c;其实也可以通过在网页中植入Javascript代…

用CSS实现一个扇形

用CSS实现扇形的思路和三角形基本一致&#xff0c;就是多了一个圆角的样式&#xff0c;实现一个90的扇形&#xff1a; div{border: 100px solid transparent;width: 0;heigt: 0;border-radius: 100px;border-top-color: red; }

上机题-西北农林科技大学(一)

题目&#xff1a;输入一个字符串&#xff0c;统计字符串中大、小写字母&#xff0c;数字及其他字符出现的次数 代码解释&#xff1a; #include <stdio.h> int main() {char chuan[1000];scanf("%s", chuan);int big 0, small 0, number 0, other 0, i 0;…

Day03:Web架构OSS存储负载均衡CDN加速反向代理WAF防护

目录 WAF CDN OSS 反向代理 负载均衡 思维导图 章节知识点&#xff1a; 应用架构&#xff1a;Web/APP/云应用/三方服务/负载均衡等 安全产品&#xff1a;CDN/WAF/IDS/IPS/蜜罐/防火墙/杀毒等 渗透命令&#xff1a;文件上传下载/端口服务/Shell反弹等 抓包技术&#xff1a…

pdf转word文档怎么转?分享4种转换方法

pdf转word文档怎么转&#xff1f;在日常工作中&#xff0c;我们经常遇到需要将PDF文件转换为Word文档的情况。无论是为了编辑、修改还是为了重新排版&#xff0c;将PDF转为Word都显得尤为重要。那么&#xff0c;PDF转Word文档怎么转呢&#xff1f;今天&#xff0c;就为大家分享…

当Web3叙事寒冬到来,游戏是否是冬日里的“一把火”?

出品&#xff5c;欧科云链研究院 作者&#xff5c;Jason Jiang 以太坊创始人Vitalik在2019年曾说&#xff1a;金融与游戏会是区块链最先落地的场景。 在DeFi金融创新驱动上个周期后&#xff0c;沉寂近两年的Web3游戏板块&#xff0c;如今似乎也在复苏。无论是频繁获得融资&a…

5G双域快网

目录 一、业务场景 二、三类技术方案 2.1、专用DNN方案 2.2、ULCL方案&#xff1a;通用/专用DNNULCL分流 2.3、 多DNN方案-定制终端无感分流方案 漫游场景 一、业务场景 初期双域专网业务可划分为三类业务场景&#xff0c;学校、政务、文旅等行业均已提出公/专网融合访问需…

环境分析检测小剂量移液用耐受硝酸盐酸PFA材质吸管特氟龙移液枪枪头

PFA枪头&#xff0c;为移液枪专业定制&#xff0c;广泛用于ICP-MS、ICP-OES等痕量分析以及同位素分析等实验室。地质、电子化学品、半导体分析测试、疾控中心、制药厂、环境检测中心等一些机构少量移液用。 规格参考:0.1-0.2ml、1ml、2ml、5ml、10ml等。 目前部分规格可适配普…

mac电脑监控软件哪个好

在Mac电脑使用日益普及的今天&#xff0c;企业对于Mac终端的安全管理需求也日益增长。Mac电脑监控软件作为一种有效的管理工具&#xff0c;能够帮助企业提高数据安全性和员工工作效率。 在众多Mac电脑监控软件中&#xff0c;域智盾软件以其卓越的功能和性能脱颖而出&#xff0c…

1215数字化城管建设项目解决方案

数字城管又叫“数字化城市管理”就是指用信息化手段和移动通信技术手段来处理、分析和管理整个城市的所有城管部件和城管事件信息&#xff0c;促进城市管理的现代化的信息化措施。数字城管把像井盖、路灯、邮筒、果皮箱、停车场、电话亭等城市元素都纳入城市信息化管理的范畴&a…

历史新知网:寄快递寄个电脑显示器要多少钱?

以下文字信息由&#xff08;新史知识网&#xff09;编辑整理发布。 让我们赶紧来看看吧&#xff01; 问题1&#xff1a;快递寄电脑显示器要多少钱&#xff1f; 此物有多重&#xff1f; 顺丰寄就可以了&#xff0c;但是必须是原包装的&#xff0c;不然不好寄。 问题2&#xff1…

2024智慧城市革命:人工智能、场景与运营的融合之力

在数字革命的浪潮中&#xff0c;2024年的智慧城市将成为人类社会进步的新地标。 三大关键元素——人工智能、场景应用和精准运营——正在重新塑造城市面貌&#xff0c;构建未来的智慧城市生活图景。 一、人工智能&#xff1a;赋能智慧城市 随着人工智能技术的快速发展&#x…