U-Boot 简介

本文介绍了U-Boot作为Linux系统启动所需的bootloader,详细讲解了其功能、常见版本以及如何在Ubuntu环境下编译U-Boot。通过实例展示了针对512MB+8G EMMC核心板的编译过程,并指导如何烧录到SD卡,使用IMXdownload工具进行启动。同时,文中还涵盖了U-Boot的命令行操作,包括帮助、信息查询、环境变量、内存、网络、存储设备及文件系统等命令的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

U-Boot 简介

1、Linux 系统要启动就必须需要一个 bootloader 程序,也就说芯片上电以后先运行一段bootloader程序。这段 bootloader程序会先初始化 DDR等外设,然后将 Linux内核从 flash(NAND,NOR FLASH, SD, MMC 等)拷贝到 DDR 中,最后启动 Linux 内核。
2、有很多现成的 bootloader 软件可以使用,比如 U-Boot、 vivi、 RedBoot 等等,其中以 U-Boot 使用最为广泛.
3、uboot 的全称是 Universal Boot Loader, uboot 是一个遵循 GPL 协议的开源软件, uboot 是一个裸机代码,可以看作是一个裸机综合例程。现在的 uboot 已经支持液晶屏、网络、 USB 等高级功能。 uboot 官网为 http://www.denx.de/wiki/U-Boot/
4、我们一般不会直接用 uboot 官方的 U-Boot 源码的。 uboot 官方的 uboot 源码是给半导体厂商准备的,半导体厂商会下载 uboot 官方的 uboot 源码,然后将自家相应的芯片移植进去。也就是说半导体厂商会自己维护一个版本的 uboot,这个版本的 uboot 相当于是他们定制的。既然是定制的,那么肯定对自家的芯片支持会很全,虽然 uboot 官网的源码中一般也会支持他们的芯片,但是绝对是没有半导体厂商自己维护的 uboot 全面.
5、NXP 就 维 护 的 2016.03 这 个 版 本 的 uboot , 下 载 地 址 为 :http://git.freescale.com/git/cgit.cgi/imx/uboot-imx.git/tag/?h=imx_v2016.03_4.1.15_2.0.0_ga&id=rel_imx_4.1.15_2.1.0_ga
6、三种 uboot 的区别
种类 描述
uboot 官方的 uboot 代码 由 uboot 官方维护开发的 uboot 版本,版本更新快,基本包含所有常用的芯片。
半导体厂商的 uboot 代码 半导体厂商维护的一个 uboot,专门针对自家的芯片,在对自家芯片支持上要比 uboot 官方的好。
开发板厂商的 uboot 代码 开发板厂商在半导体厂商提供的 uboot 基础上加入了对自家开发板的支持。

U-Boot 初次编译

1、首先在 Ubuntu 中安装 ncurses 库, 否则编译会报错,安装命令如下:sudo apt-get install libncurses5-dev
2、使用如下命令对其进行解压缩: tar -vxjf uboot-imx-2016.03-2.1.0-g8b546e4.tar.bz2
3、如果使用的是 512MB+8G 的 EMMC 核心板,使用如下命令来编译对应的 uboot:
新建名为 mx6ull_alientek_emmc.sh 的 shell 脚本文件,然后在里面输入如下内容:
#!/bin/bash #必须是“ #!/bin/bash”或者“ #!/bin/sh”
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean #清理工程,ARCH指定架构,CROSS_COMPILE指定编译器
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_ddr512_emmc_defconfig #配置 uboot,配置文件都在 uboot/configs目录中
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12 # V=1 用于设置编译过程的信息输出级别; -j 用于设置主机使用多少线程编译uboot,最好设置成我们虚拟机所设置的核心数

U-Boot 烧写与启动

uboot 编译好以后就可以烧写到板子上使用了,这里我们跟前面裸机例程一样,将 uboot烧写到 SD 卡中,然后通过 SD 卡来启动来运行 uboot。使用 imxdownload 软件烧写,命令如下:
chmod 777 imxdownload //给予 imxdownload 可执行权限,一次即可
./imxdownload u-boot.bin /dev/sdd
等待烧写完成,完成以后将 SD 卡插到 I.MX6U-ALPHA 开发板上, BOOT 设置从 SD 卡启动,使用 USB 线将 USB_TTL 和电脑连接,也就是将开发板的串口 1 连接到电脑上。打开SecureCRT,设置好串口参数并打开,最后复位开发板。

U-Boot 命令使用

