2 U-Boot开发
2.1 U-Boot源码说明
进入U-Boot源码目录,执行如下命令,查看U-Boot源码目录。
Host#ls -l
2.2配置U-Boot
U-Boot可使用menuconfig进行配置,请参考“配置内核选项”章节,配置menuconfconfig所需依赖环境。
在LinuxSDK源码目录下,执行如下命令先编译一次U-Boot,脚本会在U-Boot目录下执行"make rv1126b_defconfig"生成".config"文件。
Host#./build.sh uboot
在LinuxSDK源码目录下,执行如下命令,进入"u-boot"目录,通过menuconfig配置U-Boot。
Host#cd u-boot/
Host#make menuconfig //通过menuconfig进行U-Boot配置
在U-Boot目录下执行如下命令,更新defconfig文件。
Host#make savedefconfig //在U-Boot目录下生成新的defconfig文件
Host#mv defconfig configs/rv1126b_defconfig //更新U-Boot的defconfig配置文件
2.3编译U-Boot
在LinuxSDK源码目录下执行如下命令,配置编译选项,并单独编译U-Boot镜像。
Host#./build.sh uboot //执行build.sh脚本编译U-Boot
备注:U-Boot编译会将"rkbin/bin/rk35/"目录下的bl31固件一起编译。编译后在LinuxSDK源码"u-boot"目录下生成U-Boot SPL镜像rv1126b_spl_loader_v1.09.105.bin、和U-Boot镜像uboot.img。
2.4替换U-Boot
我司已提供U-Boot镜像uboot.img文件,位于产品资料“4-软件资料\Linux\U-Boot\image\u-boot-2017.09-[版本号]-[Git系列号]\”目录下。
其中uboot.img文件可通过评估板文件系统固化至系统启动卡或eMMC。亦可通过瑞芯微开发工具RKDevTool固化至eMMC。
备注:通过瑞芯微开发工具RKDevTool替换方式不支持固化U-Boot镜像至系统启动卡。
(1)通过命令行替换
请从系统启动卡或eMMC启动系统,请将U-Boot镜像uboot.img文件拷贝至评估板root目录下,执行如下命令将其固化至系统启动卡或eMMC。
备注:如需固化至系统启动卡,请将设备节点修改为"/dev/mmcblk1p1"。
Target#dd if=uboot.img of=/dev/mmcblk0p1 conv=fsync //替换U-Boot镜像到对应存储分区
Target#reboot
(2)通过瑞芯微开发工具替换
请确保评估板Micro SD卡槽未插入Micro SD卡,并使用Type-C线将评估板USB 3.0 DRD接口连接至PC机USB接口。
备注:在进行本次操作前,需确保eMMC已固化完整系统镜像。
请参考《Linux系统固化手册》文档安装瑞芯微开发工具RKDevTool。将U-Boot镜像uboot.img文件拷贝至Windows非中文工作目录下。
a)打开瑞芯微开发工具,点击选择待替换的U-Boot镜像uboot.img,并勾选对应选项。
b)长按评估板的USER1(KEY3)按键,将评估板上电启动,等待瑞芯微开发工具提示“发现一个LOADER设备”后松开USER1(KEY3)按键。
c)点击“设备分区表”,在弹出的询问窗口中点击“是(Y)”。
d)点击“确定”完成分区表更新。
e)点击“执行”按钮,固化镜像,固化完成后,瑞芯微开发工具提示“下载完成”,评估板会自动重启,等待评估板重启进入系统后,即可生效。
2.5 U-Boot使用说明
2.5.1 U-Boot命令进入方式
评估板上电启动后,在U-Boot倒计时结束之前按下"Ctrl + C"进入U-Boot命令行模式。
U-Boot#help
2.5.2环境变量说明
(1)环境变量存储
执行命令"setenv"或"env default -f -a"修改的是运行空间中的环境变量值,须使用saveenv命令将修改后的环境变量保存起来。否则U-Boot重启后,将会使用修改前的环境变量值。环境变量修改完成后,执行reset命令,即可使用修改后的U-Boot环境变量启动。
U-Boot#env default -f -a
U-Boot#saveenv
U-Boot#reset
(2)默认配置信息
在U-Boot命令行执行printenv命令可查看环境变量,如下提供主要U-Boot环境变量的解析说明。不同版本的U-Boot,环境变量可能会有所不同,内容仅供参考。
/*系统启动时,记录启动次数,默认不开启这个功能,需设置boottest环境变量为1才会开启*/
boottestcount=if test $boottest = 1;then setexpr bootcount ${bootcount} + 1;saveenv;echo boottest=1 bootcount: ${bootcount};fi
/*根据环境变量devtype、devnum,从eMMC或Micro SD读取内核镜像以及设备树镜像,然后启动Linux*/
bootcmd=boot_fit;boot_android ${devtype} ${devnum};
/*评估板名字为evb_rv1126b*/
board_name=evb_rv1126b
/*启动延时为0秒*/
bootdelay=0
/*读取设备树文件至DDR地址0x48300000*/
fdt_addr_r=0x48300000
/*读取内核镜像至DDR地址0x45480000*/
kernel_addr_r=0x45480000
/*mmc启动命令。配置mmc启动参数*/
mmc_boot=if mmc dev ${devnum}; then setenv devtype mmc; run scan_dev_for_boot_part; fi
/*USB启动命令。配置USB启动参数*/
usb_boot=usb start; if usb dev ${devnum}; then setenv devtype usb; run scan_dev_for_boot_part; fi
(3)环境变量修改
本次修改以修改启动延时为1秒为例。
U-Boot#setenv bootdelay 1
2.5.3Kernel参数传递
通过U-Boot命令行使用printenv命令看到Kernel参数。
亦可观察内核启动阶段的Kernel参数。
(1)root参数
指定根文件系统位置,如"root=/dev/mmcblk0p6"表示根文件系统位于eMMC中的第6分区。
(2)console参数
指定内核启动时的控制台设备,如"console=ttyFIQ0"表示使用串口FIQ0作为控制台。
由于篇幅过长等原因,部分内容均不逐一展示,如需获取完整版详细资料,请关注Tronlong创龙科技微信公众号或官网,或者评论区留言,感谢您的支持!