===== Digi核心模块固件更新的方法和操作步骤 ===== Digi核心板或核心模块是一个带有ARM处理器,闪存,RAM和电源管理芯片,并将处理器引脚引出的完整片上系统,可以把核心模块当成一片微型计算机。在核心模块的闪存中预置有Digi深度定制的U-Boot启动器,上电时,系统镜像就能被U-Boot加载到RAM中运行,完成系统的启动。向闪存中烧入U-Boot或不同的操作系统镜像的过程,则称为固件更新。Digi核心模块支持多种向flash更新固件的方式,包括利用U-Boot通过网络TFTP或是SD卡,USB接口等来更新固件,以及在Linux系统中在线更新固件等各种不同的方式。 ====使用U-Boot命令更新固件==== 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-terminal|windows终端程序]] * [[#linux-terminal|Linux终端程序]] 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因为误操作或烧入不可用的固件而无法启动,请参考[[http://#|如何恢复核心模块的U-Boot]]来通过USB来恢复U-Boot固件到内置的闪存中。 不论通过哪种介质在U-Boot中升级固件,首先都要下载或编译好待更新的固件,对于DEY系统来说,完整的固件包括U-Boot,内核,恢复分区,文件系统四个。[[ftp://ftp1.digi.com/support/|Digi官方的FTP]]网站提供了各种预编译的固件,您可以在此下载卡刷包,或是下载单个或多个待更新的固件。 * [[#cc6ul-lfw|CC6UL DEY固件]] * [[#cc6-lfw|CC6/CC6+ DEY固件]] * [[#cc6-afw|CC6/CC6+ Android固件]] .imx ----- U-Boot启动器\\ .boot.ubifs ----- 内核和设备树分区固件\\ .ubifs ----- 文件系统固件\\ .recovery.ubifs ----- 预留的恢复固件\\ .imx ----U-Boot启动器\\ .vfat ----- 内核和设备树分区固件\\ .ext4 ----- 文件系统固件\\ .vfat ----- 预留的恢复固件\\ .imx ----U-Boot启动器\\ boot.img ----- 内核和设备树分区固件\\ system.img ----- 文件系统固件\\ recovery.img ----- 预留的恢复固件\\ \\ ===通过网络更新固件=== 通过网络TFTP服务来更新核心模块的片上系统显得十分方便。在使用前,您需要接好网线,并在U-Boot中配置好核心模块的IP以及存放有待升级固件的TFTP服务器IP。\\ 默认地,核心模块的第一个网口IP地址为:192.168.42.30,您可以更改为和电脑同一网段,这可以通过配置自动获取IP或是固定IP来实现。 * [[#uboot-dhcp|DHCP自动获取IP]] * [[#uboot-staticip|固定的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请求的协议。 \\ * [[#cc6ul-lfw-tftp|CC6UL 用网络更新DEY]] * [[#cc6-lfw-tftp|CC6/CC6+ 用网络更新DEY]] * [[#cc6-afw-tftp|CC6/CC6+ 用网络更新Android]] **更新U-Boot**\\ 注意核心模块出厂已经带了稳定版本的U-Boot,如果使用原厂的U-Boot,你并无需频繁更新。若要更新U-Boot,执行:\\ => update uboot tftp .imx \\ 通常更新完U-Boot,你需要重新启动以便使用它。不同版本的U-Boot可能带来参数的增加或变化,建议重新启动后,执行一次\\ => env default -a \\ => saveenv \\ 这样可以使得模块恢复该版本的默认参数。 \\ 注意,IP地址也恢复默认,所以需参考上述部骤重设置一下网络和serverip **更新Linux系统**\\ =>update linux tftp .boot.ubifs \\ => update rootfs tftp .ubifs \\ => update recovery tftp .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 .vfat \\ => update rootfs tftp .ext4 \\ => update recovery tftp .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卡更新固件的相关功能。 * [[#cc6ul-lfw-sd|CC6UL 用uSD卡更新DEY]] * [[#cc6-lfw-sd|CC6/CC6+ 用uSD卡更新DEY]] * [[#cc6-afw-sd|CC6/CC6+ 用uSD卡更新Android]] **更新U-Boot**\\ 注意核心模块出厂已经带了稳定版本的U-Boot,如果使用原厂的U-Boot,你并无需频繁更新。若要更新U-Boot,执行:\\ => update uboot mmc 0 fat .imx \\ 通常更新完U-Boot,你需要重新启动以便使用它。不同版本的U-Boot可能带来参数的增加或变化,建议重新启动后,执行一次\\ => env default -a \\ => saveenv \\ 这样可以使得模块恢复该版本的默认参数。 \\ **更新Linux系统**\\ =>update linux mmc 0 fat .boot.ubifs \\ => update rootfs mmc 0 fat .ubifs \\ => update recovery mmc 0 fat .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 .vfat \\ => update rootfs mmc 1 fat .ext4 \\ => update recovery mmc 1 fat .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 \\ \\ ====在DEY系统中在线更新固件==== 待续,请先参考官方英文文档 ====恢复无法启动的核心模块的固件==== CC6UL:[[digi:arm-embedded:cc6ul:cc6ul-recovery|修复无法启动的ConnectCore 6UL核心模块]] CC6:[[digi:arm-embedded:cc6:cc6-recovery|修复无法启动的CC6模块]] ====附TFTP服务器软件和串口终端程序的设置==== * Windows操作系统 可以参考下面说明,适用于Windows的TFTP服务器软件也可以从Digi的官网下载。虽然您可以使用第三方提供的TFTP软件,但为了保险起见,在windows下最好用Digi提供的版本。 [[http://ftp1.digi.com/support/developmentsoftware/TFTP_Server.zip|Digi TFTP服务器软件]] Digi TFTP服务器是个绿色软件,您最好解压在磁盘上不带中文路径的目录下,点击配置按钮,把server选项卡按如下方式配置。 {{digi:arm-embedded:linux:del:digi_tftp_server_config.png?400|}} 配置好tftp服务器后,如果您的镜像还没放到c:\tftpboot\,请手动拷贝到该目录下。如果硬盘空间有限,也可以在tftp根目录下使用硬链接文件,注意TFTP是不支持软链接文件的。 除了TFTP服务器外,还需要一个终口终端程序来与核心板的进行交互。一般可以用超级终端或是putty等支持串口的终端程序,如果你安装有Digi的IDE软件,一般都自带有一个Terminal终端程序,可以在IDE的菜单中打开。比如我们用Putty,使用USB转串口,在windows上的串口号是com5,可以按如下方式配置putty为串口终端。 {{digi:arm-embedded:linux:del:putty-com.png?400|}} 硬件上把电脑和核心板开发套件通过网线和串口线连接好,其中电脑端的IP要配置成核心板UBoot中的参数serverip指定的IP地址,并且和核心板的IP地址ipaddr在同一个网段。确保这些没有问题后,就可以通过点击TFTP服务程序左上角的小三角箭头运行TFTP服务,等待来自核心板的请求。 * Linux 为了在Linux环境中进行固件更新,同样地,您需要有tftp服务器软件和串口终端程序。可以参考[[digi:arm-embedded:linux:ubuntu常用软件安装配置|常用软件安装配置]]来安装配置tftp服务器软件tftpd-hpa和minicom串口终端。 虽然调试终端和TFTP服务器软件无需在同一台电脑上,不过简单起见,大多数情况我们还是在同一台电脑上操作,所以确保tftpd-hpa服务已经运行,可以接受U-Boot的连接和传输请求。 如果您电脑上安装有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配置,这里我们配置为串口终端,如下图所示: {{digi:arm-embedded:linux:del:digiesp_terminal_serial.png?400|}} 点击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的终端界面如下图所示: {{digi:arm-embedded:linux:dey:minicom-console.png?500|}} 通常地,我们将TFTP服务器所在的电脑IP地址配置为192.168.42.1,以便和默认的核心模块网口IP在同一网段,如果您使用的内部网络有特殊要求,需要为核心模块配置内网IP,请参考U-Boot命令用setenv来设置ipaddr的值,以改变核心模块的IP地址或是用dhcp命令让核心模块的U-Boot自动获取一个内网IP。 ====U-Boot配置和操作说明==== 默认地,核心板第一个以太网口出厂时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