Digi核心板或核心模块是一个带有ARM处理器,闪存,RAM和电源管理芯片,并将处理器引脚引出的完整片上系统,可以把核心模块当成一片微型计算机。在核心模块的闪存中预置有Digi深度定制的U-Boot启动器,上电时,系统镜像就能被U-Boot加载到RAM中运行,完成系统的启动。向闪存中烧入U-Boot或不同的操作系统镜像的过程,则称为固件更新。Digi核心模块支持多种向flash更新固件的方式,包括利用U-Boot通过网络TFTP或是SD卡,USB接口等来更新固件,以及在Linux系统中在线更新固件等各种不同的方式。

Digi的核心模块上预置有深度定制的U-Boot启动器,支持加载不同的操作系统,固件更新可采用U-Boot中的update命令,使用uSD卡或以太网,配合console就能完成不同操作系统的镜像烧写。U-Boot的固件更新命令也可以用来更新U-Boot本身。

核心板上电后,首先会运行启动器U-Boot,并根据启动器的预置命令加载不同的操作系统。上电后的启动信息会打印到U-Boot默认指定的某个UART上,该串口称为Cosole口。连接开发板的Console口到电脑串口(CC6UL单板机是直接使用console口转USB线缆),并配置好串口波特率(默认115200/8/N/1),就可以在电脑的终端程序上查看启动信息,执行U-Boot命令等。

Windows下常用超级终端,或是putty,或是MobaXterm等图形化终端程序来和嵌入式核心板交互。如果您之前没有用过,可以下载个putty,参考网上相关的使用方法。

Linux系统的串口终端程序可以用命令行的minicom,如果没有安装,请直接“sudo apt install minicom”来安装,安装后可由“sudo minicom -b 115200 -D /dev/ttyUSB0”运行,该命令将打开USB转串口所在的com口终端,波特率为115200,注意您仍需配置串口为115200/8/n/1,无流控,默认地minicom开启硬件流控,这可能会导至串口显示或交互不正常,请通过CTRL+A Z调出菜单修改。

默认地,上电后会根据U-Boot的参数命令加载系统,我们可以在加载系统之前,按任意键停在U-Boot环境中,从而来执行一些U-Boot的命令,如更新固件,设置网络参数,更改分区等。这些操作要保证核心模块能够正常上电并进入U-Boot,如果您的核心模块预置的U-Boot因为误操作或烧入不可用的固件而无法启动,请参考如何恢复核心模块的U-Boot来通过USB来恢复U-Boot固件到内置的闪存中。

不论通过哪种介质在U-Boot中升级固件,首先都要下载或编译好待更新的固件,对于DEY系统来说,完整的固件包括U-Boot,内核,恢复分区,文件系统四个。Digi官方的FTP网站提供了各种预编译的固件,您可以在此下载卡刷包,或是下载单个或多个待更新的固件。

<u-boot-file>.imx —– U-Boot启动器
<boot-file>.boot.ubifs —– 内核和设备树分区固件
<rootfs-file>.ubifs —– 文件系统固件
<recovery-file>.recovery.ubifs —– 预留的恢复固件
<u-boot-file>.imx —-U-Boot启动器
<boot-file>.vfat —– 内核和设备树分区固件
<rootfs-file>.ext4 —– 文件系统固件
<recovery-file>.vfat —– 预留的恢复固件
<u-boot-file>.imx —-U-Boot启动器
boot.img —– 内核和设备树分区固件
system.img —– 文件系统固件
recovery.img —– 预留的恢复固件


通过网络更新固件

通过网络TFTP服务来更新核心模块的片上系统显得十分方便。在使用前,您需要接好网线,并在U-Boot中配置好核心模块的IP以及存放有待升级固件的TFTP服务器IP。
默认地,核心模块的第一个网口IP地址为:192.168.42.30,您可以更改为和电脑同一网段,这可以通过配置自动获取IP或是固定IP来实现。

⇒ setenv autoload no
⇒ dhcp
⇒ setenv ipaddr a.b.c.d


