Linux系统移植:U-Boot常用指令(下)

Posted JeckXu666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux系统移植:U-Boot常用指令(下)相关的知识,希望对你有一定的参考价值。

Linux系统移植:U-Boot常用指令(下)

一、U-Boot 常用命令(上)

1.1 EMMC和SD卡命令

uboot 支持 EMMC 和 SD 卡,提供 EMMC 和 SD 卡的操作命令

mmc 指令

命令描述
mmc info输出 MMC 设备信息
mmc read读取 MMC 中的数据
mmc read addr blk# cnt
addr 是数据读取到 DRAM 中的地址,blk 是要读取的块起始地址(十六进制),一个块是 512 字节,这里的块和扇区是一个意思,在 MMC 设备中我们通常说扇区,cnt 是要读取的块数量(十六进制)
mmc wirte向 MMC 设备写入数据
mmc write addr blk# cnt
addr 是要写入 MMC 中的数据在 DRAM 中的起始地址,blk 是要写入 MMC 的块起始地址 (十六进制),cnt 是要写入的块大小
mmc erase擦除 MMC 设备的指定块
mmc erase blk# cnt
blk 为要擦除的起始块,cnt 是要擦除的数量,不要乱用 mmc erase 来擦除 MMC 设备!
mmc rescan扫描 MMC 设备,扫描当前开发板上所有的 MMC 设备,包括 EMMC 和 SD 卡
mmc part列出 MMC 设备的分区
mmc dev切换 MMC 设备,用于切换当前 MMC 设备
mmc dev 0
切换到 SD 卡,0 为 SD 卡,1 为 eMMC
mmc list列出所有有效的 MMC 设备,查看当前开发板一共有几个 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 寄存器的值

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

1.2 FAT 格式文件系统命令

对于 FAT 格式文件系统的 emmc 文件,uboot 有 fatinfo、fatls、fstype、fatload 和 fatwrite 相关操作命令

1.2.1 fatinfo 命令

令用于查询指定 MMC 设置指定分区的文件系统信息

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

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

1.2.2 fatls命令

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

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

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

eg:查询分区1的文件

1.2.3 fstype 命令

查看 MMC 设备某个分区的文件系统格式

fstype <interface> <dev>:<part>

eg:查询emmc三个分区的文件系统

分区 0 格式未知,因为分区 0 存放的 uboot,并且分区 0 没有格式化,所以文件系统格式未知

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

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

1.2.4 fatload 命令

将指定的文件读取到 DRAM 中

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

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

eg:将 EMMC 分区 1 中的 zImage 文件读取到 DRAM 中的 0X80800000 地址处

1.2.5 fatwrite 命令

将 DRAM 中的数据写入到 MMC 设备中(使用前需要修改板子配置头文件,使能写文件系统,使能如下)

#define CONFIG_FAT_WRITE 

fatwrite 格式

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

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

1.3 EXT 格式文件系统命令

uboot 有 ext2 和 ext4 这两种格式的文件系统的操作命令,常用的就五个命令,分别为: ext2load、ext2ls、ext4load、ext4ls 和 ext4write

命令功能
ext2load从 ext2 文件系统中读文件数据
ext2ls以查询文件和目录
ext4load从 ext4 文件系统中读文件数据
ext4ls以查询文件和目录
ext4write写文件数据

1.4 NAND 操作命令

uboot 是支持 NAND Flash 的,所以也有 NAND Flash 的操作命令,我的开发板没有 nand ,使用没有 nand 操作指令,这里做简单介绍

1.4.1 nand info命令

打印 NAND Flash 信息

1.4.2 nand device命令

用于切换 NAND Flash

1.4.3 nand erase命令

nand erase 命令用于擦除 NAND Flash,在向 NAND Flash 写数据 之前一定要先对要写入的区域进行擦除

nand erase[.spread] [clean] off size //从指定地址开始(off)开始,擦除指定大小(size)的区域。
nand erase.part [clean] partition //擦除指定的分区
nand erase.chip [clean] //全篇擦除

