"); //-->
By Toradex秦海
1). 简介
嵌入式 ARM 平台量产 BSP 更新通常有多种方式,ARM SoC 供应商或者板级模块供应商也通常会针对性提供一些工具软件,比如 NXP 就提供了 mfgtools 工具。本文则基于 ARM 计算机模块供应商 Toradex 开发的 Toradex Easy Installer 工具来介绍通过本地部署服务器来进行量产 BSP 镜像更新的方式。
本文所演示的平台来自于 Toradex Verdin i.MX8MM 嵌入式平台。
2. 准备
a). Verdin i.MX8MM ARM核心版配合Dahlia 载板,并连接调试串口用于测试。
b). Dahlia 载板通过 DSI-HDMI 转接卡连接 HDMI 显示器。
3). Toradex Easy Installer 介绍
a). 包括本文使用的 Verdin i.MX8MM 在内,Toradex 计算机模块出厂预装 Toradex Easy Installer 工具,这个工具将 SoC 厂家提供的通过恢复模式更新 BSP 镜像工具封装到一个可视化易用的应用内,方便客户进行工厂端批量量产更新,更多详细介绍请见如下:
https://developer.toradex.cn/easy-installer/toradex-easy-installer/toradex-easy-installer-overview/
b). Toradex Easy Installer 详细使用方法请见如下描述,其支持通过本地 SD 卡或者 U 盘以及本地服务器来进行更新。因为某些情况下,客户量产载板设计可能未引出 SD 卡以及 USB Host 接口,本文就着重演示通过本地服务器实现 BSP 镜像更新的方法。
https://developer.toradex.cn/easy-installer/toradex-easy-installer/toradex-easy-installer-detailed-manual/
4). 通过本地服务器更新 BSP 镜像
a). 首先确保模块当前保持出厂预装 Toradex Easy Installer 状态,且 Toradex Easy Installer 可以正常启动。
b). 本地服务器可以是原生安装 Linux 系统的 PC 或者虚拟机,如果是虚拟机,请将网络配置为桥接模式,且保证主机和虚拟机以及模块设备都处于同一局域网网段中。本文中本地服务器安装 Ubuntu Desktop 24.04。
c). 如果模块设备和本地服务器处于同一局域网,且局域网内部已经有 DHCP 服务器,那么本地服务器只需要安装如下服务即可:
./ 首先安装 Web 服务器应用,常用的有 lighttpd 或者 nginx。本文示例使用 lighttpd,如果需要 nginx 可以参考这里
-------------------------------
### Install lighttpd ###
$ sudo apt install lighttpd
### create configuration file ###
# /var/www/html/image_list.json
{
"config_format": 1,
"images": [
"verdin-imx8mm/image.json"
]
}
-------------------------------
./ 部署需要安装的 BSP 镜像,本文使用从这里下载的预编译好的 Yocto Linux 镜像
-------------------------------
### create BSP image folder ###
$ sudo mkdir /var/www/html/verdin-imx8mm
### deploy BSP image ###
$ sudo tar xvf <download_dir>/Verdin-iMX8MM_Reference-Multimedia-Image-Tezi_7.4.0+build.10.tar
$ sudo cd /var/www/html/verdin-imx8mm
$ sudo cp <download_dir>/Verdin-iMX8MM_Reference-Multimedia-Image-Tezi_7.4.0+build.10/* .
$ tree -L 1 /var/www/html/verdin-imx8mm/
/var/www/html/verdin-imx8mm/
├── image.json
├── imx-boot
├── LA_OPT_NXP_SW.html
├── marketing.tar
├── prepare.sh
├── Reference-Multimedia-Image-verdin-imx8mm.bootfs.tar.xz
├── Reference-Multimedia-Image-verdin-imx8mm.tar.xz
├── toradexlinux.png
├── u-boot-initial-env-sd
└── wrapup.sh
### restart service ###
$ systemctl restart lighttpd
-------------------------------
./ 此时,模块启动加载 Toradex Easy Installer 后,参考这里说明通过手动方式添加如下 feed 即可发现需要安装的 BSP 镜像
-------------------------------
http://<ip_address_web_server>/image_list.json
-------------------------------
./ 但是,在实际量产中,手动修改输入 feed 方式操作起来效率不高且容易出错,而从 Toradex Easy Installer 2.0 以及以上版本,已经支持 zeroconf 技术,可以实现让本地服务器被 Toradex Easy Installer 自动发现,这样就可以实现自动安装量产 BSP 镜像的任务
-------------------------------
### Install zeroconf related package ###
$ sudo apt install avahi-daemon avahi-discover avahi-utils libnss-mdns mdns-scan
### create configuration file ###
# /etc/avahi/services/tezi.service
<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name replace-wildcards="yes">Custom Toradex Easy Installer Feed</name>
<service>
<type>_tezi._tcp</type>
<port>80</port>
<txt-record>name=Custom Toradex Easy Installer Feed</txt-record>
<txt-record>path=/image_list.json</txt-record>
<txt-record>enabled=1</txt-record>
<txt-record>https=0</txt-record>
</service>
</service-group>
### restart service ###
$ systemctl restart avahi-daemon
-------------------------------
// 需要注意的是,tezi.service 文件中的 path 定义,是相对于 Web 服务器配置文件 /etc/lighttpd/lighttpd.conf 中 server.document-root=”/var/www/html” 定义的 root 目录的相对路径,而不是绝对路径。
./ 此时,模块启动加载 Toradex Easy Installer 后,会自动发现本地服务器并显示需要安装的 BSP 镜像列表
./ 此时,如果要进一步实现发现本地服务器的 BSP 镜像后即自动安装,则可以参考这里说明,修改 Web 服务器部署的 BSP 镜像中的 image.json 文件,使能自动安装
-------------------------------
### modify option ###
"autoinstall": false,
### remove license declaration ###
"license": "LA_OPT_NXP_SW.html",
-------------------------------
如果进一步需要安装完成后自动重启,则在 wrapup.sh 文件中增加如下内容
-------------------------------
reboot -f
exit 0
-------------------------------
d). 如果模块设备和本地服务器处于同一局域网,但局域网内部没有 DHCP 服务器,或者模块设备和本地服务器通过网线直连,那么本地服务器除了上述配置,还需要安装 DHCP 服务:
-------------------------------
### Install DHCP server ###
sudo apt install isc-dhcp-server
### modify configuration file ###
# /etc/dhcp/dhcpd.conf
...
subnet 192.168.10.0 netmask 255.255.255.0 {
range 192.168.10.100 192.168.1.200;
}
### start DHCP service ###
$ systemctl start isc-dhcp-server
-------------------------------
// 这里将 DHCP 服务器网段配置为 192.168.10.x 网段,是为了后续通过 DHCP 加载 Toradex Easy Installer 启动做准备,Toradex U-boot 中默认设置的 serverip 变量是这个网段,这样就无需修改 U-boot 环境变量。但如果没有这个需求,那么可以随意设置不冲突的网段即可。
./ 此时,模块启动加载 Toradex Easy Installer 后,会先通过配置的 DHCP 服务器获取 IP 地址后,和上述同样自动发现本地服务器并显示需要安装的 BSP 镜像列表,也可以同样配置自动安装,这里不再赘述
5). 通过本地服务器先加载 Toradex Easy Installer 启动后再更新 BSP 镜像
a). 当模块中出厂预装的 Toradex Easy Installer 已经被更新为 BSP 镜像,在某些特殊情况下可能需要通过网络方式重新加载 Toradex Easy Installer 启动后,再次更新新的 BSP 镜像。比如部署设备的现场更新等。
b). 能够实现网络加载 Toradex Easy Installer 的必要前提条件是当前模块 Bootloader 工作正常且支持通过 DHCP 启动,Toradex 提供的 Toradex Easy Installer 或者 Yocto Linux BSP 中的 U-boot 都默认支持此功能,有现成的启动脚本可以直接使用。如果是其他 BSP 镜像,则不一定直接支持。
c). 本地服务器参考如下安装 tftp 服务来部署 Toradex Easy Installer 启动文件
-------------------------------
### Install tftp service ###
$ sudo apt install tftpd-hpa
### create tftp root folder ###
$ make dir <$HOME>/tezi/tftp
### modify configuration file ###
# /etc/default/tftpd-hpa
TFTP_DIRECTORY="<$HOME>/tezi/tftp"
### restart service ###
$ systemctl restart tftpd-hpa
-------------------------------
d). 部署 Toradex Easy Installer 启动文件到 tftp root 目录
./ 从这里下载 Toradex Easy Installer 对应硬件的镜像文件
./ 解压镜像文件
-------------------------------
$ tar xvf Verdin-iMX8MM_ToradexEasyInstaller_7.4.0+build.8/
$ cd <work_dir>/Verdin-iMX8MM_ToradexEasyInstaller_7.4.0+build.8
$ tree -L 1
.
├── boot.scr
├── image.json
├── imx-boot-recoverytezi
├── imx-boot-sd
├── overlays.txt
├── recovery
├── recovery-linux.README
├── recovery-linux.sh
├── recovery-windows.bat
├── recovery-windows.README
├── tezi.itb
├── tezi.png
└── wrapup.sh
-------------------------------
./ 参考这里说明,通过 boot.scr 文件生成 boot.cmd 文件,并如下修改后重新编译生成 boot.scr 文件
-------------------------------
### boot.cmd ###
## comment below line ##
# env set bootcmd_tezi '${load_cmd} ${fitimage_addr} ${tezi_image}'
## replace with below line ##
env set bootcmd_tezi 'tftp ${fitimage_addr} ${tezi_image}'
### compile ###
$ mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n "Distro Boot Script" -d boot.cmd boot.scr
-------------------------------
./ 将修改的 boot.scr 文件以及镜像中原来的 overlays.txt tezi.itb 三个文件复制到 tftp root 目录
-------------------------------
$ cd <work_dir>/Verdin-iMX8MM_ToradexEasyInstaller_7.4.0+build.8/
$ cp boot.scr overlays.txt tezi.itb <$HOME>/tezi/tftp
-------------------------------
e). 通过模块 U-boot 命令行或者 Linux 系统命令修改 U-boot 环境变量,使模块默认通过 DHCP 来启动
./ 如果模块设备和本地服务器处于同一局域网,但局域网内部没有 DHCP 服务器,或者模块设备和本地服务器通过网线直连,那么同样需要按照上述说明安装 DHCP 服务,已经安装使能好则无需重复配置。
./ 除非本地服务器配置为 U-boot 环境变量默认的 192.168.10.1 IP 地址,否则需要先修改
-------------------------------
### U-Boot prompt ###
Verdin iMX8MM # setenv serverip '<tezi_server_ip_address>'
Verdin iMX8MM # saveenv
### Linux prompt ###
root@verdin-imx8mm-07276322:~# fw_setenv serverip '<tezi_server_ip_address>'
-------------------------------
./ 修改默认启动方式
-------------------------------
### U-Boot prompt ###
Verdin iMX8MM # setenv bootcmd 'run bootcmd_dhcp'
Verdin iMX8MM # saveenv
### Linux prompt ###
root@verdin-imx8mm-07276322:~# fw_setenv bootcmd 'run bootcmd_dhcp'
-------------------------------
./ 重新启动后,模块自动通过 DHCP 从本地服务器 tftp 加载 Toradex Easy Installer 启动
-------------------------------
U-Boot 2022.04-6.8.0+git.a1eb18d157f4 (Jul 16 2024 - 20:38:08 +0000)
CPU: i.MX8MMQ rev1.0 1600 MHz (running at 1200 MHz)
CPU: Industrial temperature grade (-40C to 105C) at 53C
Reset cause: POR
DRAM: 2 GiB
Core: 114 devices, 21 uclasses, devicetree: separate
WDT: Started watchdog@30280000 with servicing (60s timeout)
MMC: FSL_SDHC: 0, FSL_SDHC: 1, FSL_SDHC: 2
Loading Environment from MMC... OK
...
DHCP client bound to address 192.168.10.102 (1765 ms)
Using ethernet@30be0000 device
TFTP from server 192.168.10.1; our IP address is 192.168.10.102
Filename 'boot.scr'.
Load address: 0x50280000
Loading: #
288.1 KiB/s
done
...
TFTP from server 192.168.10.1; our IP address is 192.168.10.102
Filename 'tezi.itb'.
Load address: 0x44200000
Loading: #################################################################
#################################################################
...
Bootargs: quiet video=HDMI-A-1:1280x720@60D rootfstype=squashfs root=/dev/ram autoinstall
## Loading kernel from FIT Image at 44200000 ...
Using 'conf-freescale_imx8mm-verdin-wifi-dev.dtb' configuration
...
Toradex Easy Installer 7.4.0+build.8 ()
...
Welcome to the Toradex Easy Installer
...
Check our documentation at:
https://developer.toradex.com/software/toradex-easy-installer
~ #
-------------------------------
f). 此时,模块 Toradex Easy Installer 加载启动成功,如果上述章节4的相关服务也同时存在,则会继续自动识别本地服务器上需要烧写的 BSP 镜像,进而实现自动更新。
./ 在更新完成后,请务必恢复默认启动选项
-------------------------------
### U-Boot prompt ###
Verdin iMX8MM # setenv bootcmd 'run distro_bootcmd'
Verdin iMX8MM # saveenv
### Linux prompt ###
root@verdin-imx8mm-07276322:~# fw_setenv bootcmd 'run distro_bootcmd'
-------------------------------
6). 总结
本文基于 Verdin i.MX8MM 模块平台测试了通过本地服务器更新 BSP 镜像的配置说明。
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。