Blog:
通过以太网加载 Toradex Easy Installer 并更新系统

Wednesday, July 1, 2020

无论是出于问题修复还是软件升级,对嵌入式设备进行 BSP 更新已经变得越来越常见。通常这种操作需要使用外部存储介质,如 SD 卡、U 盘等。而一些行业设备由于项目需求,不一定会留有这些接口,或者是计算机模块安装的位置较为特殊,不便接触这些接口。那么通过以太网接口来更新 BSP 则是一种较好的方案。借助 Toradex Easy Installer , 接下来我们将以 Apalis TK1 为例介绍如何通过调试串口和以太网,甚至是仅仅通过以太网接口来更新计算机模块 BSP。

Toradex Easy Installer 一个运行在 RAM 上小型 Linux 系统,通过它我们就可以更新 BSP。在任何情况下通过短接模块上特定两个引脚后上电启动,模块即可进入恢复模式。然后通过 USB OTG 接口从电脑加载 Toradex Easy Installer 到模块的内存上并运行。或者在 U-Boot 中通过 run bootcmd_usbX/bootcmd_mmcX 从 U 盘或者 SD 卡上加载 Toradex Easy Installer。 当上述途径都不可用时,我们还可以通过以太网进行操作。这主要包括两部分。首先是修改模块上 U-Boot 默认启动参数配置,然后是配置电脑上 Toradex Easy Installer feeds 服务器。

U-Boot 启动参数配置

修改 U-Boot 环境参数有两种途径。第一种是调试串口。这就要求用户在设计底板时预留该接口。第二种在 Linux 中通过 SSH 登录后修改。

  • 调试串口

进入 U-Boot 命令模式,输入以下命令:

Apalis TK1 # setenv ipaddr 192.168.1.150
Apalis TK1 # setenv serverip 192.168.1.1
Apalis TK1 # saveenv
Apalis TK1 # run boot_net_pci_enum

等待 5 秒,让 TK1 上的以太网启动。

Apalis TK1 # run bootcmd_dhcp

如果此时 Toradex Easy Installer feeds 服务器 已经配置完毕并通过网络连接到模块,那么TK1 将从 IP 地址为 192.168.1.1 的服务器自动下载相应的启动程序,并开始运行 Toradex Easy Installer。

  • Linux SSH 

通过 SSH 登录到模块 Linux 系统,然后运行下面命令

root@apalis-tk1:~# fw_setenv bootcmd ‘run bootcmd_dhcp’
root@apalis-tk1:~# fw_setenv ipaddr 192.168.1.150
root@apalis-tk1:~# fw_setenv serverip 192.168.1.1

然后重启模块即可。这里需要注意,因为修改了 U-Boot 的默认启动参数 bootcmd,模块每次都会从网络启动。为了在更新完 BSP 后避免这种情况,请务必在 Toradex Easy Installer 界面中点击 “Erase Flash”擦除 U-Boot 环境参数。或者在 BSP 更新文件 image.json 中使用 u_boot_env:"uEnv.txt" 重新配置 bootcmd 为默认参数。

现在模块上的操作基本完成,接下来将说明如何配置 feeds 服务器。我们在虚拟机中安装 Ubuntu 20.04 Server 版本进行操作。关于虚拟机的安装和使用这里不再赘述,在安装 Ubuntu 20.04 Server 时建议开启 OpenSSH 功能,方便后续登录操作,并且主机名 hostname设置为 tezi-server。同时推荐安装 VirtualBox Guest Addtions组件。

服务器配置

为了能够让模块上的 Toradex Easy Installer 自动识别 feeds 服务器,我们需要在 Ubuntu 20.04 Server 上安装 DHCP、TFTP、HTTP 以及 Zeroconf 服务。

  • DHCP 服务

运行下面命令安装

sudo apt install isc-dhcp-server


在 /etc/dhcp/dhcpd.conf 结尾添加

subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.150 192.168.1.200;
option routers 192.168.1.254;
option domain-name-servers 192.168.1.1, 192.168.1.2;
option domain-name "mydomain.example";
}

  • TFTP 服务

运行下面命令安装

sudo apt install tftpd-hpa


创建tftp 目录

mkdir -p /home/tezi/tftp

修改 /etc/default/tftpd-hpa

# /etc/default/tftpd-hpa

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/tezi/tftp"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure --create"

  • HTTP 服务

运行下面命令安装

sudo apt install lighttpd

在 /etc/lighttpd/lighttpd.conf 结尾添加

alias.url = ( "/var/www/html/" => "/var/www/html/" )

  • Zeroconf  服务

通过下面命令安装  Zeroconf 服务

sudo apt install avahi-daemon avahi-discover avahi-utils libnss-mdns mdns-scan

