嵌入式开发之Linux系统移植3-uboot的烧写及使用

举报
神龙居市 发表于 2022/03/27 15:24:43 2022/03/27
【摘要】 1.何为uboot 1.1.Linux系统的启动过程用一个动画来说明开发板如何引导Linux启动的,以三星Exynos4412开发板为例:首先是三星公司在SOC内部有一部分固件BL0,通电自启,启动后会读取拨码开关,用来判断启动来源,SD卡还是EMMC?然后通过目标位置读取我们准备好的一段bootloader程序,并启动bootloader。再往后,BL0工作结束,任务交接给bootloa...

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

image.png

20220327_131535_gif.gif

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的家目录下
    image.png

  • 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、通过一下几个图来写
    image.png

image.png
image.png

  • 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

下一结,实战

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。