Linux嵌入式uboot使用tftp网络启动加载zImage、dtb到内存,文件系统本地启动

前言

对于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} zImagetftp ${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

保存重启就可以了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值