By Toradex 胡珊逢

1). 简介

无论是出于问题修复还是软件升级,对嵌入式设备进行 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 服务器。

 

2). 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组件。

 

3). 服务器配置

 

为了能够让模块上的 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

-----------------------------------------

 

 

4). 总结

通过以太网更新 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/