文章目录
前言
对于uboot还是要好好的理解和学习,我就是属于基础不牢,地动山摇,磕磕绊绊的一个月,才照猫画虎的明白uboot的设置,下面的方法相信适用于大部分的uboot启动设置。
我是windows环境,然后使用wsl2的开发环境,nfs对我来说弄起来很麻烦,虚拟机设置其实也很繁琐,因为隔着windows所以,很多tftp nfs服务是很难使用,都需要借助第三方,还不一定好用。
所以没有网络挂在文件系统,因此才需要板子的文件系统从emmc启动。
通常我们开发,大多也都是对编译之后zImage、dtb的加载验证,文件系统就直接使用emmc上的就可以了。
1.进入uboot
板子开机,通过串口连接,打开终端
重启板子,在显示板子信息的时候
按任意键,进入uboot引导
输入0
2.uboot基本内容
help
输入help
我们需要看一下环境变量的配置,观察一下引导的过程,进行一些手动的更改
printenv
3.bootcmd
我们在help中可以看到,uboot引导过程中,默认执行boot,这也是我们的引导启动的流程
而boot中,默认run bootcmd
,我们后面修改,就是要修改启动的位置,把zImage和dtb文件从内存中加载
bootcmd=run findfdt;mmc dev ${mmcdev};if mmc rescan; then if run loadbootscript; then run bootscript; else if run loadimage; then run mmcboot; else run netboot; fi; fi; else run netboot; fi
这段代码其实也就是一个脚本文件,执行bootcmd命令后以此执行了什么,对谁执行了什么。
第一句
run findfdt
这里的步骤意义,可以继续查看findfdt。
关于设备树的启动和配置
findfdt=if test $fdt_file = undefined; then if test $board_name = SABREAUTO && test $board_rev = MX6QP; then setenv fdt_file imx6qp-sabreauto.dtb; fi; if test $board_name = SABREAUTO && test $board_rev = MX6Q; then setenv fdt_file imx6q-sabreauto.dtb; fi; if test $board_name = SABREAUTO && test $board_rev = MX6DL; then setenv fdt_file imx6dl-sabreauto.dtb; fi; if test $board_name = SABRESD && test $board_rev = MX6QP; then setenv fdt_file imx6qp-sabresd.dtb; fi; if test $board_name = SABRESD && test $board_rev = MX6Q; then setenv fdt_file imx6q-c-sabresd.dtb; fi; if test $board_name = SABRESD && test $board_rev = MX6DL; then setenv fdt_file imx6dl-c-sabresd.dtb; fi; if test $fdt_file = undefined; then echo WARNING: Could not determine dtb to use; fi; fi;
mmcboot
熟悉了之后,我们可继续看我们的bootcmd
这里是关键,修改的也是这个位置
mmcboot=echo Booting from mmc ...; run mmcargs; if test ${boot_fdt} = yes || test ${boot_fdt} = try; then if run loadfdt; then bootz ${loadaddr} - ${fdt_addr}; else if test ${boot_fdt} = try; then bootz; else echo WARN: Cannot load the DT; fi; fi; else bootz; fi;
4.tftp服务打开
因为我使用的是windows平台,所以,就直接使用了mobaXterm软件的tftp功能
就这么简单,也不用去设置虚拟的tftp服务,只需要使用我们的超级终端软件内置功能就可以了
注意
这里可能会遇到打开了无法使用的问题
大概率是因为Windows防火墙的问题
所以,这里在弹出防火墙提示时候,一定要,允许公用网络 ,不然就手动添加,或者直接关闭防火墙
5.设置env环境变量
电脑的本机IP
setenv serverip 192.168.0.2
开发板的从机IP
setenv ipaddr 192.168.0.232
zImage
setenv image zImage
dtb
setenv fdt_file imx6q-c-sabresd.dtb
6.手动下载 tftp zImage
先把重新编译后的Linux镜像通过tftp发送到内存中
默认起始地址就是12000000 所以不写也可以
tftp zImage
或者
tftp 12000000 zImage
tftp ${loadaddr} zImage;
这里有个小插曲,默认网卡的速度是自动,这里强制设置成100M或者1000M,可回到正常速度
更改之后,传输的速度得到了质的飞跃
7.手动下载 tftp ${ftd_addr} ${fdt_file}
ftd_addr已经默认配置好了,是18000000,,并且前面的环境变量设置中,我们执行了setenv fdt_file imx6q-c-sabresd.dtb
,所以,这里可以是
tftp ${ftd_addr} ${fdt_file}
或者
tftp 18000000 imx6q-c-sabresd.dtb
8.手动 bootz ${loadaddr} - ${fdt_addr} 启动
bootz ${loadaddr} - ${fdt_addr}
可以看到我们可以启动成功
当然,这里也有可能会不成功,问题可能有很多,不过不用着急,因为我们是使用bootz ${loadaddr} - ${fdt_addr}直接启动,所以,一些Linux的初始化操作是没有加载进去的,比如文件系统。
但是上面的操作是可以进行一个裸机程序的加载验证
我们最终还是要对bootcmd中的mmcboot修改,这样我们才能做到,只是zImage 和 dtb多了一步从tftp下载到内存,然后从内存中启动,其他的比如文件系统,还是从mmc也就是emmc硬盘中启动。
9.操作写入环境mmcboot
直接上代码
setenv mmcboot 'echo Booting from mmc ...; run mmcargs; tftp ${loadaddr} zImage;tftp ${fdt_addr} imx6q-c-sabresd.dtb; bootz ${loadaddr} - ${fdt_addr};'
这里就用到了前面的,重点就在 tftp ${loadaddr} zImage
和tftp ${fdt_addr} imx6q-c-sabresd.dtb
,以及bootz ${loadaddr} - ${fdt_addr};
三句话
先不要保存,我们来验证一下设置的uboot环境变量可不可以用
boot
boot
zImage文件和dtb文件都已经通过tftp发送到了我们的板子内存中,一切都在安排之中
可以看到我们加载的zImage dtb生成的日期
10.saveenv
我们验证完之后,就可以重新进入boot一次,设置env环境了,这次在执行完之后加一个saveenv就可以了,然后重启
setenv serverip 192.168.0.2
setenv ipaddr 192.168.0.232
setenv image zImage
setenv fdt_file imx6q-c-sabresd.dtb
setenv mmcboot 'echo Booting from mmc ...; run mmcargs; tftp ${loadaddr} zImage;tftp ${fdt_addr} imx6q-c-sabresd.dtb; bootz ${loadaddr} - ${fdt_addr};'
saveenv
恢复uboot默认设置
这个过程中根据自己的板子进行设置,可能意外保存,重新刷一个uboot显然是不理智的,所以,使用命令就可以恢复uboot的出厂设置
env default -a
saveenv
保存重启就可以了