bootloader/u-boot 简介
(1)bootloader概念
boot:引导
loader:加载
- bootloader:用来启动引导和加载内核,即引导启动内核,然后给内核传递参数。
即在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射,从而将系统的软硬件环境带到一个合适的状态,为最终调用操作系统内核搭建好环境。
bootloader属于内核引导程序的统称。包括:u-boot、BIOS(PC)、redboot等等种类。
在嵌入式开发中使用最广泛的bootloader是u-boot。u-boot是一个通用的引导程序,而且同时支持X86、ARM和PowerPC(军工产品使用的架构)等多种处理器架构。
(2)u-boot简介
U-Boot,全称 Universal Boot Loader,是遵循GPL条款的开放源码项目,是由德国DENX小组开发的用于多种嵌入式CPU的开源的bootloader程序。
u-boot具有以下特点:
- u-boot是一个开源的软件,源码短小精悍,拥有较高的可靠性和稳定性;
- u-boot支持多种嵌入式操作系统的内核:Linux、VxWorks、ARTOS, LynxOS等.
- u-boot支持多种架构的平台 :ARM、PowerPC、x86、MIPS等.
- u-boot就是一个裸机代码,用于引导加载内核,启动内核,并给内核传递参数,启动完内核后u-boot的生命周期结束。
- u-boot用于完成部分硬件的初始化 : uart(串口),内存,emmc,网卡等
u-boot 获取和选择
(1)u-boot源码的获取
1、 uboot官网获取
ftp://ftp.denx.de/pub/u-boot/
2、 芯片厂家获取或开发板厂家
3、上级主管 —》推荐
本次移植使用:u-boot-2014.07-netok.tar.bz2
(2)对于uboot版本的选择
- 不要选择太新的版本:不稳定,资料较少
- 不要选择太旧的版本:有可能不支持自己的硬件平台
- 不要选择测试版本u-boot:不稳定;要选择稳定版本的u-boot,后缀有rcx表示测试版本。
- 选择支持自己硬件平台版本的u-boot
uboot 启动方式
(1) 交互模式(人机交互):倒计时减到0之前,按任意键可以进入到交互模式.
(2) 自启动模式:uboot启动倒计减到0之前不按任意键,uboot默认执行bootcmd环境变量中的命令,一条一条的执行。
bootcmd:自启动时的环境变量;
bootargs:自启动参数;启动linux内核时,uboot会将bootargs里的参数传递给内核。
bootcmd=uboot名令1;uboot命令2;uboot名令3;…
自启动环境变量设置,注意:末尾以'\'结束
setenv bootcmd uboot名令1\;uboot命令2\;uboot名令3\;.....
saveenv
eg:使用tftp命令下载uboot到内存中,使用update_mmc将其搬移到EMMC(flash)中:
setenv bootcmd tftp 0x41000000 ubootpak.bin\;update_mmc 2 2ndboot 0x41000000 0x200 0x78000
u-boot 常用命令
help命令
- help :查看当前uboot支持的所有命令
注:uboot中,命令就是一个字符串,uboot收到字符串之后,会解析字符串,完成对应的功能。 - help + 命令:查看指定命令的帮助手册
常用命令有以下这些:
- loadb
loadb 0x43c00000
使用kermit协议,下载二进制文件到内存的指定地址处
flash memery
掉电不丢失 掉电丢失
速度慢 速度快
价格便宜 价格贵
flash访问通过块访问 内存以字节为单位进行访问
每块大小为512字节
-
go
go 0x43c00000(内存地址)
跳转到内存指定的地址处运行程序 -
printenv
打印uboot的环境变量到终端;
uboot对命令进行匹配是部分匹配:pri/print/printenv都可以使用。 -
setenv
设置环境变量
注意:设置完环境变量之后,环境变量存在于内存中,重新上电数据会丢失。
(1)给uboot添加环境变量
setenv 环境变量名 环境变量对应的值
setenv ipaddr 192.168.0.250
注:等号会自动添加
(2)删除环境变量
setenv 要删除的环境变量名
eg:setenv ipaddr
(3)修改环境变量
setenv 旧的环境变量名 新的环境变量值
eg:setenv ipaddr iPaddress
-
saveenv
保存环境变量到flash中
一般操作步骤:
printenv -> setenv -> saveenv
打印环境变量信息 设置环境变量到内存 保存环境变量到flash -
bootm (启动内核时,引导linux内核启动)
bootm 内核的运行地址/ 根文件系统的运行地址/ 设备树的运行地址 / -
ping命令
ping ip地址
ping作用:用于检查开发板和电脑是否正常通信。 -
tftpboot
使用tftp服务,将可执行程序通过网线下载到内存中
tftpboot/tftp 内存地址 要下载的可执行文件
注意:可执行文件必须存放在tftp服务配置是指定的目录下:/home/linux/tftpboot -
u-boot 环境变量
baudrate=115200 :波特率
bootdelay=3 :uboot启动后倒计时时间
gatewayip=192.168.1.1 :网关
ipaddr=192.168.1.250 :开发板的ip地址(ARM开发板)
netmask=255.255.255.0 :子网掩码
serverip=192.168.1.222 :服务器的ip地址(自己PC的IP地址:一般指虚拟机Ubuntu/ifconfig)
u-boot 部署/移植前的准备工作
测试ping命令
(1)设置虚拟机的 IP地址
- 修改电脑的网卡由自动切换到百兆全双工
- 修改ubuntu的ip地址:sudo ifconfig eth0 192.168.1.160
(2)设置开发板的IP地址
setenv serverip 192.168.1.160
setenv ipaddr 192.168.1.200
setenv gatewayip 192.168.1.1
setenv netmask 255.255.255.0
saveenv
(3)测试开发板是否能ping通Ubuntu的连接
在超级终端上执行以下命令:
FS6818# ping 192.168.1.160
(1)ping失败,打印以下信息:
dwmac.c0060000 Waiting for PHY auto negotiation to complete......... TIMEOUT !
Waiting for PHY realtime link...... TIMEOUT !
done
dwmac.c0060000: No link.
ping failed; host 192.168.1.222 is not alive
(2)ping成功,打印以下信息:
Speed: 100, full duplex
Using dwmac.c0060000 device
host 192.168.1.222 is alive
ping失败原因总结:
1)windows的防火墙可能没关
2)检查开发板和电脑之间的网线
3)重启tftp服务
4)检查tftp服务的环境配置是否正确
测试tftp命令
拷贝可执行文件到tftpboot目录下
在超级终端上执行以下命令:
FS6818# tftp 0x43c00000 interface.bin
如果成功,打印以下内容表:
Speed: 100, full duplex
Using dwmac.c0060000 device
TFTP from server 192.168.1.222; our IP address is 192.168.1.250
Filename 'interface.bin'.
Load address: 0x43c00000
Loading: #
708 KiB/s
done
Bytes transferred = 8700 (21fc hex)
FS6818# go 0x43c00000 # 运行代码
tftp失败原因总结:
1)包含上边ping失败的原因
2)检查uboot的环境变量设置是否正确
serverip ipaddr gatewayip netmask
3)检查ubuntu的网络设置
4)切记,开发板和ubuntu的ip地址在同一个网段。