嵌入式开发之Linux系统移植3-uboot的烧写及使用
1.何为uboot
1.1.Linux系统的启动过程
用一个动画来说明开发板如何引导Linux启动的,以三星Exynos4412开发板为例:
- 首先是三星公司在SOC内部有一部分固件BL0,通电自启,启动后会读取拨码开关,用来判断启动来源,SD卡还是EMMC?
- 然后通过目标位置读取我们准备好的一段bootloader程序,并启动bootloader。
- 再往后,BL0工作结束,任务交接给bootloader。bootloader来往内存中搬运,Linux运行需要的核心内容,Linux内核、dtb、rootfs.
- 内存搬运完成后,启动Linux来工作,自己停止工作。
- Linux内部被启动后,然后加载运行环境和rootfs等
1.1.1. Bootloader
在操作系统运行之前运行的一小段代码,用于将软硬件环境初始化到
一个合适的状态,为操作系统的加载和运行做准备(其本身不是操作系统)
1.2.Bootloader基本功能
-> 初始化软硬件环境
-> 引导加载linux内核
-> 给linux内核传参
-> 执行用户命令
注:bootloader是启动引导程序的统称,嵌入式linux常用的bootloader是uboot
1.3.常见的Bootloader
2.uboot启动盘的制作
2.1.资料准备
- u-boot 镜像(镜像的制作,后续发出)
- Ubuntu操作系统环境,可以上虚拟机
- ImageWriter 工具,写入SD
2.2。SD卡存储结构
SD卡的存储以扇区为单位,每个扇区的大小为512Byte, 其中零扇区存储分区表(即分区信息),后续的扇区可自行分区和格式化;
若选择SD卡启动,处理器上电后从第一个扇区开始将其中的内容搬移到内存,所以我们把uboot放到从第一个扇区开始之后的空间, 之后的空间根据个人需求可进行分区和格式化
2.3.操作步骤
烧写工具默认从0扇区开始烧写,这里我们自己在uboot之前放一个512字节的空镜像,因为BL0是从1扇区开始读取,三星告诉我们的。
-
1、u-boot镜像”中的u-boot-fs4412.bin拷贝到ubuntu的家目录下
-
2、在终端输入如下命令,制作一个512字节的空镜像
$sudoddif=/dev/zeroof=zero.bincount=1
- 3、执行如下命令,将uboot追加到zero.bin之后生成win-u-boot-fs4412.bin
$catzero.binu-boot-fs4412.bin>win-u-boot-fs4412.bin
- 4、再执行如下命令,制作一个1M的空镜像(用于擦除SD卡中原有的数据)
$sudoddif=/dev/zeroof=clear.bincount=2048
-
5、把生成的win-u-boot-fs4412.bin和clear.bin拷贝到windows下
-
6、将SD卡插入到电脑上(卡槽/USB读卡器均可),使其在windows下识别
-
7、ImageWriter”下的“Win32DiskImager”,把2个镜像文件分两次写入SD,之所以要clear.bin这个空文件,是防止SD卡有内容造成镜像不正确
-
8、通过一下几个图来写
- 9、SD卡插入开发板的卡槽,调整拨码开关为SD卡启动,查看uboot是否能正常启动
注:uboot正常启动后LED2灯会点亮且终端上也会打印uboot相关的信息
3.uboot的使用
3.1.uboot模式
- 自启动模式
uboot启动后若没有用户介入,倒计时结束后会自动执行自启动
环境变量(bootcmd)中设置的命令(一般作加载和启动内核) - 交互模式
倒计时结束之前按下任意按键uboot会进入交互模式,交互模式下
用户可输入uboot命令
3.2.uboot帮助命令
-
help
查看uboot支持的所有命令 -
help 命令
查看当前命令的使用方法
3.3.uboot环境变量命令
-
printenv
打印uboot中所有的环境变量 -
setenv
设置指定的环境变量(保存在RAM中)
setenv 环境变量 环境变量的值 -
ssaveenv
保存所有环境变量到EMMC中
3.4.uboot常用环境变量
-
ipaddr
uboot的IP地址 -
serverip
服务器的IP地址(即ubuntu的IP) -
bootdelay
进入自启动模式之前倒计时的秒数
3.5.uboot网络传输命令
- loadb
通过Kermit协议下载文件到指定的内存地址
loadb 地址 - tftp
通过tftp协议下载文件到指定的内存地址
tftp 地址 文件名
注:使用tftp之前要配置好网络及tftp服务器
3.5.uboot存储器访问命令
- mmc read
将EMMC中指定扇区中的内容读取到内存中指定的地址
mmc read <addr> <blk#> <cnt>
addr: 内存地址
blk#: EMMC中的扇区编号
cnt: 读取的扇区的个数 - mmc write
将内存中指定地址中的内容写入到EMMC中指定的扇区
mmc write <addr> <blk#> <cnt>
3.6.uboot自启动环境变量
-
bootcmd
自启动的环境变量
该环境变量可以设置成一到多个uboot命令的集合(若有多个使用;分割)
自启动模式下uboot就会按照bootcmd中命令的顺序逐条执行eg:
setenv bootcmd tftp 40008000 interface.bin;go 40008000
saveenv
下一结,实战
- 点赞
- 收藏
- 关注作者
评论(0)