原始分区更新

更新命令通过执行以下操作简化了更新eMMC分区的任务:

  • 从指定的介质下载所需的固件映像文件到RAM内存。

  • 检索并检查要更新的分区的信息(偏移量、大小)。

  • 将固件映像写入分区。

  • 回读并验证写入的固件映像。

语法

“更新”的语法
=>help update update - Digi模块更新命令用法:update  [source] [extra-args…]描述:更新(原始写入)在$mmcdev通过参数:- partition:分区索引,GUID分区名称,或保留名称之一:uboot - [source]: tftp|nfs|mmc|ram - [extra-args]:额外的参数取决于'source' source=tftp|nfs -> [filename] - filename:文件传输(如果没有提供,filename将从变量$_file中获取)source=mmc|usb -> [device:part] [filename] - device:part:设备和分区的数量- filename:要传输的文件(如果没有提供,文件名将从变量$_file中获取)source=ram -> [image_address] [image_size] - image_address: ram中图像的地址(如果没有提供$loadaddr) - image_size: ram中图像的大小(如果没有提供$filesize)

例子

例1:更新分区名称的名字与文件test.img从TFTP下载:

=>更新myname TFTP test.img

例2:更新分区名称linux在模块的eMMC中使用默认文件名(由变量决定)linux_file美元)从uSD卡上的FAT分区读取文件;

=>更新Linux MMC 1:1 fat

检查默认分区名存储布局

使用环境变量进行定制

您可以通过参数和使用以下环境变量来定制update命令的行为:

地址

变量 描述

update_addr美元

下载用于更新的固件映像文件的RAM地址。

verifyaddr美元

固件映像被读回的RAM地址,用于验证。U-Boot自动将此变量设置为可用RAM的中间RAM地址,从loadaddr美元,以最大限度地扩大可以转移到RAM并在更新过程中进行验证的固件的大小。

图像文件名

变量 描述

uboot_file美元

用于更新引导加载程序的默认映像文件名(如果没有作为参数传递文件名)。

$ <分区名称>带有_file

这种形式的变量将包含用于更新命名的分区的默认文件名<分区名称>。例如,包含分区的默认文件名的变量复苏会被称为recovery_file美元

目标媒体

变量 描述

mmcdev美元

要写入固件的目标MMC设备索引。

mmcbootpart美元

对于“u-boot”分区更新,目标MMC分区索引写入固件。

更新引导加载程序

你可以使用更新命令,手动更新eMMC中的引导加载程序。例如,使用缺省文件名(在变量中)从TFTP进行更新uboot_file美元):

=>更新uboot TFTP
写入无效的引导加载程序文件可能导致目标无法引导。

Digi不时发布U-Boot更新以修复问题或添加新功能。添加到U-Boot中的许多自定义功能取决于环境变量和脚本,这些变量和脚本可能在新发布的版本中具有新值。Digi建议您在升级U-Boot后将环境重置为默认设置:

将U-Boot环境重置为默认值
=>Env default -a

这将重置整个环境,除了受保护的变量(如MAC地址)。在重置环境之后,您可能需要调整制造或引导脚本,以适应默认环境中的更改,例如新的或修改的脚本、变量和默认文件名。

看到U-Boot文件的变体来验证您需要哪个U-Boot二进制文件。

动态更新机制

普通的更新命令首先将文件完全从介质传输到RAM内存中。然后将文件从RAM写入eMMC。有时,用于更新某个分区的固件文件非常大,可能比平台的可用RAM还大。在这种情况下,更新策略必须:

  • 将文件的一个块从指定的介质传输到RAM存储器。

  • 将块写入分区并验证写入的数据。

  • 重复该过程,直到文件完全写入。

我们称这种机制为动态更新。

动态更新机制只能在从TFTP源进行更新时起作用,并且只推荐用于更新非常大的映像。请注意,如果在文件传输过程中出现任何问题,则分区将保留部分写入(与标准更新相比,如果传输失败,分区将保持不变)。

出于安全原因,在更新引导加载程序时将自动禁用动态更新机制。

您可以通过设置变量来激活动态更新机制otf-update美元是的,然后正常使用update命令。如果变量otf-update美元没有定义,则更新命令可能会自动激活动态更新机制,如果要更新的分区的大小大于用于保存固件的可用RAM。(TFTP协议不指示传输文件的大小。)

动态更新机制在将每个块写入eMMC时暂停TFTP传输,并在回读并验证写入的数据后继续传输。由于这个原因,它可能不能与所有TFTP服务器一起工作。一定要检查TFTP服务器是否有足够大的超时,以便在设备进行写入和验证时,它不会因为没有及时收到客户机的ack而取消传输。此外,禁用任何不等待客户端的ack就发送数据包的机制(如预期窗口),这些机制可能并不总是与动态更新机制一起工作。

更新分区内的文件

updatefile命令简化了分区文件系统中文件的更新。标准更新命令将原始数据写入eMMC,而updatefile命令使用U-Boot文件系统支持,通过以下操作将文件写入格式化的分区:

  • 从指定的媒体下载所需的文件到RAM内存。

  • 将文件写入分区的文件系统。

语法

“updatefile”语法
=>help updatefile updatefile - Digi modules updatefile命令用法:updatefile  [source] [extra-args…]说明:通过在$mmcdev中更新/写入中的文件参数:- partition:分区索引或GUID分区名称,用于上传文件- [source]: tftp|nfs|mmc|ram - [extra-args]:额外参数取决于'source' source=tftp|nfs -> [source_file] [targetfile] [target_fs] - source_file:要传输的文件- target_file:目标文件名- target_fs: fat(默认)source=mmc -> [device:part] [filesystem] [source_file] [target_file] [target_fs] - device:part:设备和分区的数量-文件系统:fat(默认)|ext4 - source_file:要传输的文件- target_file:目标文件名- target_fs: fat(默认)source=ram -> [image_address] [image_size] [target_fs] - image_address: ram中映像的地址(如果没有提供$loadaddr) - image_size: ram中映像的大小(如果没有提供$filesize) - target_file:目标文件名- target_fs: fat(默认)

例子

例1:更新newkernel.bin文件从TFTP到linuxFAT分区:

=>Updatefile Linux TFTP newkernel.bin

例2:更新newkernel.bin文件从uSD卡FAT分区3到linuxFAT分区,用文件名保存myImage-test

=>updatefile linux mmc:3 fat newkernel.bin

限制和注意事项

  • 仅支持FAT和EXT4文件系统。

  • 文件只能被覆盖,不能被删除。

  • 文件系统支持不检查可用空间。

在没有空间的文件系统上写入文件可能会损坏整个文件系统。