1.4.4 nand write命令

向 NAND 指定地址写入指定的数据,一般和 nand erase 命令配置使用来更新 NAND 中的 uboot、linux kernel 或设备树等文件

nand write addr off size

1.4.5 nand read命令

从 NAND 中的指定地址读取指定大小的数据到 DRAM 中

nand read addr off size

1.4.6 正点原子 NAND 介绍

I.MX6U-ALPHA 开发板出厂系统 NAND 分区如下

0x000000000000-0x0000003FFFFF : "boot"
0x000000400000-0x00000041FFFF : "env"
0x000000420000-0x00000051FFFF : "logo"
0x000000520000-0x00000061FFFF : "dtb"
0x000000620000-0x000000E1FFFF : "kernel"
0x000000E20000-0x000020000000 : "rootfs"

第一个分区存放 uboot,地址范围为 0x0~0x3FFFFF(共 4MB);

第二个分 区存放 env(环境变量),地址范围为 0x400000~0x420000(共 128KB);

第三个分区存放 logo(启 动图标),地址范围为 0x420000~0x51FFFF(共 1MB);

第四个分区存放 dtb(设备树),地址范围为 0x520000~0x61FFFF(共 1MB);

第五个分区存放 kernel(也就是 linux kernel),地址范围为 0x620000~0xE1FFFF(共 8MB);

最后一个分区,存放 rootfs(根文件系统)

1.5 BOOT操作命令

uboot 有相关的 boot (引导)命令来启动 Linux,常用的跟 boot 有关的命令有:bootz、bootm 和 boot

1.5.1 bootz 命令

将 Linux 镜像和设备树文件存到 DRAM 中就行,然后使用 bootz 命令来启动

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

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

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

1.5.2 bootm 命令

bootm 和 bootz 功能类似,但是 bootm 用于启动 uImage 镜像文件

启动内核指令格式

bootm addr

addr 是 uImage 镜像在 DRAM 中的首地址

启动内核同时使用设备树指令

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

addr 是 uImage 在 DRAM 中的首地址,initrd 是 initrd 的地址,fdt 是设备树(.dtb)文件 在 DRAM 中的首地址

1.5.3 boot 命令

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

bootcmd 是一个很重要的环境变量,这个环境变量保存着引导命令,就是启动的命令集合

bootcmd 很重要,比如我们要想使用 tftp 命令从网络启动 Linux 那么就可以设置 bootcmd 为

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

然后使用 saveenv 将 bootcmd 保存起来,然后直接输入 boot 命令即可从网络启动 Linux 系统

uboot 倒计时结束以后就启动 Linux 系统,其实就是执行的 bootcmd 中的启动命令!

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

1.6 其他常用命令

1.6.1 reset 命令

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

1.6.2 go 命令

go 命令用于跳到指定的地址处执行应用

go addr [arg ...]

addr 是应用在 DRAM 中的首地址

1.6.3 run 命令

run 命令用于运行环境变量中定义的命令,比如可以通过 run bootcmd 来运行 bootcmd 中 的启动命令,但是 run 命令最大的作用在于运行我们自定义的环境变量

run 环境变量

1.6.4 mset 命令

mtest 命令是一个简单的内存读写测试命令,可以用来测试自己开发板上的 DDR

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

start是要测试的DRAM 开始地址,end 是结束地址,比如我们测试 0X80000000~0X80001000 这段内存

mtest 80000000 80001000

这里我测试了 284 次

以上是关于Linux系统移植:U-Boot常用指令(下)的主要内容,如果未能解决你的问题,请参考以下文章

Linux系统移植:U-Boot 顶层 Makefile 分析(下)

Linux系统移植:U-Boot 启动流程(下)

Linux系统移植:U-Boot 启动流程(下)

Linux系统移植:NXP 官板 uboot 移植

Linux系统移植:NXP 官板 uboot 移植

Linux系统移植:U-Boot 顶层 Makefile 分析(上)