uboot概述

Bootloader

    在操作系统运行之前运行的一小段代码,用于将软硬件环境初始化到一个合适的状态,为操作系统的加载和运行做准备(其本身不是操作系统)。可以理解为一个比较大的裸机程序。

基本功能

    -> 初始化软硬件环境

    -> 引导加载linux内核

    -> 给linux内核传参

    -> 执行用户命令

注:bootloader是启动引导程序的统称,嵌入式linux常用的bootloader是uboot。

常见的Bootloader

SD卡启动盘制作

SD卡存储结构

    SD卡的存储以扇区为单位,每个扇区的大小为512Byte, 其中零扇区存储分区表(即分区信息),后续的扇区可自行分区和格式化;

   若选择SD卡启动,处理器上电后从第一个扇区开始将其中的内容搬移到内存,所以我们把uboot放到从第一个扇区开始之后的空间, 之后的空间根据个人需求可进行分区和格式化。

【实验四】SD 卡启动盘制作


【实验目的】
掌握SD 卡启动盘的制作方法

 

【实验环境】
1、FS4412 实验平台

 

【实验步骤】
烧写工具默认从0 扇区开始烧写,这里我们自己在uboot 之前放一个512 字节的空镜像


1、将资料中“u-boot 镜像”中的u-boot-fs4412.bin 拷贝到ubuntu 的家目录下

2、在终端输入如下命令,制作一个512 字节的空镜像

$ sudo dd if=/dev/zero of=zero.bin count=1

显示如下信息,则表示制作成功

3、执行如下命令,将uboot 追加到zero.bin 之后生成win-u-boot-fs4412.bin

$ cat zero.bin u-boot-fs4412.bin > win-u-boot-fs4412.bin

4、再执行如下命令,制作一个1M 的空镜像(用于擦除SD 卡中原有的数据)

$ sudo dd if=/dev/zero of=clear.bin count=2048

5、把生成的win-u-boot-fs4412.bin 和clear.bin 拷贝到windows 下

6、将SD 卡插入到电脑上(卡槽/USB 读卡器均可),使其在windows 下识别(若不识别,
可能是已经在ubuntu 中识别了,在可移动设备中将其断开即可)

7、双击打开资料中“ImageWriter”下的“Win32DiskImager”

8、在弹出的界面中先选择要烧写的镜像文件(clear.bin),然后选择要烧写的设备(SD 卡)
最后单击“Write”进行烧写

9、在弹出的对话框中单击“Yes”

10、在弹出的对话框中单击“OK”完成烧写


因为clear.bin 为空镜像,所以写入后SD 卡中的前2048 个扇区中的数据被擦除
 

11、再选择uboot 镜像完(win-u-boot-fs4412.bin),然后单击“Write”进行烧写

12、在弹出的对话框中单击“Yes”

、 

13、在弹出的对话框中单击“OK”完成烧写

14、将SD 卡插入开发板的卡槽,调整拨码开关为SD 卡启动,查看uboot 是否能正常启动
注:uboot 正常启动后LED2 灯会点亮且终端上也会打印uboot 相关的信息

uboot的使用

uboot模式

自启动模式

    uboot启动后若没有用户介入,倒计时结束后会自动执行自启动

    环境变量(bootcmd)中设置的命令(一般作加载和启动内核)

交互模式

    倒计时结束之前按下任意按键uboot进入交互模式交互模式下

    用户可输入uboot命令 

uboot帮助命令

help

    查看uboot支持的所有命令

help 命令

    查看当前命令的使用方法 

uboot环境变量命令

printenv

    打印uboot中所有的环境变量

setenv

    设置指定的环境变量(保存在RAM中)

        setenv 环境变量 环境变量的值 

saveenv

    保存所有环境变量到EMMC

uboot常用环境变量

ipaddr

    uboot的IP地址

serverip

    服务器的IP地址(即ubuntu的IP) 

bootdelay

    进入自启动模式之前倒计时的秒数

uboot网络传输命令

loadb

    通过Kermit协议下载文件到指定的内存地址

        loadb  地址

tftp

    通过tftp协议下载文件到指定的内存地址

        tftp  地址  文件名 

注:使用tftp之前要配置好网络及tftp服务器

uboot存储器访问命令

mmc read

    将EMMC中指定扇区中的内容读取到内存中指定的地址

  mmc read  <addr> <blk#> <cnt>

    addr:  内存地址

  blk#:  EMMC中的扇区编号

  cnt:  读取的扇区的个数

mmc write

    将内存中指定地址中的内容写入到EMMC中指定的扇区

        mmc write <addr> <blk#> <cnt> 

注:MMC相当于硬盘,掉电不丢失

uboot自启动环境变量

bootcmd

    自启动的环境变量

    该环境变量可以设置成一到多个uboot命令的集合(若有多个使用\;分割)

    自启动模式下uboot会按照bootcmd中命令的顺序逐条执行

  eg:

      setenv bootcmd tftp 40008000 interface.bin\;go 40008000

      saveenv

例:

 再次给开发板上电后就会自动运行这两行代码。

uboot自启动参数环境变量

bootarges

        uboot的自启动参数,传递给Linux。

        可以让开发板中的linux精确地挂载到虚拟机上的根文件系统。

 

            eg:

            setenv bootargs root=/dev/nfs nfsroot=xxx.xxx.xxx.xxx:/opt/4412/rootfs     

            rw console=ttySAC2,115200 init=/linuxrc ip=***.***.***.***

            注:

                root        根文件系统类型(nfs)

                nfsroot        网络文件系统路径(xxx.xxx.xxx.xxx:/opt/4412/rootfs)

                rw          操作网络文件系统的权限(rw)

                console        控制台(使用串口2,波特率115200)

                init            init进程的位置(/linuxrc)

                ip              linux启动后自身的IP(***.***.***.***)

uboot内核启动命令

bootm

        启动指定内存地址上的Linux内核并为内核传递参数

        bootm kernel-addr ramdisk-addr dtb-addr

        注:

            kernel-addr:    内核的下载地址 

            ramdisk-addr:    根文件系统的下载地址     

            dtb-addr:        设备树的下载地址

            若不使用相应的地址,对应的位置写“-”

        eg:

            bootm 0x41000000 - 0x42000000

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