设置好IP地址后,您还需要设置TFTP服务器的地址并保存到闪存中:
⇒ setenv serverip w.x.y.z
⇒ saveenv
注意TFTP服务器地址和核心板的IP地址需要在同一网段,配置好后,你可以尝试在U-Boot中去ping一下TFTP服务器,确保网络畅通,接下来就可以用网络来更新固件了。 :!:注意,虽然你可以在核心板的终端窗口去ping主机,但您无法反方向通过电脑去ping核心板,因为核心板上只运行有一个U-Boot,它并没有带响应ping请求的协议。

更新U-Boot
注意核心模块出厂已经带了稳定版本的U-Boot,如果使用原厂的U-Boot,你并无需频繁更新。若要更新U-Boot,执行:
⇒ update uboot tftp <u-boot-file>.imx
通常更新完U-Boot,你需要重新启动以便使用它。不同版本的U-Boot可能带来参数的增加或变化,建议重新启动后,执行一次
⇒ env default -a
⇒ saveenv
这样可以使得模块恢复该版本的默认参数。
注意,IP地址也恢复默认,所以需参考上述部骤重设置一下网络和serverip

更新Linux系统
⇒update linux tftp <boot-file>.boot.ubifs
⇒ update rootfs tftp <rootfs-file>.ubifs
⇒ update recovery tftp <recovery-file>.recovery.ubifs

默认地,flash中有一个update分区预留给将来从Linux系统中在更新固件使用,如果你刚从U-Boot更新完固件,可以格式化这个分区,如果你从未进行过在线更新,也可以不进行格式化操作。
要格式化update分区,执行:
⇒ setenv recovery_command wipe_update
⇒ saveenv
⇒ run recoverycmd
或者略过上述三个命令,直接启动进入系统
⇒ boot

更新Linux系统
对于CC6/CC6+,由于采用的是eMMC闪存,需要先对其进行分区配置,以便使用vfat和ext4分区格式。 ⇒ setenv mmcdev 0
⇒ run partition_mmc_linux
然后就可以更新系统
⇒ update linux tftp <boot-file>.vfat
⇒ update rootfs tftp <rootfs-file>.ext4
⇒ update recovery tftp <recovery-file>.vfat
更新完毕后,由于CC6/CC6+也支持Android,所以要检查或重新设置一下启动命令,以便上电后自动启动Linux
⇒ setenv bootcmd dboot linux mmc
⇒ saveenv

此外,flash中有一个update分区预留给将来从Linux系统中在更新固件使用,如果你刚从U-Boot更新完固件,可以格式化这个分区,如果你从未进行过在线更新,也可以不进行格式化操作。
要格式化update分区,执行:
⇒ setenv recovery_command wipe_update
⇒ saveenv
⇒ run recoverycmd
或者略过上述三个命令,直接启动进入系统
⇒ boot

更新Android系统
对于CC6/CC6+,由于采用的是eMMC闪存,需要先对其进行分区配置。
⇒ setenv mmcdev 0
⇒ run partition_mmc_android
然后就可以更新系统
⇒ update boot tftp boot.img
⇒ update system tftp system.img
⇒ update recovery tftp recovery.img
更新完毕后,还需要配置一下首次启动格式化cache和data
⇒ bootargs_once=“androidboot.cache=format androidboot.data=format”
由于CC6/CC6+也支持Android,所以要检查或重新设置一下启动命令,以便上电后自动启动Android
⇒ setenv bootcmd dboot Android mmc
⇒ saveenv

或直接启动进入系统
⇒ boot


通过SD卡更新固件

在单板机上手初步的文章中,我们介绍的卡刷的方法,实际上就是一种通过SD卡更新固件的方法,不过在卡刷中,我们使用的是一系列的U-Boot命令组成的脚本,我们也可以在U-Boot中通过输入一个一个的命令地来执行SD卡更新固件的相关功能。

