一、bootloader与uboot简介
1)Bootloader是硬件启动的引导程序,是运行操作系统的前提;
2)在操作系统内核或用户应用程序运行之前的一小段代码。对软硬件进行相应的初始化和设定,为最终运行操作系统准备好环境;
3)在嵌入式系统中,整个系统启动加载任务通常有Bootloader来完成。
特点:
1)Bootloader不属于操作系统,一般采用汇编语言和C语言开发。需要针对特定的硬件平台编写;
2)在移植系统时,首先为开发板移植Bootloader;
3)Bootloader不但依赖于CPU的体系结构,而且依赖于嵌入式系统班级设备的配置;
Bootloader的操作模式:
1)自启动模式:在这种模式下,Bootloader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。
2)交互模式:在这种模式下,目标机的Bootloader将通过串口或网络等通信手段从开发主机上下载内核映像和跟文件系统等到RAM中。可以在Bootloader中通过命令写到目标机上的固态存储介质中,或者直接进行系统的引导,也可以通过串口接收用户的命令。
Bootloader宏观上的基本功能:
1)初始化相关硬件;
2)把bootloader自搬运到内存中
3)执行用户的命令
4)加载并执行内核
常用Bootloader介绍:
bootloader是启动代码的统称或者说是类别的统称,常见的bootloader有U-boot(ARM架构常用)、GRUB(X86架构常用的)。
U-boot介绍:
u-boot是德国DENX小组开发用于多种嵌入式CPU的BootLoader程序。遵循GPL条款。
U-boot特点:
代码结构清晰、易于移植(见源码目录结构)
支持多种CPU处理器体系结构(见arch目录)
支持众多开发板(见board目录)
命令丰富、有监控功能
支持网络协议、USB/SD等多种协议和设备
支持文件系统
更新活跃,使用者多,有助于解决问题
二、U-boot命令介绍
1)命令分类:
环境设置、数据传输、存储器访问、加载运行
printenv 显示所有环境变量,另外还有(bdinfo 和 version)
printenv
setenv 设置新的环境变量
setenv myboard FS4412 #设置一个新的环境变量名字为myboard
setenv ipaddr 192.168.0.1 #设置开发板的IP地址
setenv bootdelay 5 #将bootdelay环境变量的值该为5
saveenv 将当前定义的所有环境变量值保存人flash中
saveenv
网络相关的常用环境变量:
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
ping 命令
ping 命令验证开发板的网络能否使用,是否可以和服务器(Ubuntu 主机)进行通信。
dhcp 命令
dhcp 用于从路由器获取 IP 地址,前提得开发板连接到路由器上的
nfs 命令
nfs 命令将 Ubuntu 中的文件下载到开发板的 DRAM 中,命令格式:
nfs [loadAddress] [[hostIPaddr:]bootfilename]
loadAddress 是要保存的 DRAM 地址,[[hostIPaddr:]bootfilename]是要下载的文件地址。实例如下:
nfs 80800000 192.168.1.253:/home/zuozhongkai/linux/nfs/zImage
tftp 命令
通过网络下载程序(前提是需要在 Ubuntu 上搭建 TFTP 服务器)
tftp 41000000 zImage #下载内核镜像
loadb 通过串口kemit协议下载二进制数据
内存调试相关命令:
md 显示内存区的内容;
mm 修改指定地址的内存值,地址自动递增;
nm 修改指定地址的内存值,地址不递增;
mw 填充内存;
mtest 测试内存;
cp 在不同的内存区域间复制内容;
cmp 用于比较两段内存的数据是否相等;
MMC命令:
mmc info 命令
查看MMC设备信息
mmc info
mmc list 命令
用于来查看当前开发板一共有几个 MMC 设备
mmc list
mmc dev 命令
用于切换当前 MMC 设备
命令格式:mmc dev [dev] [part]
其中 [dev]用来设置要切换的 MMC 设备号,[part]是分区号。如果不写分区号的话默认为分区 0。
mmc dev 0
mmc part 命令
查看其分区
mmc part
mmc read 命令
用于读取 mmc 设备的数据,命令格式如下:
mmc dev 1 0 //切换到 MMC 分区 0
mmc read addr blk# cnt //读取数据
mmc write 命令
用于将数据写到 MMC 设备里面,命令格式如下:
mmc write addr blk# cnt
mmc dev 0 0
mmc write 80800000 2 32E
mmc erase 命令
擦除 MMC 设备的指定块就是用命令“mmc erase”,命令格式如下:
mmc erase blk# cnt
blk 为要擦除的起始块,cnt 是要擦除的数量。
BOOT 操作命令:
bootz 命令
用于启动 zImage 镜像文件, 命令格式如下:
bootz [addr [initrd[:size]] [fdt]]
addr 是 Linux 镜像文件在 DRAM 中的位置;initrd 是 initrd 文件在DRAM 中的地址,如果不使用 initrd 的话使用‘-’代替即可;fdt 就是设备树文件在 DRAM 中的地址。
实例:
tftp 80800000 zImage
tftp 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb
bootz 80800000 - 83000000
FAT 格式文件系统操作命令
fatinfo 命令
用于查询指定 MMC 设备分区的文件系统信息,格式如下:
fatinfo <interface> [<dev[:part]>]
interface 表示接口,比如 mmc,dev 是查询的设备号,part 是要查询的分区。如:
fatinfo mmc 1:1
fatls 命令
用于查询 FAT 格式设备的目录和文件信息,命令格式如下:
fatls <interface> [<dev[:part]>] [directory]
比如查询 EMMC 分区 1 中的所有的目录和文件,输入命令:
fatls mmc 1:1
fstype 命令
用于查看 MMC 设备某个分区的文件系统格式,命令格式如下:
fstype <interface> <dev>:<part>
实例:
fstype mmc 1:0
fatload 命令
用于将指定的文件读取到 DRAM 中,命令格式如下:
fatload <interface> [<dev[:part]> [<addr> [<filename> [bytes [pos]]]]]
interface 为接口,比如 mmc,dev 是设备号,part 是分区,addr 是保存在 DRAM 中的起始
地址,filename 是要读取的文件名字。bytes 表示读取多少字节的数据,如果 bytes 为 0 或者省
略的话表示读取整个文件。pos 是要读的文件相对于文件首地址的偏移,如果为 0 或者省略的
话表示从文件首地址开始读取。实例如下
fatload mmc 1:1 80800000 zImage
其他常用命令
reset 命令
用于重启
reset
go 命令
用于跳到指定的地址处执行应用,命令格式如下:
go addr [arg ...]
addr 是应用在 DRAM 中的首地址,实例如下:
tftp 87800000 printf.bin
go 87800000
run 命令
用于运行环境变量中定义的命令,但是 run 命令最大的作用在于运行我们自定义的环境变量。
setenv mybootemmc 'fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb;bootz 80800000 - 83000000'
saveenv
run mybootemmc
至此,uboot 常用的命令就讲解完了,如果要使用 uboot 的其他命令,可以查看 uboot 中的帮助信息,或者上网查询一下相应的资料。