Linux: Uboot 1

1. Uboot是一个裸机程序,就是一个bootloader,作用就是用于启动Linux或其他系统。Uboot最主要的工作就是初始化DDR。因为Linux是运行在DDR里面的。一般Linux镜像zImage(uImage)+设备树(.dtb)存放在SD、EMMC、NAND、SPI FLASH等外置存储区域。
这里就牵扯一个问题,需要将Linux镜像从外置flash copy到DDR中,再去启动。
Uboot的主要目的就是为系统的启动做准备。
Uboot不仅仅能启动Linux,也可以启动其他系统,比如vxworks。
Linux不仅仅能通过Uboot启动。
Uboot是一个通用的bootloader,他支持多种架构。
Uboot官网:The U-Boot Documentation — Das U-Boot unknown version documentation
1). 首先就是Uboot官网
2). SOC厂商会从Uboot官网下载某一个版本的Uboot,然后在这个版本的Uboot上加入相应的SOC以及驱动。这就是SOC厂商定制版的Uboot。比如NXP官方的I.MX6ULL EVK板子。
3). 做开发板的厂商,开发板会参考SOC厂商的板子。开发板必然会和官方的板子不一样。因此开发板厂商又会去修改SOC厂商做好的Uboot,以适应自己的板子。

2. U-Boot编译

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- xxx_ddr512_emmc_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12

编译完成后生成一个u-boot.bin。必须向u-boot.bin添加头部信息。Uboot编译最后会通过/tools/mkimage软件添加头部信息,生成u-boot.imx。
如果配置过Uboot,后面一定要注意shell脚本会清除整个工程,配置的文件也会删除,配置项也会被删除掉。为了方便开发,可以在Uboot顶层Makefile顶层里面设置好ARCH和CROSS_COMPILE这两个变量的值。

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

4. U-Boot commands

EMMC/SD card:

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 寄存器的值。
mmc erase 擦除MMC设备

5. fat文件系统命令
fatinfo mmc 0:1
fatls mmc 1:1
fstype mmc 1:0
fatload mmc 1:1 80800000 zImage
fatwrite mmc 1:1 80800000 zImage 6788f8

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

7. nand操作命令
nand info
nand device
nand device 用于切换 NAND Flash,如果你的板子支持多片 NAND 的话就可以使用此命令
来设置当前所使用的 NAND。这个需要你的 CPU 有两个 NAND 控制器,并且两个 NAND 控制
器各接一片 NAND Flash。就跟 I.MX6U 有两个 SDIO 接口,这两个 SDIO 接口可以接两个 MMC
设备一样。不过一般情况下 CPU 只有一个 NAND 接口,而且在使用中只接一片 NAND。
nand erase
nand erase 命令用于擦除 NAND Flash,NAND Flash 的特性决定了在向 NAND Flash 写数据
之前一定要先对要写入的区域进行擦除。“nand erase”命令有三种形式:
nand erase[.spread] [clean] off size //从指定地址开始(off)开始,擦除指定大小(size)的区域。
nand erase.part [clean] partition //擦除指定的分区
nand erase.chip [clean]
//全篇擦除
NAND 的擦除命令一般是配合写命令的,后面讲解 NAND 写命令的时候在演示如何使用
“nand erase”。
nand write
此命令用于向 NAND 指定地址写入指定的数据,一般和“nand erase”命令配置使用来更新
NAND 中的 uboot、linux kernel 或设备树等文件,命令格式如下:
nand write addr off size
addr 是要写入的数据首地址,off 是 NAND 中的目的地址,size 是要写入的数据大小。

nand read
此命令用于从 NAND 中的指定地址读取指定大小的数据到 DRAM 中,命令格式如下:
nand read addr off size
addr 是目的地址,off 是要读取的 NAND 中的数据源地址,size 是要读取的数据大小。比
如我们读取设备树(dtb)文件到 0x83000000 地址处,命令如下:
nand read 0x83000000 0x520000 0x19000

8. fdt命令
设备树文件读取到 DRAM 中以后就可以使用 fdt 命令来对设备树进行操作了,首先设置 fdt
的地址,fdt 地址就是 DRAM 中设备树的首地址,命令如下:
fdt addr 83000000
设置好以后可以使用“fdt header”来查看设备树的头信息,输入命令:
fdt header
fdt print

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

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

tftp 80800000 zImage
tftp 83000000 xxx-emmc-7-1024x600-c.dtb
bootz 80800000 - 83000000

如果我们要从 EMMC 中启
动 Linux 系统的话只需要使用命令 fatload 将 zImage 和 xxx-emmc-7-1024x600-c.dtb 从
EMMC 的分区 1 中拷贝到 DRAM 中,然后使用命令 bootz 启动即可

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

2) 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 为空的话,同样是用“-”来替代。

3) boot
boot 命令也是用来启动 Linux 系统的,只是 boot 会读取环境变量 bootcmd 来启动 Linux 系
统,bootcmd 是一个很重要的环境变量!其名字分为“boot”和“cmd”,也就是“引导”和“命
令”,说明这个环境变量保存着引导命令,其实就是启动的命令集合,具体的引导命令内容是可
以修改的。比如我们要想使用 tftp 命令从网络启动 Linux 那么就可以设置 bootcmd 为“tftp
80800000 zImage; tftp 83000000 xxx-emmc-7-1024x600-c.dtb; bootz 80800000 -
83000000”,然后使用 saveenv 将 bootcmd 保存起来。然后直接输入 boot 命令即可从网络启动
Linux 系统,命令如下:

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

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

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

在启动 Linux 内核的时候可能会遇到如下错误:
“Kernel panic – not Syncing: VFS: Unable to mount root fs on unknown-block(0,0)”
这个错误的原因是 linux 内核没有找到根文件系统,这个很正常,因为没有设置 uboot 的
bootargs 环境变量

10. 其他常用命令
reset
go addr [arg ...]
run
run 命令用于运行环境变量中定义的命令,比如可以通过“run bootcmd”来运行 bootcmd 中
的启动命令,但是 run 命令最大的作用在于运行我们自定义的环境变量。在后面调试 Linux 系
统的时候常常要在网络启动和 EMMC/NAND 启动之间来回切换,而 bootcmd 只能保存一种启
动方式,如果要换另外一种启动方式的话就得重写 bootcmd,会很麻烦。这里我们就可以通过
自定义环境变量来实现不同的启动方式,比如定义环境变量 mybootemmc 表示从 emmc 启动,
定义 mybootnet 表示从网络启动,定义 mybootnand 表示从 NAND 启动。如果要切换启动方式
的话只需要运行“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 mybootnand 'nand read 80800000 4000000 800000;nand read 83000000 6000000
100000;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 mytoobnand

run mybootnet

mtest
mtest 命令是一个简单的内存读写测试命令,可以用来测试自己开发板上的 DDR,命令格
式如下:mtest [start [end [pattern [iterations]]]]
start 是要测试的 DRAM 开始地址,end 是结束地址,比如我们测试 0X80000000~0X80001000
这段内存,输入“mtest 80000000 80001000”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值