更新U-Boot
注意核心模块出厂已经带了稳定版本的U-Boot,如果使用原厂的U-Boot,你并无需频繁更新。若要更新U-Boot,执行:
⇒ update uboot mmc 0 fat <u-boot-file>.imx
通常更新完U-Boot,你需要重新启动以便使用它。不同版本的U-Boot可能带来参数的增加或变化,建议重新启动后,执行一次
⇒ env default -a
⇒ saveenv
这样可以使得模块恢复该版本的默认参数。

更新Linux系统
⇒update linux mmc 0 fat <boot-file>.boot.ubifs
⇒ update rootfs mmc 0 fat <rootfs-file>.ubifs
⇒ update recovery mmc 0 fat <recovery-file>.recovery.ubifs

默认地,flash中有一个update分区预留给将来从Linux系统中在更新固件使用,如果你刚从U-Boot更新完固件,可以格式化这个分区,如果你从未进行过在线更新,也可以不进行格式化操作。
要格式化update分区,执行:
⇒ setenv recovery_command wipe_update
⇒ saveenv
⇒ run recoverycmd
或者略过上述三个命令,直接启动进入系统
⇒ boot

更新Linux系统
对于CC6/CC6+,由于采用的是eMMC闪存,需要先对其进行分区配置,以便使用vfat和ext4分区格式。 ⇒ setenv mmcdev 0
⇒ run partition_mmc_linux
然后就可以更新系统
⇒ update linux mmc 1 fat <boot-file>.vfat
⇒ update rootfs mmc 1 fat <rootfs-file>.ext4
⇒ update recovery mmc 1 fat <recovery-file>.vfat
更新完毕后,由于CC6/CC6+也支持Android,所以要检查或重新设置一下启动命令,以便上电后自动启动Linux
⇒ setenv bootcmd dboot linux mmc
⇒ saveenv

此外,flash中有一个update分区预留给将来从Linux系统中在更新固件使用,如果你刚从U-Boot更新完固件,可以格式化这个分区,如果你从未进行过在线更新,也可以不进行格式化操作。
要格式化update分区,执行:
⇒ setenv recovery_command wipe_update
⇒ saveenv
⇒ run recoverycmd
或者略过上述三个命令,直接启动进入系统
⇒ boot

更新Android系统
对于CC6/CC6+,由于采用的是eMMC闪存,需要先对其进行分区配置。
⇒ setenv mmcdev 0
⇒ run partition_mmc_android
然后就可以更新系统
⇒ update boot mmc 1 fat boot.img
⇒ update system mmc 1 fat system.img
⇒ update recovery mmc 1 fat recovery.img
更新完毕后,还需要配置一下首次启动格式化cache和data
⇒ bootargs_once=“androidboot.cache=format androidboot.data=format”
由于CC6/CC6+也支持Android,所以要检查或重新设置一下启动命令,以便上电后自动启动Android
⇒ setenv bootcmd dboot Android mmc
⇒ saveenv

或直接启动进入系统
⇒ boot


待续,请先参考官方英文文档

  • Windows操作系统

Windows系统环境下更新固件的方法

Windows系统环境下更新固件的方法

可以参考下面说明,适用于Windows的TFTP服务器软件也可以从Digi的官网下载。虽然您可以使用第三方提供的TFTP软件,但为了保险起见,在windows下最好用Digi提供的版本。 Digi TFTP服务器软件 Digi TFTP服务器是个绿色软件,您最好解压在磁盘上不带中文路径的目录下,点击配置按钮,把server选项卡按如下方式配置。

配置好tftp服务器后,如果您的镜像还没放到c:\tftpboot\,请手动拷贝到该目录下。如果硬盘空间有限,也可以在tftp根目录下使用硬链接文件,注意TFTP是不支持软链接文件的。

除了TFTP服务器外,还需要一个终口终端程序来与核心板的进行交互。一般可以用超级终端或是putty等支持串口的终端程序,如果你安装有Digi的IDE软件,一般都自带有一个Terminal终端程序,可以在IDE的菜单中打开。比如我们用Putty,使用USB转串口,在windows上的串口号是com5,可以按如下方式配置putty为串口终端。

