Linux|Linux系统移植篇2:STM32MP1微处理器之系统镜像烧写( 五 )


通过tftp方式下载linux内核及设备树除了使用ums挂载的方式进行内核及设备树的更新之外 , 还可以通过pxelinux功能 , 从tftp服务器下载镜像启动 。
在u-boot中使用tftp前需要将网线接入开发板 , 并且要与ubuntu所在的网段相同 。
将要使用tftp下载的linux内核与设备树拷贝到ubuntu系统中tftp服务器工作目录中(/tftpboot) , linux内核与设备树可以从linux内核源码中编译得到 。
linux@ubuntu:$ cp arch/arm/boot/uImage /tftpboot/
linux@ubuntu:$ cp arch/arm/boot/dts/stm32mp157a-fsmp1a*.dtb /tftpboot/
【Linux|Linux系统移植篇2:STM32MP1微处理器之系统镜像烧写】在tftp服务器工作目录中(/tftpboot)建立pxelinux.cfg文件夹 。 在该文件夹下建立01-00-80-e1-42-60-17文件 。 tftpboot目录结构如下

00-80-e1-42-60-17为开发板的默认mac地址 , 可以使用env set -f ethaddr xx:xx:xx:xx:xx:xx来修改mac地址 。
如果通过sdcard启动01-00-80-e1-42-60-17文件内容与开发板上/boot/mmc0_stm32mp157a-fsmp1a_extlinux/extlinux.cfg文件相同 , 如下所示
extlinux.cfg
如果通过emmc启动01-00-80-e1-42-60-17文件内容与与开发板上/boot/mmc1_stm32mp157a-fsmp1a_extlinux/extlinux.cfg文件相同 , 如下所示
extlinux.cfg
这里以sdcard为例 , 将01-00-80-e1-42-60-17内容修改为与开发板上/boot/mmc0_stm32mp157a-fsmp1a_extlinux/extlinux.cfg文件相同

在ubuntu中使用ifconfig命令查看当前ip地址 , 从而确定网段 。

可以看到当前ubuntu的ip地址为192.168.11.78 。 由此得到当前网段为11网段 。
开发板需要使用xshell连接上调试串口 , 在系统的启动过程中会出现1秒的倒计时 , 在倒计时结束之前按下键盘任意键即可将程序停留在bootloader的控制终端 。

进入bootloader控制台

在u-boot控制台中使用dhcp命令为开发板获取一个ip地址 。

可以看到获取到了一个192.168.11.68的IP地址 , 也是11网段 。 与ubuntu网段相同 。 为了进一步验证开发板与ubuntu的通信状况可以使用ping命令来ping ubbuntu的IP地址验证 。

可以看到ping命令已经执行成功了 。
接下来设置tftp的服务器ip , 可以看到也就是ubuntu的ip地址 。
root@fsmp1a:# env set serverip 192.168.11.78
这里使用到了env set命令来设置环境变量 , 该命令默认只修改内存中的变量 , 存储在sdcard或者emmc中的变量不会受到影响 , 也就是说调电回丢失修改 , 如果想要永久修改可以使用env save命令将当前内存中的环境变量更新到外部存储设备中 。

使用run bootcmd_pxe开始下载linux内核与设备树文件 。 看到如下提示后选择您对应的启动选项即可 。

例如这里选择1 , 进行5寸屏幕启动 。 稍等片刻之后便可看到内核启动 。

通过scp方式更新linux内核及设备树驱动程序除了通过tftp方式和ums方式更新linux内核与设备树文件以外 , 还可以通过scp方式来更新开发板中的文件 。 Scp是基于ssh协议进行数据传输 , 在传输过程中要传输数据一端我们称之为服务器端 , 开发板通常作为数据接收端我们称之为客户端 。 当然开发板在往ubuntu发送数据的时候则会成为服务端 。 此方法需要开发板完整启动 , 并进入文件系统终端 。
在使用scp前需确认与服务器端所在网络环境相同 。 本例中ubuntu的ip地址为192.168.11.78 。 开发板的ip地址需要通过串口终端下使用ifconfig命令确定 。

可以看到当前开发板IP地址为192.168.11.68 。 可以通过ping命令来测试通信情况 。

在之前章节提到过bootfs分区中存放了启动时需要的linux内核及设备树文件 , extlinux的配置 , 开机logo等文件 。 bootfs分区在开发板中则对应了/boot目录 , 也就是说对/boot目录中的文件做出修改后 , 就相当于是对bootfs分区做出了修改 。