/etc/avahi/services 中创建 tezi.service 文件

<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
<!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=/var/www/html/image_list.json</txt-record>
  <txt-record>enabled=1</txt-record>
  <txt-record>https=0</txt-record>
</service>
</service-group>


其中path=/var/www/html/image_list.json 是 HTTP 服务器所配置的文件目录。

  • 网络设置

将服务器设置为静态 IP 192.168.1.1。Ubuntu 20.04 Server 采用了 netplan 管理网络,修改 /etc/netplan/00-installer-config.yaml

# This is the network config written by 'subiquity'
network:
version: 2
ethernets:
  ens33:
    addresses: [192.168.1.1/24]
    gateway4: 192.168.1.1


ens33 为网卡名字,根据实际情况调整。另外注意yaml 文件的缩进格式。静态 IP 地址需要和上面的 DHCP 服务器在同一个 IP 段中,但不要使用地址池IP,如所配置的192.168.1.150 ~192.168.1.200

有这里采用虚拟机进行操作,所有需要将虚拟客户机 Ubuntu 20.04 Server 的网络接入修改为桥接模式,这样当TK1 模块通过网络直连后才可以发现该服务器。在 Oracle VirtualBox 中配置如下:

同时将宿主机的以太网接口也配置为  Ubuntu 20.04 Server 静态 IP 同一网段,如 192.168.1.2.  宿主机可以是 Linux 如 Ubuntu ,也可以是 Windows 系统。两种系统的 IP 配置如下:

通过上面操作服务器基本配置完毕,接下来准备相关的启动和安装文件。

在 tftp 目录 “/home/tezi/tftp” 下放置 boot.scr.uimg 和 tezi.itb 文件。其中 tezi.itb 来自 Apalis-TK1_ToradexEasyInstaller_2.0b5-20200519

TK1 的相关文件可以从下面链接下载。

ftp://ftp.toradex.cn/Documents/ApplicationNote/resources/TeziEthernetLoading/tk1/

如果您想要在其他模块上使用该功能,相关的文件请联系 Toradex 获取。

在 /var/www/html/ 创建 image_list.json 文件


"config_format": 1, 
"images": [ 
 "apalis_tk1/image.json" 


在 /var/www/html/ 创建 apalis_tk1 目录,将 Toradex Easy Installer 格式的 BSP 包放入apalis_tk1 目录,例如

tree /var/www/html/apalis_tk1
apalis_tk1
├── apalis-tk1.img
├── Apalis-TK1_LXDE-Image.bootfs.tar.xz
├── Apalis-TK1_LXDE-Image.rootfs.tar.xz
├── image.json
├── marketing.tar
├── prepare.sh
├── toradexlinux.png
├── uEnv.txt
└── wrapup.sh

无论是 HTTP 还是 TFTP 服务器,都需要注意这些文件是否对所有用户都有可读权限,可以通过 sudo chmod a+r ./* 来进行配置。

我们也提供了一个配置完成的VirtualBox 虚拟机文件,导入后即可使用。

ftp://ftp.toradex.cn/Documents/ApplicationNote/resources/TeziEthernetLoading/TeziServer.ova

用户名:tezi,密码:tezi123

完成上面 U-Boot 和服务器上的配置后,在 U-Boot 运行下面命令,或者直接重启模块之后 TK1 会从服务器上加载相应的文件。通过调试串口,查看TK1 模块获取到的 IP 地址,然后 VNC 远程连接 Toradex Easy Installer 图形界面。由于配置了 Zeroconf 功能,Toradex Easy Installer 可以自动识别 HTTP 服务器并下载安装文件。如果没有调试串口,那么使用 Toradex Easy Installer 的 autoinstall 功能可以实现自动安装,无需 VNC 远程连接操作。

Apalis TK1 # run bootcmd_dhcp


总结

通过以太网更新 BSP 能够满足一些特殊设备升级系统的要求。但正如文章介绍,这有一些限制条件,最重要的是能够保证 U-Boot 正常运行,对于没有引出调试串口的,还需要能够确保 SSH 登录 Linux。在一些极端情况下可能连 U-Boot 也无法启动。因此为了避免拆机取出模块进行恢复,在条件允许的情况下,建议在设备引出使模块进入恢复模式的电路,以及 USB OTG 和调试串口。

参考链接:

https://ubuntu.com/server/docs/network-dhcp
https://linuxhint.com/install_tftp_server_ubuntu/
https://www.linode.com/docs/web-servers/lighttpd/use-lighttpd-web-server-on-ubuntu-16-04/
https://linuxize.com/post/how-to-install-virtualbox-guest-additions-in-ubuntu/

Author: 胡珊逢,FAE,韬睿(上海)

Leave a comment

Please login to leave a comment!
Have a Question?