硬件上把电脑和核心板开发套件通过网线和串口线连接好,其中电脑端的IP要配置成核心板UBoot中的参数serverip指定的IP地址,并且和核心板的IP地址ipaddr在同一个网段。确保这些没有问题后,就可以通过点击TFTP服务程序左上角的小三角箭头运行TFTP服务,等待来自核心板的请求。

  • Linux

为了在Linux环境中进行固件更新,同样地,您需要有tftp服务器软件和串口终端程序。可以参考常用软件安装配置来安装配置tftp服务器软件tftpd-hpa和minicom串口终端。

虽然调试终端和TFTP服务器软件无需在同一台电脑上,不过简单起见,大多数情况我们还是在同一台电脑上操作,所以确保tftpd-hpa服务已经运行,可以接受U-Boot的连接和传输请求。

利用IDE的终端工具

利用IDE的终端工具

如果您电脑上安装有IDE,您也可以使用IDE中的Terminal作为串口终端。Eclipse下通常都集成有Terminal工具,在Window>Show View中可以打开Terminal配置面板来设置Serial Terminal串口终端。

Linux中的USB转串口通常会分配到/dev/ttyUSB0作为设备号,有时要使终端程序能够使用该串口来进行终端通信,需要给予一定权限,可以通过命令

$sudo chmod 666 /dev/ttyUSB0 

在Digi的IDE软件中,通过Window>Show View>Terminal来打开终端工具,点击该工具上方的表格状的配置按钮,打开Terminal配置,这里我们配置为串口终端,如下图所示:

点击ok,就打开了该串口终端,核心板上console口的输出将会在显示在这里。如果你安装的是标准Eclipse程序,其自带的Target Explorer Views>Terminals操作也是类似的。 但更一般地,我们还是使用minicom来作为Linux下的串口终端程序。

Digi的开发板上console口连接所需的配置为115200,8/N/1,无流控。使用minicom作为串口终端程序,请注意你的minicom配置,确保串口设备号和波特率等正确设置。按ctrl+a就可以显示出当前minicom配置,CTRL+A Z可以调出minicom的配置菜单。Minicom的终端界面如下图所示:

通常地,我们将TFTP服务器所在的电脑IP地址配置为192.168.42.1,以便和默认的核心模块网口IP在同一网段,如果您使用的内部网络有特殊要求,需要为核心模块配置内网IP,请参考U-Boot命令用setenv来设置ipaddr的值,以改变核心模块的IP地址或是用dhcp命令让核心模块的U-Boot自动获取一个内网IP。

默认地,核心板第一个以太网口出厂时U-Boot中定义的默认IP地址为:

 IP 192.168.42.10  Netmask 255.255.255.0 Gateway IP 0.0.0.0

你也可以在U-Boot中用print命令打印全部参数来查看对应值。

通常在量产时,我们需要把tftp服务器配置成核心板U-Boot上serverip参数的默认值:192.168.42.1,以便上电后核心板去自动查找该tftp服务器的根目录的自动更新脚本,来自动执行固件烧写升级操作。

在核心板上,通过U-Boot的update命令,可以进行固件更新,完整的命令参数,请参考U-Boot用户手册或是在U-Boot中输入

#help 命令名

来查阅。

设置环境变量和首次启动初始化参数

设置环境变量和首次启动初始化参数

对于CC6/CC6+来说,有着强大的视频处理能力,可以在U-Boot中配置不同显示屏的支持,比如LVDS屏,或是HDMI显示器等。

=> setenv extra_bootargs video=mxcfb0:dev=ldb,bpp=16,if=RGB666 video=mxcfb1:dev=hdmi,1920x1080M@60 video=mxcfb2:off video=mxcfb3:off

对于Android来说,在首次启动时,需要格式化data和cache区。

=> bootargs_once="androidboot.data=format androidboot.cache=format"
=> boot