前提引入
BootLoader:
在嵌入式操作系统中,BootLoader是在操作系统内核运行之前运行(芯片上电以后)。可以初始化硬件设备、建立内存空间映射图(比如初始化DDR等外设,将Linux内核从flash等拷贝到DDR,启动Linux等等),从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。(就如同windos上的BIOS一样)
现在常用的BootLoader软件有很多,比如Redboot、ARMboot、U-Boot、Blob等,这里选用较为常用的U-Boot。
简介
U-Boot全称: Universal Boot Loadert,是一个主要用于嵌入式系统的引导加载程序,可以支持多种不同的计算机系统结构,包括PPC、ARM、AVR32、MIPS、x86、68k、Nios与MicroBlaze。这也是一套在GNU通用公共许可证之下发布的自由软件。
编译和烧录
-
在Linux中安装ncurses库
-
将源码进行解压
-
创建shell脚本文件,准备编译
#!/bin/bash
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_ddr512_emmc_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12
第一行是shell脚本格式
第二行 ARCH是指定框架 CROSS_COMPILE 用于指定编译器 distclean 清除工程
第三行是 指定配置源码文件
第四行 V=1 用于设置编译过程的信息输出级别 -j 用于设置主机使用多少线程编译
- 赋予shell文件可执行权限,并编译uboot
- 采用imxdownload工具进行下载,从SD卡启动
- 查看串口输出内容是否正常
uboot输出信息
- uboot 版本号和编译时间
- CPU信息
- 当前的复位原因是 POR
- 当前开发板的名字
- I2C 准备就绪
- DRAM(内存)为512MB
- 当前有两个MMC/SD 卡控制器: FSL_SDHC(0)和 FSL_SDHC(1)
- 显示器型号
- 标准输入、标准输出和标准错误所使用的终端,都使用串口(serial)作为终端
- 切换到emmc的第0个分区,当前uboot是总emmc启动的(之前烧写在sd只是为了方便,现在还是从emmc启动)
- 网口信息,现在还没有连接网线
- 提示正常启动,也就是说 uboot 要从 emmc 里面读取环境变量和参数信息启动内核
- 倒计时提示,默认倒计时 3 秒,按下回车进入Linux命令行,未按回车,倒计时结束后启动内核
对于出现的
Warning - bad CRC, using default environment
问题。
是因为flash扇区或者ERPROM含有的环境变量还没有被初始化,使用saveenv命令(如下)保存环境变量就可以了
U-Boot命令
输入“help”或者“?”,然后按下回车即可查看当前 uboot 所支持的命令
信息查询命令
- bdinfo 查看板子信息
- printenv 输出环境变量信息
- version 查看u-boot版本号
环境变量命令
修改环境变量
- setenv 设置或者修改环境量的值
- saveenv 保存修改后的环境变量
eg:
setenv bootdelay 5
saveenv
将倒计时改为5秒
一般环境变量是存放在外部flash中的,u-boot启动时会将环境变量从flash读取到DRAM中,使用命令setenv修改的是DRAM中的环境变量,修改以后使用saveenv命令将修改后的环境变量保存到flash中(否则下次重启怀惠使用以前的变量)
新建环境变量
- setenv 可用于新建命令
eg:
setenv AAA aaa
saveenv
删除环境变量
- setenv 可用于删除环境变量,只要将变量赋空值即可
eg:
setenv AAA
saveenv
内存操作命令
显示内存值
名称:md
格式:md[.b, .w, .l] address [# of objects]
说明:
- [.b.w.l]是以byte(1个字节)、word(2个字节)和long(4个字节)显示内存值
- adress 查看内存的起始地址
- [# of objects]表示要查看的数据长度(不是字节,与选择的格式有关)
uboot命令中的数字都是十六进制,不是十进制,所以可以不用写“0x”前缀。
eg:
修改指定地址的内存值
名称:nm
格式:nm [.b, .w, .l] address
说明:关键字意义同上
修改指定地址的内存值(地址自增)
名称:**mm **
格式:mm [.b, .w, .l] address
说明:关键字意义同上。使用 mm 修改内存值的时候地址会自增用,使用nm不会自增。
将指定数据填充一段内存
名称:mw
格式:mw [.b, .w, .l] address value [count]
说明:
- value:要填充的数据
- count:填充长度
数据拷贝命令
名称:cp
格式:cp [.b, .w, .l] source target count
说明:
- source:源地址
- target:目的地址
- count:拷贝长度
比较两段内存的数据
名称:cmp
格式:cmp [.b, .w, .l] addr1 addr2 count
说明:
- addr1:第一段内存首地址
- addr2:第二段内存首地址
- count:比较长度
网络操作命令
使用前要保证开发板和PC在同一局域网下
ping 命令
功能:网路是否能用
格式:ping 192.168.xxx.xxx
dhcp 命令
功能:获取IP地址
格式:chcp
nfs命令
功能:nfs(Network File System)网络文件系统,通过nfs实现通过网络来分享资源
格式:nfs [loadAddress] [[hostIPaddr:]bootfilename]
该命令十分重要!
可以在uboot中使用nfs命令将Ubuntu中文件下载到开发板中,这种方式也叫做网络调试
在此期间通过nfs下载遇到了如图问题:
解决方法:
- 在host文件中将开发板的IP地址添加进去,如图
前面是开发板地址,后面是nfs的位置。
保存退出,并且重启
- 兼容性问题
uboot 的版本过低,于Ubuntu中的NFS版本不兼容。
办法:让Ubuntu的NFS兼容V2,修改/etc/default/nfs-kernel-server文件
重启NFS sudo service nfs-kernel-server restart
tftp命令
功能:同nfs一样,将通过网络下载东西到DRAM中
格式:tftpboot[loadAddress][[hostIPaddr:]bootfilename]
(tftp命令可不用输入路径,秩序输入文件名即可)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xAYZcoWF-1615380928381)(D8F7211B227843CC88A5E3F86AC68604)]
EMMC和SD卡操作命令
EMMC和SD可以看作为MMC设备。
mmc一系列命令可以操作MMC设备。
命令 | 描述 |
---|---|
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 [dev] [part] | 设置指定 MMC 设备的 BOOT_BUS_WIDTH 域的值 |
mmc bootpart [dev] [part] | 设置指定 MMC 设备的 boot 和 RPMB 分区的大小 |
mmc partconf [dev] [part] | 设置指定 MMC 设备的 PARTITION_CONFG 域的值 |
mmc rst | 复位 MMC 设备 |
mmc setdsr | 设置 DSR 寄存器的值 |
FAT格式文件操作命令
命令 | 参数 | 描述 |
---|---|---|
fatinfo [<dev[:part]>] | interface 表示接口,interface 表示接口,part 是要查询的分区 | 查询指定 MMC 设置指定分区的文件系统信息 |
fatls [<dev[:part]>] [directory] | part 是要查询的分区 | 查询 FAT 格式设备的目录和文件信息 |
fstype : | 同上 | 查看 MMC 设备某个分区的文件系统格式 |
fatload [<dev[:part]> [ [ [bytes [pos]]]]] | addr是保存在DRAM中的起始地址,filename 是要读取的文件名字,bytes 表示读取多少字节的数据,pos 是要读的文件相对于文件首地址的偏移 | 将指定的文件读取到 DRAM 中 |
fatwrite <dev[:part]> | 备注:使用该命令需要修改配置文件 | 将 DRAM 中的数据写入到 MMC 设备中 |
EXT格式文件系统操作命令
命令 | 描述 |
---|---|
ext2load | 同上fatload |
ext2ls | 同fatls |
ext4load | 同fatload |
ext4ls | 同fatls |
ext4write | fatwrit |
BOOT操作命令
bootz命令
功能:启动linux镜像文件
格式:bootz [addr [initrd[:size]] [fdt]]
- addr: Linux 镜像文件在 DRAM 中的位置
- initrd:initrd 文件在DRAM 中的地址,如果不使用 initrd 的话使用‘-’代替即可
- fdt:设备树文件在 DRAM 中的地址
如果要启动Linux,首先Linux镜像(和设备树文件)要在DRAM中
bootm命令
功能:启动 uImage 镜像文件
格式:bootm addr
(不使用设备树) bootm [addr [initrd[:size]] [fdt]]
(使用设备树)
- addr: Linux 镜像文件在 DRAM 中的位置
- initrd:initrd 文件在DRAM 中的地址,如果不使用 initrd 的话使用‘-’代替即可
- fdt:设备树文件在 DRAM 中的地址
boot命令
功能:启动Linux系统
boot会读取环境变量 bootcmd 来启动 Linux 系统。bootcmd 环境变量保存着引导命令,是启动的命令集合,可以修改。
eg:
setenv bootcmd 'fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull-emmc.dtb; bootz80800000 - 83000000'
saveenv
boot
其他命令
reset命令
功能:复位
go命令
功能:跳转到指定的地址处执行应用
格式:go addr [arg...]
- addr:应用在DRAM中的首地址
- arg…:应用名称
run命令
功能:运行环境变量中定义的命令
主要用于运行自定义环境变量,可以通过不同的环境变量来实现不同的启动方式。
eg:
setenv mybootemmc 'fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull-emmc.dtb;bootz 80800000 - 83000000'
setenv mybootnet 'tftp 80800000 zImage; tftp 83000000 imx6ull-alientek-emmc.dtb; bootz
80800000 - 83000000'
saveenv
run mybootemmc
run mybootnet
miest命令
功能:内存读写命令
格式:mtest [start [end [pattern [iterations]]]]
- start:测试的DRAM 开始地址
- end: 结束地址