1、进入 uboot 的命令行模式以后输入“ help”或者“?”,然后按下回车即可查看当前 uboot 所支持的命令
2、输入“ help(或?) 命令名”既可以查看命令的详细用法,以“ bootz”这个命令为例,我们输入如下命令即可查看“ bootz”这个命令的用法:? bootz 或 help bootz
3、信息查询命令
bdinfo  用于查看板子信息
printenv 用于输出环境变量信息
version 用于查看 uboot 的版本号
4、环境变量操作命令
setenv 用于设置或者修改环境变量的值
saveenv 用于保存修改后的环境变量
一般环境变量是存放在外部 flash 中的,uboot 启动的时候会将环境变量从 flash 读取到 DRAM 中。所以使用命令 setenv 修改的是 DRAM中的环境变量值,修改以后要使用 saveenv 命令将修改后的环境变量保存到 flash 中,否则的话
uboot 下一次重启会继续使用以前的环境变量值。
比如我们要将环境变量 bootdelay 改为 5,就可以使用如下所示命令:
setenv bootdelay 5
saveenv
有时候我们修改的环境变量值可能会有空格, 比如 bootcmd、 bootargs 等, 这个时候环境变
量值就得用单引号括起来,比如下面修改环境变量 bootcmd 的值:
setenv bootcmd 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
saveenv
命令 setenv 也可以用于新建命令,用法就是修改环境变量一样,比如我们新建一个环境变
量 author, author 的值为我的名字拼音: zuozhongkai,那么就可以使用如下命令:
setenv author zuozhongkai
saveenv
删除环境变量也是使用命令 setenv,
要删除一个环境变量只要给这个环境变量赋空值即可,比如我们删除掉上面新建的 author 这个
环境变量,命令如下:
setenv author
saveenv
5、内存操作命令
md 命令用于显示内存值,格式如下:
md[.b, .w, .l] address [# of objects]
命令中的[.b .w .l]对应 byte、 word 和 long,也就是分别以 1 个字节、 2 个字节、 4 个字节
来显示内存值。 address 就是要查看的内存起始地址, [# of objects]表示要查看的数据长度,这
个数据长度单位不是字节,而是跟你所选择的显示格式有关。比如你设置要查看的内存长度为
20(十六进制为 0x14),如果显示格式为.b 的话那就表示 20 个字节;如果显示格式为.w 的话就
表示 20 个 word,也就是 20*2=40 个字节;如果显示格式为.l 的话就表示 20long,也就是
20*4=80 个字节。另外要注意:
uboot 命令中的数字都是十六进制的!不是十进制的!
比如你想查看以 0X80000000 为起始地址的内存数据
md.b 80000000 10 //以.b 格式显示,长度为 0x10,也就是 16 个字节;
md.w 80000000 10 //以.w 格式显示,长度为 0x10,也就是 16*2=32个字节;
md.l 80000000 10 //以.l 格式显示,长度也是 0x10,也就是 16*4=64 个字节。

nm 命令用于修改指定地址的内存值,命令格式如下:
nm [.b, .w, .l] address
nm 命令同样可以以.b、 .w 和.l 来指定操作格式,比如现在以.l 格式修改 0x80000000 地址
的数据为 0x12345678。输入命令:
nm.l 80000000

mm 命令也是修改指定地址内存值的,使用 mm 修改内存值的时候地址会自增,而使用命
令 nm 的话地址不会自增。

mw 用于使用一个指定的数据填充一段内存,命令格式如下:
mw [.b, .w, .l] address value [count]
mw 命令同样可以以.b、 .w 和.l 来指定操作格式, address 表示要填充的内存起始地址, value
为要填充的数据, count 是填充的长度。比如使用.l 格式将以 0X80000000 为起始地址的 0x10 个
内存块(0x10 * 4=64 字节)填充为 0X0A0A0A0A,命令如下:
mw.l 80000000 0A0A0A0A 10

cp 是数据拷贝命令,用于将 DRAM 中的数据从一段内存拷贝到另一段内存中,或者把 Nor
Flash 中的数据拷贝到 DRAM 中。命令格式如下:
cp [.b, .w, .l] source target count
cp 命令同样可以以.b、 .w 和.l 来指定操作格式, source 为源地址, target 为目的地址, count
为拷贝的长度。我们使用.l 格式将 0x80000000 处的地址拷贝到 0X80000100 处,长度为 0x10 个
内存块(0x10 * 4=64 个字节),命令如下所示:
cp.l 80000000 80000100 10

cmp 是比较命令,用于比较两段内存的数据是否相等,命令格式如下:
cmp [.b, .w, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值