组件固件更新 (CFU) 协议规范

此规范介绍用于更新电脑或配件上存在的组件的固件的通用 HID 协议。 该规范允许组件在下载期间接受固件,而不会中断设备操作。 该规范支持接受固件的组件可能有子组件(需要单独的固件映像)的配置。 该规范允许组件负责决定是否接受固件。 它还充当优化,因为固件映像仅在能够或已准备好接受该映像时才会发送到组件。

注意

CFU 在 Windows 10 版本 2004(Windows 10 2020 年 5 月更新)和更高版本中可用。

目录

表 5.1-1 GET_FIRMWARE_VERSION 响应布局

表 5.1-2 GET_FIRMWARE_VERSION 响应 - 标头布局

表 5.1-3 GET_FIRMWARE_VERSION响应 - 标头位

表 5.1-4 GET_FIRMWARE_VERSION响应 - 组件版本和属性布局

表 5.1-5 GET_FIRMWARE_VERSION响应 - 组件版本和属性咬伤

表 5.2-1 FIRMWARE_UPDATE_OFFER命令布局

表 5.2-2 FIRMWARE_UPDATE_OFFER 命令 - 组件信息布局

表 5.2-3 FIRMWARE_UPDATE_OFFER 命令 - 组件信息位

表 5.2-4 FIRMWARE_UPDATE_OFFER 命令 - 固件版本布局

表 5.2-5 FIRMWARE_UPDATE_OFFER 命令 - 固件版本位

表 5.2-6 FIRMWARE_UPDATE_OFFER 命令 - 供应商特定的布局

表 5.2-7 FIRMWARE_UPDATE_OFFER 命令 - 杂数和协议版本

表 5.2-8 FIRMWARE_UPDATE_OFFER响应令牌布局

表 5.2-9 FIRMWARE_UPDATE_OFFER 响应 - 令牌布局

表 5.2-10 FIRMWARE_UPDATE_OFFER响应 - 令牌位

表 5.2-11 FIRMWARE_UPDATE_OFFER 响应 - 拒绝原因布局

表 5.2-12 FIRMWARE_UPDATE_OFFER响应 - 拒绝原因位

表 5.2-13 FIRMWARE_UPDATE_OFFER响应 RR 代码值

表 5.2-14 FIRMWARE_UPDATE_OFFER响应状态布局

表 5.2-15 FIRMWARE_UPDATE_OFFER响应 - 状态位

表 5.2-16 FIRMWARE_UPDATE_OFFER响应状态值

表 5.3-1 FIRMWARE_UPDATE_OFFER - 信息命令布局

表 5.3-2 FIRMWARE_UPDATE_OFFER - 信息命令 - 组件布局

表 5.3-3 FIRMWARE_UPDATE_OFFER - 信息命令 - 组件位

表 5.3-4 FIRMWARE_UPDATE_OFFER - 信息命令 - 信息代码值

表 5.3-5 FIRMWARE_UPDATE_OFFER - 信息响应布局

表 5.3-6 FIRMWARE_UPDATE_OFFER - 信息数据包响应令牌布局

表 5.3-7 FIRMWARE_UPDATE_OFFER - 信息响应 - 令牌位

表 5.3-8 FIRMWARE_UPDATE_OFFER - 信息响应 - RR 代码布局

表 5.3-9 FIRMWARE_UPDATE_OFFER- 套餐信息响应 - RR 代码位

表 5.3-10 FIRMWARE_UPDATE_OFFER - 信息响应 - RR 代码值

表 5.3-11 FIRMWARE_UPDATE_OFFER - 套餐信息响应状态布局

表 5.3-12 FIRMWARE_UPDATE_OFFER - 套餐信息 - 响应状态位

表 5.4-1 FIRMWARE_UPDATE_OFFER - 扩展命令布局

表 5.4-2 FIRMWARE_UPDATE_OFFER - 扩展命令数据包 - 命令 - 组件布局

表 5.4-3 FIRMWARE_UPDATE_OFFER - 扩展命令 - 组件位

表 5.4-4 FIRMWARE_UPDATE_OFFER - 扩展命令 - 命令代码值

表 5.4-5 FIRMWARE_UPDATE_OFFER - 扩展命令数据包响应布局

表 5.4-6 FIRMWARE_UPDATE_OFFER - 提供命令数据包响应 - 令牌布局

表 5.4-7 FIRMWARE_UPDATE_OFFER - 提供命令响应 - 令牌位

表 5.4-8 FIRMWARE_UPDATE_OFFER - 提供信息数据包响应 RR 布局

表 5.4-9 FIRMWARE_UPDATE_OFFER- 提供命令响应 - RR 代码

表 5.4-10 FIRMWARE_UPDATE_OFFER - 提供命令数据包 - RR 代码值

表 5.4-11 FIRMWARE_UPDATE_OFFER - 提供命令数据包响应状态布局

表 5.4-12 FIRMWARE_UPDATE_OFFER - 提供命令数据包响应 RR 代码

表 5.5-1 FIRMWARE_UPDATE_CONTENT命令布局

表 5.5-2 FIRMWARE_UPDATE_CONTENT 命令标头布局

表 5.5-3 FIRMWARE_UPDATE_CONTENT标头位

表 5.5-4 FIRMWARE_UPDATE_OFFER - 提供命令数据包 - 标记值

表 5.5-5 FIRMWARE_UPDATE_CONTENT命令数据布局

表 5.5-6 FIRMWARE_UPDATE_CONTENT 命令数据位

表 5.5-7 FIRMWARE_UPDATE_CONTENT命令响应布局

表 5.5-8 FIRMWARE_UPDATE_CONTENT 响应 - 序列号

表 5.5-9 FIRMWARE_UPDATE_CONTENT - 命令 - 响应位

表 5.5-10 FIRMWARE_UPDATE_CONTENT响应状态布局

表 5.5-11 FIRMWARE_UPDATE_OFFER - 响应 - 状态位

表 5.5-12 FIRMWARE_UPDATE_OFFER - 响应 - 状态代码值

1 简介

如今的电脑和配件具有执行复杂操作的内部组件。 为了确保产品质量,需要在开发后期或交付给客户后频繁更新这些设备的行为。 此更新可以修复已识别的功能或安全问题,或者需要添加新功能。 大部分复杂逻辑位于设备上运行的固件中,这是可更新的。

此规范介绍了一种通用 HID 协议,用于更新电脑上或其配件上存在的组件的固件。 HID 实现超出了规范的范围。

协议的一些功能包括:

  • 该协议基于 HID(无处不在),并且通过各种互连总线(如 USB 和 I2C)提供 Windows 内置支持。 因此,可以利用同一软件(驱动程序)解决方案为所有组件更新固件。

    注意

    由于规范是基于数据包的,因此可以轻松地将其适应非 HID 方案。

  • 该规范允许组件在下载期间接受固件,而不会中断设备操作。 它为用户提供更好的体验,因为他们不必等待固件更新过程完成,然后才能恢复其他任务。 可以在单个原子操作中调用新固件,该操作对用户的影响最小。

  • 该规范支持接受固件的组件可能有子组件(需要单独的固件映像)的配置。

    注意

    将固件移交给子组件的组件的过程超出了此规范的范围。

  • 该规范支持产品/服务的概念,并依赖于负责的组件来决定是否接受固件。 接受新固件的决定并不简单。 固件类型和/或版本与新固件应用到的硬件的基础类型/版本之间可能存在依赖关系。 产品/服务还充当优化机制,因为仅当固件映像能够/准备好接受它时,才会将固件映像发送到组件。

1.1 术语表

术语 说明
组件 ID 在具有多个组件的设备中,组件 ID 唯一标识每个组件。
CRC 循环冗余检查

用于生成数据块的摘要或指纹的非加密哈希算法。 CRC 用作检查,以确保自计算 CRC 以来数据块未发生更改。 CRC 无法实现,但提供正确接收数据的信心。
设备 组件集合(一个主要组件和零个或多个子组件)。 设备以单个单元的形式对操作系统可见。 主机与设备交互,设备通常是主要组件。

计算机中可能有多个设备。 对于此规范,与 2 个不同的设备的通信是完全独立的。
驱动程序 使用 Windows Driver Foundation (WDF) 框架编写的驱动程序。
固件 在物理硬件上运行的代码。 固件是可更新的,通常驻留在与硬件关联的可编程内存中。
硬件 计算机上的一块硅。
主组件 计算机上的一块硬件及其固件。 在此规范的上下文中,组件是需要并接受固件更新的实体。
Segment 组件的固件映像可以分段为较小的段。 每个段都是一个小固件映像。
细分 ID 如果将组件的固件分段为较小的段,则段 ID 是段的唯一标识符。
Signature 用于确定固件映像是否已通过未经授权的方式更改的加密方式。 签名是可选的,但建议超出此规范的范围。
子组件 根据硬件体系结构,并非所有组件都对操作系统可见,因为它们可能连接到系统可见的组件的下游。 这些组件在此规范中称为子组件。
HID 顶级集合。
令牌 主机会话的标识符。 主机创建令牌并在命令中发送令牌,设备在响应中返回该令牌。 令牌可用于序列化某些事务,或标识会话已丢失,另一个已启动。

1.2 范围

1.2.1 目标

  • 需要一个与总线无关的解决方案,以避免每种类型的总线的新协议。 HID 无处不在,解决了这一要求。

  • 支持多组件设备的固件更新的功能,其中一个组件充当主组件,其他组件是连接到主组件的子组件。 每个组件都需要自己的固件,彼此之间具有非普通依赖项。

  • 用于将固件映像下载到组件的常见驱动程序模型。 然后,该组件具有用于转发到子组件的特定子组件算法。 子组件还可以对其固件执行有效性检查,并将结果传递回主组件。

  • 设备操作正在进行时支持固件更新的功能。

  • 通过授权工具更新/回滚生产设备中的固件,并通过Windows 更新更新市场内设备的功能。

  • 支持开发中的固件/市场内固件的灵活性。

  • 能够将大型固件映像分段为较小的段,使组件更容易接受固件映像。

1.2.2 非目标

  • 定义固件映像的内部格式:对于主机,固件映像是一组地址和有效负载条目。

  • 对接受的固件进行签名/加密/验证:此规范不介绍如何对固件映像进行签名和加密。 组件上运行的预期当前固件需要验证正在下载的固件。

  • 定义有关组件如何与子组件交互的机制:主机作为单个单元(通常是主组件)与设备交互。 该组件必须充当与子组件固件相关的通信的桥梁。

2 支持的硬件体系结构

为了支持灵活的硬件设计,协议支持多组件设备,其中每个组件都需要自己的固件映像。 在设计中,一个组件是主组件,依赖子组件连接到该主组件。 每个组件由组件 ID 唯一描述。

多组件设备作为单个单元对操作系统可见。 主机仅与设备交互,通常是使用此 CFU 协议的主要组件。 组件与其子组件之间的通信超出了此规范的范围。

在电脑上,可能有许多不同的设备(其中设备可能有一个或多个组件)。 在此协议的上下文中,与每个设备的通信是独立的。 每个设备都有相应的主机实例。

Device Firmware, Primary Component and its Sub-components.

3 协议先决条件

本部分列出了必须实现以利用此协议的规范和最佳做法:

  • 原子映像用法

    在成功下载整个固件映像之前,不会使用组件的固件映像。 如果固件拆分为多个段,则在从发送方接收最终段之前,不得使用该映像。 必须在最终映像上执行完整性检查。 建议使用传输(用于传送固件映像)具有错误更正和重试机制,以避免在出现传输错误时重复下载。

  • 固件更新不得中断设备操作

    接受固件映像的设备必须在更新期间运行。 设备必须具有额外的内存来存储和验证传入固件,而其当前固件不会被覆盖。

  • 身份验证和完整性

    实施程序决定构成真实固件映像的因素。 建议组件当前的固件至少必须验证传入固件映像的 CRC。 当前固件还应采用数字签名或其他错误检测算法。 如果验证失败,固件将拒绝更新。 故障恢复

    如果固件映像已下载且未成功,设备不得调用新固件并继续使用现有固件进行操作。 主机可以重试更新。 重试频率特定于实现。

  • 保密

    可选。 固件段可以加密。 加密和解密技术超出了此规范的范围。 无论固件有效负载是否已加密,此规范都将固件有效负载视为数据流。

  • 回滚保护

    回滚策略由主要组件强制执行,并且特定于实现。 组件上的当前固件根据内部策略(例如版本号)验证传入的固件映像,或者无法将版本类型从发布切换到调试,等等。 协议允许消息传送指示即使更新违反了回滚策略,也会接受更新。

4 CFU 协议概述

CFU 协议是一组命令和响应,需要将新的固件映像(s)从主机发送到要为其发送固件的设备。

在高级别上,协议循环访问要发送到设备的所有固件映像。 对于每个固件映像,主机 提供 将文件发送到设备。 仅当设备接受产品/服务时,主机才会发送该文件。

为了支持设备更新订单具有依赖项的情况,设备可能不接受第一次传递中的某些产品/服务,因此协议允许主机在解决所有依赖项之前将所有固件产品/服务重新发送给设备。

4.1 固件更新编程命令序列

下面是用于更新固件映像的 CFU 命令序列。

Firmware Update Programming Command Sequence.

4.1.1 状态:主机初始化通知

主机初始化自身并识别出它需要发送到设备的一组产品/服务后,主机发出一个OFFER_INFO_START_ENTIRE_TRANSACTION命令,以向组件指示主机现在已初始化。 此命令的目的是通知当前设备固件主机的新实例可用。 当主机的先前实例意外终止时,此通知非常有用。 设备必须成功完成此命令。

4.1.2 状态:OFFER_INFO_START_OFFER_LIST通知

在此状态下,主机发出OFFER_INFO_START_OFFER_LIST命令,以指示已准备好将产品/服务发送到当前设备固件。 设备的主要组件必须成功完成此命令。

此命令很有用,因为主机可能会多次向设备发送所有产品/服务。

4.1.3 状态:发送FIRMWARE_UPDATE_OFFER命令

如果组件想要接受/拒绝固件,主机会将产品/服务发送到主组件(或其子组件),以检查。 产品/服务包含有关固件映像的所有必要元数据,以便组件上的当前固件可以决定是否接受、笔触、跳过或拒绝产品/服务。

产品/服务可能适用于主要组件或子组件。 如果组件可以接受产品/服务,它将自行准备接收固件。 这可能涉及准备内存库来接收传入的固件映像。 例如,该组件可能不接受产品/服务,该组件可能已有主机打算发送的较新(或相同)固件版本。 有关详细信息,请参阅附录 1 中所述的示例:示例固件更新编程命令序列。

即使已接受产品/服务,主组件在下载后仍可能会拒绝固件映像,以便在收到完整性和/或回滚检查时收到的实际映像。 组件必须检查与产品/服务中的任何信息无关的每个固件映像属性。

主机发出FIRMWARE_UPDATE_OFFER命令,以通知主机打算发送的固件映像。

如果组件接受产品/服务,则其状态为FIRMWARE_UPDATE_OFFER_ACCEPT,从而接受产品/服务。

如果设备固件繁忙且主组件当前无法接受此产品/服务或下一个产品/服务,则会发送FIRMWARE_UPDATE_OFFER_BUSY状态的繁忙响应。

如果当前固件对产品/服务感兴趣,但无法接受产品/服务(例如,由于对子组件缺少更新的依赖),它会响应FIRMWARE_UPDATE_OFFER_SKIP指示它对此固件感兴趣,但无法接受它。 然后,主机将转到下一个产品/服务,以后必须重新提供此固件。

如果当前固件对产品/服务不感兴趣(例如,它是较旧版本),则它会以提供适当的拒绝原因FIRMWARE_UPDATE_OFFER_REJECT状态进行响应。 此状态不指示主机将来无法重新发送此产品/服务。 主机通常在每次初始化产品/服务或将产品/服务列表重新发送到设备时发送(请参阅状态:OFFER_INFO_START_OFFER_LIST通知)。

4.1.4 状态:发送固件

在此状态下,主机开始将固件映像发送到主要组件,组件以前已接受该产品/服务。

由于固件映像的内容可能超过单个命令的有效负载限制,因此主机会将固件映像分解为数据包。 主机在单独的 FIRMWARE_UPDATE CONTENT 命令中按顺序发送每个数据包。 主组件必须为每个命令生成响应数据包。

每个FIRMWARE_UPDATE CONTENT 命令描述包含部分固件有效负载的偏移地址。 该组件使用偏移量来确定必须存储部分固件有效负载的地址。 设备通过发送响应将内容写入适当的位置并确认命令。

对于主机发送的第一个数据包,它将设置FIRMWARE_UPDATE_FLAG_FIRST_BLOCK标志,指示设备这是固件映像的第一个数据包。 如果设备尚未准备好接收固件,则目前可能会这样做。

对于最后一个数据包,主机发送,它将设置FIRMWARE_UPDATE_FLAG_LAST_BLOCK标志。

在设备上当前固件写入此命令中包含的部分固件有效负载后,它必须在发送响应之前对传入固件映像执行验证和身份验证检查。 这几乎包括:

  • 用于验证整个固件映像的完整性的 CRC 检查。

  • 如果 CRC 检查成功,则可选验证传入映像的签名。

  • 检查可选签名后,版本检查以确保新固件版本与现有固件相同或更新。

如果传入的固件映像划分为较小的段,则由当前固件确定它是否为固件映像的最后一段,并随后将所有段作为验证的一部分包含在内。

如果上述检查通过,则当前固件可以设置设备以在下一次重置时交换到新映像,并将成功报告给主机。 通常,组件不会启动自我重置。 这是为了防止组件与之交互的任何软件、固件、硬件实体中断。 但是,这不是一项要求,可能会因实现而异。

如果验证步骤失败,固件不得在下一次重置时设置交换,并且必须指示对主机的故障响应。

4.1.5 决策状态:是否有更多优惠

在此状态下,主机确定是否有更多产品/服务要发送到设备。

4.1.6 状态:OFFER_INFO_END_OFFER_LIST通知

当主机已将所有产品/服务发送到当前设备固件中的主组件时,将达到此状态。 主机发送 OFFER_INFO_END_OFFER_LIST 命令,以指示已将所有产品/服务发送到组件。

设备必须成功完成此命令。

4.1.7 决策状态:重播产品/服务列表

主机确定是否需要重新发送所有产品/服务。 如果以前主要组件跳过了某些产品/服务并接受了某些产品/服务,则可能会发生这种情况。 主机必须再次重播产品/服务列表。

可能有其他特定于实现的逻辑可能导致重新播放产品/服务列表。

4.1.8 状态:设备正忙

此状态意味着设备返回了对产品/服务的繁忙响应。

主机将发送一个OFFER_NOTIFY_ON_READY命令,设备在设备免费之前不会响应接受命令。

5 CFU 协议数据包格式

CFU 协议作为一组命令和响应实现。 协议本质上是有序的。 对于主机发送到组件的每个命令,组件应响应(除非在此规范中明确声明)。 主机不会发送下一个命令,直到收到它发送的上一个命令的有效响应。

如果组件在一段时间内未响应或发送无效响应,主机可能会从头开始重启进程。 此协议未定义特定的超时值。

有命令可用于获取组件上当前固件的版本信息;发送产品/服务并发送固件映像。

但是,主机不需要根据从主要组件收到的有关查询的版本信息的响应来扣留产品/服务。 此信息可用于日志记录或其他目的。

5.1 GET_FIRMWARE_VERSION

获取主要组件的当前固件版本(及其子组件)。 该命令没有任何参数。

5.1.1 命令

主机发送此命令以查询主要组件(及其子组件)上的当前固件版本(s)。 主机可以使用它来确认固件是否已成功更新。 收到此命令时,主组件会自行和所有子组件使用固件版本进行响应。

5.1.2 响应

该组件使用主组件的固件版本和子组件进行响应。 响应大小为 60 字节,允许最多七个组件(一个主要组件和最多六个子组件)的版本信息。

表 5.1-1 GET_FIRMWARE_VERSION 响应布局

GET_FIRMWARE_VERSION Response Layout.

5.1.2.1 标头
表 5.1-2 GET_FIRMWARE_VERSION 响应 - 标头布局

GET_FIRMWARE_VERSION Response - Header Layout.

响应的标头提供以下信息。

表 5.1-3 GET_FIRMWARE_VERSION响应 - 标头位
位偏移量 字段 大小 说明
0 组件计数 8 通过此组件的此机制管理的可下载组件数。 组件计数确定最大表大小。 目前最多支持 7 个组件,以确保响应可以容纳在允许的 60 个字节内。
8 Rsvd 16 保留字段。 发送方必须将这些设置为 0。 接收方必须忽略此值。
24 协议版本 4 固件更新修订位表示 FW 更新协议修订目前在传输中使用。 对于此处定义的接口,FW 更新修订必须为 0010b。
28 Rsvd 3 保留字段。 发送方必须将这些设置为 0。 接收方必须忽略此值。
31 E 1 扩展标志是将来允许报告其他组件的协议挂钩。
5.1.2.2 组件版本和属性

对于每个组件,两个 DWORD 用于描述最多 7 个组件的组件属性。 如果标头中的组件计数小于 7,则响应末尾未使用的 DWORDS 必须设置为 0。

表 5.1-4 GET_FIRMWARE_VERSION响应 - 组件版本和属性布局

GET_FIRMWARE_VERSION Response - Component Version and Properties Layout.

每个组件特定的信息在两个 DWORD 中介绍,如下所示:

表 5.1-5 GET_FIRMWARE_VERSION响应 - 组件版本和属性咬伤
位偏移量 字段 大小 说明
0 固件版本 32 返回该组件的当前固件的版本。 此规范不要求固件版本采用任何特定格式。 有关指南,请参阅固件版本部分。
32 银行 2 可选。 根据体系结构,组件硬件可能有多个库,其中可能存储固件。 根据实现,发送方可以指定固件当前所在的银行。 此字段为“条件强制” - 支持是可选的,但不得用于任何其他目的。
34 Reserved 2 保留字段。 发送方必须将这些设置为 0。 接收方必须忽略此值。
36 供应商特定 4 可用于实现特定方式的供应商特定字段。

供应商可以使用这些位来编码信息,例如:

- 固件类型:预发布/自主机/生产;debug/retail

- 开发阶段

- 产品 ID,以防止组件使用相同的更新协议接收其他产品的固件。
40 组件 ID 8 组件的唯一标识符。
48 供应商特定 16 可用于实现特定方式的供应商特定字段。

5.1.3 映射到 HID

这作为 HID 获取功能 请求实现,除了报告 ID 外,响应大小为 60 字节。 功能报告长度容纳整个GET_FIRMWARE_VERSION响应。 没有与主机的“获取功能”请求关联的数据。

5.2 FIRMWARE_UPDATE_OFFER

确定主组件是接受还是拒绝固件。

5.2.1 命令

主机将此命令发送到组件,以确定它接受还是拒绝固件。 主机必须发送产品/服务,组件必须接受产品/服务,然后主机才能发送固件。

FIRMWARE_UPDATE_OFFER命令数据包的定义如下。

表 5.2-1 FIRMWARE_UPDATE_OFFER命令布局

FIRMWARE_UPDATE_OFFER Command Layout.

5.2.1.1 组件信息
表 5.2-2 FIRMWARE_UPDATE_OFFER 命令 - 组件信息布局

FIRMWARE_UPDATE_OFFER Command - Component Information Layout.

此表中描述了组件信息字节的位。

表 5.2-3 FIRMWARE_UPDATE_OFFER 命令 - 组件信息位
位偏移量 字段 大小 说明
0 段号 8 此字段用于将组件的固件分段为较小的段。 如果使用,此值指示后续有效负载数据包中包含的段。 例如 - 如果组件的固件映像非常大,并且主组件一次只能占用映像的较小部分,则可以使用此字段来指示此产品/服务适用于 整个映像的第 i 段。 可以将单独的产品/服务发送到包含 图像的第 i+1 段的主要组件,依此等。
8 Reserved 6 保留字段。 发送方必须将这些设置为 0。 接收方必须忽略此值。
14 I 1 强制立即重置 (I)

- 此位值用于指示组件在固件下载完成后立即重置自身,并验证以立即调用它。

- 此标志适用于开发阶段。
15 V 1 强制忽略版本 (V)

- 此标志适用于预发行或调试固件映像。 它向组件指示不要基于固件版本拒绝固件。

- 此标志适用于开发阶段。 它可用于有意回退到以前的固件版本。

- 生产固件应忽略此标志。
16 组件 ID 8 此字节用于多组件方案。 此字段可用于标识产品/服务的子组件。 如果未使用,则该值应为 0。 组件 ID 的可能值如下所示:

1 - 0xDF:有效

0xE0 - 0xFD:保留。 请不要使用。

0xFF:套餐是一个特殊的套餐信息数据包。 有关详细信息,请参阅FIRMWARE_UPDATE_OFFER信息。

0xFE:套餐是一个特殊的套餐命令数据包。 有关详细信息,请参阅FIRMWARE_UPDATE_OFFER扩展部分。
24 令牌 8 主机将产品/服务数据包中的唯一令牌插入组件。 此令牌必须由产品/服务响应中的组件返回。<

如果组件需要区分不同主机/类型的主机,这非常有用。

要使用的确切值特定于实现。 例如,一个值可用于驱动程序,另一个值可用于应用程序。 这样,当前设备固件就可以考虑 CFU 命令的潜在多个发送方。 一个可能的实现可能是接受第一个 CFU 命令,并拒绝具有不同令牌的所有其他命令,直到第一个 CFU 事务完成。
5.2.1.2 固件版本

这四个字节表示 32 位版本的固件。 此规范不要求固件版本的格式。 建议使用以下项。

表 5.2-4 FIRMWARE_UPDATE_OFFER 命令 - 固件版本布局

FIRMWARE_UPDATE_OFFER Command - Firmware Version Layout.

此规范不要求固件版本的格式,但建议遵循以下准则。

表 5.2-5 FIRMWARE_UPDATE_OFFER 命令 - 固件版本位
位偏移量 字段 大小 说明
0 变量 8 可以描述此字段以区分预发行固件和生产固件。 它可能指示用于对固件进行签名的签名类型。
8 次要版本 16 应为每个固件版本更新此字段值。

应为每个固件版本更新此字段值。
24 主要版本 8 此字段是固件映像的主要版本。 在寄送新生产线、对固件进行重大新更新等时,应更新此字段。
5.2.1.3 特定于供应商

这四个字节可用于对特定于供应商实现的产品/服务中的任何自定义信息进行编码。

5.2.1.4 Misc 和协议版本

这四个字节可用于对特定于供应商实现的产品/服务中的任何自定义信息进行编码。

表 5.2-6 FIRMWARE_UPDATE_OFFER 命令 - 供应商特定的布局

FIRMWARE_UPDATE_OFFER Command - Vendor Specific Layout.

此表中描述了供应商特定字节的位。

表 5.2-7 FIRMWARE_UPDATE_OFFER 命令 - 杂数和协议版本
位偏移量 字段 大小 说明
0 协议版本 4 此字段必须设置为 0010b,指示主机/产品/服务对应于 CFU 协议的版本 2。
4 Reserved 4 保留。 请不要使用。
8 Reserved 8 保留。 请不要使用。
16 供应商特定 16 此字段可用于对特定于供应商实现的产品/服务中的任何自定义信息进行编码。

5.2.2 响应

FIRMWARE_UPDATE_OFFER响应数据包的定义如下。

表 5.2-8 FIRMWARE_UPDATE_OFFER响应令牌布局

FIRMWARE_UPDATE_OFFER Response Token Layout.

5.2.2.1 令牌
表 5.2-9 FIRMWARE_UPDATE_OFFER 响应 - 令牌布局

FIRMWARE_UPDATE_OFFER Response - Token Layout.

此表中描述了 Token 字节的位。

表 5.2-10 FIRMWARE_UPDATE_OFFER响应 - 令牌位
位偏移量 字段 大小 说明
0 保留 8 保留。 请不要使用。
8 Reserved 8 保留。 请不要使用。
16 Reserved 8 保留。 请不要使用。
24 令牌 8 用于标识主机的令牌。
5.2.2.2 保留 (B7 - B4)

保留。 请不要使用。

5.2.2.3 拒绝原因 (RR)
表 5.2-11 FIRMWARE_UPDATE_OFFER 响应 - 拒绝原因布局

FIRMWARE_UPDATE_OFFER Response - Reject Reason Layout.

表 5.2-12 FIRMWARE_UPDATE_OFFER响应 - 拒绝原因位

此表中描述了拒绝原因字节的位。

位偏移量 字段 大小 说明
0 RR 代码 8 “拒绝原因代码”,指示组件拒绝产品/服务的原因。 此值取决于“状态”字段。 有关状态到 RR 代码映射,请参阅表 5.2-13。
8 Reserved 24 保留。 请不要使用。
表 5.2-13 FIRMWARE_UPDATE_OFFER响应 RR 代码值

此表中描述了 RR Code 字节的可能值。

RR 代码 名称 描述
0x00 FIRMWARE_OFFER_REJECT_OLD_FW 由于提供的固件的版本较旧或与当前固件相同,因此拒绝了产品/服务。
0x01 FIRMWARE_OFFER_REJECT_INV_COMPONENT 产品/服务被拒绝,因为提供的固件不适用于产品的平台。 这可能是由于不支持的组件 ID 或提供的映像与系统硬件不兼容。
0x02 FIRMWARE_UPDATE_OFFER SWAP_PENDING 组件固件已更新,但对新固件的交换处于挂起状态。 在交换完成之前,不会进行进一步的固件更新处理,通常通过重置。
0x03 - 0x08 (保留) 保留。 请不要使用。
0x09 - 0xDF (保留) 保留。 请不要使用。
0xE0 - 0xFF (供应商特定) 这些值由协议的设计器使用,含义是特定于供应商的。
5.2.2.4 状态
表 5.2-14 FIRMWARE_UPDATE_OFFER响应状态布局

FIRMWARE_UPDATE_OFFER Response Status Layout.

此表中描述了 Status 字节的位。

表 5.2-15 FIRMWARE_UPDATE_OFFER响应 - 状态位
位偏移量 字段 大小 说明
0 Status 8 此值表示组件决定接受、笔写、跳过或拒绝产品/服务。 该组件提供 RR Code 字段值中的原因。 有关状态到 RR 代码映射,请参阅表 5.2-16。
8 Reserved 24 保留。 请不要使用。

此表中描述了状态字节的可能值。

表 5.2-16 FIRMWARE_UPDATE_OFFER响应状态值
Status 名称 描述
0x00 FIRMWARE_UPDATE_OFFER_SKIP 该组件已决定跳过产品/服务。 主机以后必须再次提供它。
0x01 FIRMWARE_UPDATE_OFFER_ACCEPT 该组件已决定接受产品/服务。
0x02 FIRMWARE_UPDATE_OFFER_REJECT 该组件已决定拒绝产品/服务。
0x03 FIRMWARE_UPDATE_OFFER_BUSY 设备正忙,主机必须等到设备准备就绪。
0x04 FIRMWARE_UPDATE_OFFER_COMMAND 在组件信息字节中的组件 ID(请参阅 5.1.2.1.1 组件信息)设置为0xFE时使用。

对于设置为OFFER_NOTIFY_ON_READY请求的命令代码,指示配件已准备好接受其他产品/服务。
0xFF FIRMWARE_UPDATE_CMD_NOT_SUPPORTED 无法识别产品/服务请求。

5.2.3 映射到 HID 协议

该消息通过 HID 输出报告 机制颁发给组件,方法是使用固件更新的专用 HID 实用工具报告 ID。 使用附录中所述的 HID 实用工具 TLC。

5.3 FIRMWARE_UPDATE_OFFER - 信息

如果组件信息字节中的组件 ID(请参阅组件信息)设置为0xFF,则会重新定义位(15 个字节),以指示“仅提供信息”(从主机到组件)。 此机制允许扩展性和主机向设备提供特定信息的方法,例如“启动产品/服务列表”、“结束产品/服务列表”、“启动整个事务”。 产品/服务信息数据包始终立即被组件接受。

5.3.1 命令

FIRMWARE_UPDATE_OFFER -Information 命令数据包的定义如下:

表 5.3-1 FIRMWARE_UPDATE_OFFER - 信息命令布局

FIRMWARE_UPDATE_OFFER - Information Command Layout.

5.3.1.1 组件
表 5.3-2 FIRMWARE_UPDATE_OFFER - 信息命令 - 组件布局

FIRMWARE_UPDATE_OFFER - Information Command - Component Layout.

此表中描述了组件字节的位。

表 5.3-3 FIRMWARE_UPDATE_OFFER - 信息命令 - 组件位
位偏移量 字段 大小 说明
0 信息代码 8 此值指示信息的类型。 此值不是位掩码,只能是表 5.3-4 中所述的可能值之一。
8 保留。 8 保留。 请不要使用。
16 组件 ID 8 设置为0xFF。
24 令牌 主机将产品/服务数据包中的唯一令牌插入组件。 此令牌必须由产品/服务响应中的组件返回。
表 5.3-4 FIRMWARE_UPDATE_OFFER - 信息命令 - 信息代码值
Status 名称 描述
0x00 OFFER_INFO_START_ENTIRE_TRANSACTION 指示主机是新的,或已重新加载,并且整个产品/服务处理是(重新)启动。
0x01 OFFER_INFO_START_OFFER_LIST 指示主机产品/服务列表的开头,以防 Accessory 具有与确保在系统中另一个子组件之前更新一个子组件相关的下载规则。
0x02 OFFER_INFO_END_OFFER_LIST 指示主机中产品/服务列表的末尾。
5.3.1.2 保留 B7 - B4

保留。 请不要使用。

5.3.1.3 保留 B11 - B8

保留。 请不要使用。

5.3.1.4 保留 B15 - B12

保留。 请不要使用。

5.3.2 响应

FIRMWARE_UPDATE_OFFER - 套餐信息响应数据包回复的定义如下。

表 5.3-5 FIRMWARE_UPDATE_OFFER - 信息响应布局

FIRMWARE_UPDATE_OFFER - Information Response Layout.

5.3.2.1 令牌
表 5.3-6 FIRMWARE_UPDATE_OFFER - 信息数据包响应令牌布局

FIRMWARE_UPDATE_OFFER- Information Packet Response Token Layout.

此表中描述了 Token 字节的位。

表 5.3-7 FIRMWARE_UPDATE_OFFER - 信息响应 - 令牌位
位偏移量 字段 大小 说明
0 保留 8 保留。 请不要使用。
8 Reserved 8 保留。 请不要使用。
16 Reserved 8 保留。 请不要使用。
24 令牌 8 用于标识主机的令牌
5.3.2.2 保留 B7 - B4

保留。 请不要使用。

5.3.2.3 拒绝原因 (RR)
表 5.3-8 FIRMWARE_UPDATE_OFFER - 信息响应 - RR 代码布局

FIRMWARE_UPDATE_OFFER - Information Response - RR Code Layout.

此表中描述了拒绝原因字节的位。

表 5.3-9 FIRMWARE_UPDATE_OFFER- 套餐信息响应 - RR 代码位
位偏移量 字段 大小 说明
0 RR 代码 8 “拒绝原因代码”,指示组件拒绝产品/服务的原因。 表 5.3-10 中描述了可能的值。 此值取决于“状态”字段。
8 Reserved 24 保留。 请不要使用。

此表中描述了 RR Code 字节的可能值。

表 5.3-10 FIRMWARE_UPDATE_OFFER - 信息响应 - RR 代码值
RR 代码 名称 描述
0x00 FIRMWARE_OFFER_REJECT_OLD_FW 由于提供的固件的版本较旧或与当前固件相同,因此拒绝了产品/服务。
0x01 FIRMWARE_OFFER_REJECT_INV_COMPONENT 产品/服务被拒绝,因为提供的固件不适用于产品的平台。 这可能是由于不支持的组件 ID 或提供的映像与系统硬件不兼容。
0x02 FIRMWARE_UPDATE_OFFER SWAP_PENDING 组件固件已更新,但对新固件的交换处于挂起状态。 在交换完成之前,不会进行进一步的固件更新处理,通常通过重置。
0x03 - 0x08 (保留) 保留。 请不要使用。
0x09 - 0xDF (保留) 保留。 请不要使用。
0xE0 — 0xFF (供应商特定) 这些值由协议的设计器使用,含义是特定于供应商的。
5.3.2.4 状态
表 5.3-11 FIRMWARE_UPDATE_OFFER - 套餐信息响应状态布局

FIRMWARE_UPDATE_OFFER - Offer Information Response Status Layout.

此表中描述了 Status 字节的位。

表 5.3-12 FIRMWARE_UPDATE_OFFER - 套餐信息 - 响应状态位
位偏移量 字段 大小 说明
0 Status 8 此字段必须设置为FIRMWARE_UPDATE_OFFER_ACCEPT。 这表示组件已决定接受产品/服务。
8 保留。 24 保留。 请不要使用。

5.4 FIRMWARE_UPDATE_OFFER - 扩展

如果组件信息字节中的组件 ID 设置为0xFE,则会重新定义位(15 个字节),以指示从主机到设备固件的“产品/服务命令”。 此机制允许扩展性,以及主机向设备提供特定信息的方法。 当组件准备好响应 Accepted 时,将返回套餐命令数据包。

5.4.1 命令

如果组件信息字节中的组件 ID 设置为0xFE,则会重新定义四个 DWORD,如下所示:

表 5.4-1 FIRMWARE_UPDATE_OFFER - 扩展命令布局

FIRMWARE_UPDATE_OFFER - Extended Command Layout.

5.4.1.1 组件
表 5.4-2 FIRMWARE_UPDATE_OFFER - 扩展命令数据包 - 命令 - 组件布局

FIRMWARE_UPDATE_OFFER - Extended Command Packet - Command - Component Layout.

此表中描述了组件字节的位。

表 5.4-3 FIRMWARE_UPDATE_OFFER - 扩展命令 - 组件位
位偏移量 字段 大小 说明
0 命令代码 8 此值指示命令的类型。 此值不是位掩码,只能是表 5.4-4 中所述的可能值之一。
8 保留。 8 保留。 请不要使用。
16 组件 ID 8 设置为0xFE。
24 令牌 主机将产品/服务数据包中的唯一令牌插入组件。 此令牌必须由产品/服务响应中的组件返回。
表 5.4-4 FIRMWARE_UPDATE_OFFER - 扩展命令 - 命令代码值
Status 名称 描述
0x01 OFFER_NOTIFY_ON_READY 如果产品/服务以前被组件拒绝,则由主机发送。
0x02 - 0xFF 预留 预留
5.4.1.2 保留 B7 - B4

保留。 请不要使用。

5.4.1.3 保留 B11 - B8

保留。 请不要使用。

5.4.1.4 保留 B15 - B12

保留。 请不要使用。

5.4.2 响应

FIRMWARE_UPDATE_OFFER - 来自设备的套餐命令响应可能不会立即收到。 响应的定义如下。

表 5.4-5 FIRMWARE_UPDATE_OFFER - 扩展命令数据包响应布局

FIRMWARE_UPDATE_OFFER - Extended Command Packet Response Layout.

5.4.2.1 令牌
表 5.4-6 FIRMWARE_UPDATE_OFFER - 提供命令数据包响应 - 令牌布局

FIRMWARE_UPDATE_OFFER- Offer Command Packet Response - Token Layout.

此表中描述了 Token 字节的位。

表 5.4-7 FIRMWARE_UPDATE_OFFER - 提供命令响应 - 令牌位
位偏移量 字段 大小 说明
0 保留 8 保留。 请不要使用。
8 Reserved 8 保留。 请不要使用。
16 Reserved 8 保留。 请不要使用。
24 令牌 8 用于标识主机的令牌。
5.4.2.2 保留 B7 - B4

保留。 请不要使用。

5.4.2.3 拒绝原因
表 5.4-8 FIRMWARE_UPDATE_OFFER - 提供信息数据包响应 RR 布局

FIRMWARE_UPDATE_OFFER - Offer Information Packet Response RR Layout.

此表中描述了拒绝原因字节的位。

表 5.4-9 FIRMWARE_UPDATE_OFFER- 提供命令响应 - RR 代码
位偏移量 字段 大小 说明
0 RR 代码 8 此值取决于“状态”字段。 有关可能的 RR 代码值,请参阅表 5.4-10。
8 Reserved 24 保留。 请不要使用。

此表中描述了 RR Code 字节的可能值。

表 5.4-10 FIRMWARE_UPDATE_OFFER - 提供命令数据包 - RR 代码值
RR 代码 名称 描述
0x00 FIRMWARE_OFFER_REJECT_OLD_FW 由于提供的固件的版本较旧或与当前固件相同,因此拒绝了产品/服务。
0x01 FIRMWARE_OFFER_REJECT_INV_COMPONENT 产品/服务被拒绝,因为提供的固件不适用于产品的平台。 这可能是由于不支持的组件 ID 或提供的映像与系统硬件不兼容。
0x02 FIRMWARE_UPDATE_OFFER SWAP_PENDING 组件固件已更新,但对新固件的交换处于挂起状态。 在交换完成之前,不会进行进一步的固件更新处理,通常通过重置。
0x03 - 0x08 (保留) 保留。 请不要使用。
0x09 - 0xDF (保留) 保留。 请不要使用。
0xE0 — 0xFF (供应商特定) 这些值由协议的设计器使用,含义是特定于供应商的。
5.4.2.4 状态
表 5.4-11 FIRMWARE_UPDATE_OFFER - 提供命令数据包响应状态布局

FIRMWARE_UPDATE_OFFER - Offer Command Packet Response Status Layout.

此表中描述了 Status 字节的位。

表 5.4-12 FIRMWARE_UPDATE_OFFER - 提供命令数据包响应 RR 代码
位偏移量 字段 大小 说明
0 Status 8 此字段必须设置为FIRMWARE_UPDATE_OFFER_ACCEPT。 这表示组件已决定接受产品/服务。
8 保留。 24 保留。 请不要使用。

5.5 FIRMWARE_UPDATE_CONTENT

主机将此命令发送到设备固件,以提供固件内容(即固件映像)。 整个映像文件不应适合单个命令。 主机必须将映像分解为较小的块,每个命令一次发送一个映像块。

主机在每个命令中都指示其他信息-它是否是固件的第一个块、最后一个块等。 设备固件的主要组件接受传入固件映像的每个块,将其存储到其内存中,并且必须单独响应每个命令。

当主组件收到最后一个块时,该组件将验证整个固件映像(CRC 检查,签名验证)。 根据这些检查的结果返回最后一个块的相应响应(失败或成功)。

5.5.1 命令

表 5.5-1 FIRMWARE_UPDATE_CONTENT命令布局

FIRMWARE_UPDATE_CONTENT Command Layout.

5.5.1.1 标头 (B7 - B0)
表 5.5-2 FIRMWARE_UPDATE_CONTENT 命令标头布局

FIRMWARE_UPDATE_CONTENT Command Header Layout.

此表中描述了FIRMWARE_UPDATE_CONTENT标头的位。

表 5.5-3 FIRMWARE_UPDATE_CONTENT标头位
位偏移量 字段 大小 说明
0 标记 8 此字段提供有关命令的额外信息。 此值是用于数据传输的标志掩码。 表 5.5-4 中描述了可能的值。
8 数据长度 8 指示要写入的字节数的适用数据字段的长度。

给定此命令的大小,长度允许的最大值为 52 字节。
16 序列号 16 此值由主机创建,对于颁发的每个内容数据包都是唯一的。 组件必须返回对此请求的响应中的序列号。
32 固件地址 32 小 Endian (LSB First) 地址以写入数据。 地址基于 0。 固件将此用作偏移量,用于确定在内存中放置图像时所需的地址。

此表中描述了 Flags 字节的可能值。

表 5.5-4 FIRMWARE_UPDATE_OFFER - 提供命令数据包 - 标记值
标记 名称 描述
0x80 FIRMWARE_UPDATE_FLAG_FIRST_BLOCK 此标志指示这是固件映像的第一个块。
0x40 FIRMWARE_UPDATE_FLAG_LAST_BLOCK 此标志指示这是固件映像的最后一个块,并且映像已准备好进行验证。

在将此块写入非易失性内存后,组件上的当前固件对整个下载的固件映像执行验证非常重要。
5.5.1.2 数据
表 5.5-5 FIRMWARE_UPDATE_CONTENT命令数据布局

FIRMWARE_UPDATE_CONTENT Command Data Layout.

此表中描述了FIRMWARE_UPDATE_CONTENT数据的位。

表 5.5-6 FIRMWARE_UPDATE_CONTENT 命令数据位
位偏移量 字段 大小 说明
64 数据 最大 52. 要写入的字节数组。 主机通常基于产品体系结构发送 4 个字节的块。 末尾的任何未使用的字节必须填充 0。

5.5.2 响应

表 5.5-7 FIRMWARE_UPDATE_CONTENT命令响应布局

FIRMWARE_UPDATE_CONTENT Command Response Layout.

5.5.2.1 序列号
表 5.5-8 FIRMWARE_UPDATE_CONTENT 响应 - 序列号

FIRMWARE_UPDATE_CONTENT Response - Sequence Number.

此表中描述了FIRMWARE_UPDATE_CONTENT响应(3-0)的位。

表 5.5-9 FIRMWARE_UPDATE_CONTENT - 命令 - 响应位
位偏移量 字段 大小 说明
0 序列号 16 此字段是请求中主机发送的序列号。
16 Reserved 16 保留。 请不要使用。
5.5.2.2 状态
表 5.5-10 FIRMWARE_UPDATE_CONTENT响应状态布局

FIRMWARE_UPDATE_CONTENT Response Status Layout.

此表描述了FIRMWARE_UPDATE_CONTENT响应(7-4)的位。

表 5.5-11 FIRMWARE_UPDATE_OFFER - 响应 - 状态位
位偏移量 字段 大小 说明
0 Status 8 此值指示设备组件返回的状态代码。 这不是按位的,可以是表 5.5-12 中所述的值之一。
8 Reserved 24 保留。 请不要使用。

此表中描述了状态字节的可能值。

表 5.5-12 FIRMWARE_UPDATE_OFFER - 响应 - 状态代码值
标记 名称 描述
0x00 FIRMWARE_UPDATE_SUCCESS 已成功完成请求。
0x01 FIRMWARE_UPDATE_ERROR_PREPARE 该组件未准备好接收固件内容。

如果使用,则此代码通常用于响应第一个块。 例如,在闪存上擦除错误。
0x02 FIRMWARE_UPDATE_ERROR_WRITE 请求无法写入字节。
0x03 FIRMWARE_UPDATE_ERROR_COMPLETE 请求无法设置交换以响应FIRMWARE_UPDATE_FLAG_LAST_BLOCK。
0x04 FIRMWARE_UPDATE_ERROR_VERIFY DWORD 验证失败,以响应FIRMWARE_UPDATE_FLAG_VERIFY。
0x05 FIRMWARE_UPDATE_ERROR_CRC 固件映像的 CRC 响应FIRMWARE_UPDATE_FLAG_LAST_BLOCK失败。
0x06 FIRMWARE_UPDATE_ERROR_SIGNATURE 固件签名验证未能响应FIRMWARE_UPDATE_FLAG_LAST_BLOCK。
0x07 FIRMWARE_UPDATE_ERROR_VERSION 固件版本验证未能响应FIRMWARE_UPDATE_FLAG_LAST_BLOCK。
0x08 FIRMWARE_UPDATE_SWAP_PENDING 固件已更新,交换处于挂起状态。 在重置附件之前,无法接受进一步的固件更新命令。
0x09 FIRMWARE_UPDATE_ERROR_INVALID_ADDR 固件检测到消息数据内容中的目标地址无效。
0x0A FIRMWARE_UPDATE_ERROR_NO_OFFER FIRMWARE_UPDATE_OFFER 命令在未首先收到有效且接受的固件更新产品/服务的情况下接收。
0x0B FIRMWARE_UPDATE_ERROR_INVALID FIRMWARE_UPDATE_OFFER 命令的常规错误,例如无效的适用数据长度。
5.5.2.3 保留 B8 - B11

保留。 请不要使用。

5.5.2.4 保留 B12 - B15

保留。 请不要使用。

6 附录 1:固件更新编程命令序列示例

6.1 示例 1

请考虑以下设备固件:

  • 主组件 - 组件 ID 1 - 当前固件版本 7.0.1

  • 子组件 - 组件 ID 2 - 当前固件版本 12.4.54

  • 子组件 - 组件 ID 3 - 当前固件版本 4.4.2

  • 子组件 - 组件 ID 4 - 当前固件版本 23.32.9

主机具有以下三个固件映像:

  • 组件 ID 1 - 固件版本 7.1.3

  • 组件 ID 2 - 固件版本 12.4.54

  • 组件 ID 3 - 固件版本 4.5.0

序列将为:

  1. 主机产品/服务:组件 ID 1 - 固件版本 7.1.3

  2. 主要组件接受产品/服务

  3. 主机发送固件映像

  4. 主组件接受固件,验证它

  5. 主机产品/服务:组件 ID 2 - 固件版本 12.4.54

  6. 主要组件拒绝产品/服务

  7. 主机产品/服务:组件 ID 3 - 固件版本 4.5.0

  8. 主要组件接受产品/服务

  9. 主机发送固件映像

  10. 主组件接受固件,验证它

由于未拒绝所有产品/服务,主机会重播所有产品/服务:

  1. 主机产品/服务:组件 ID 1 - 固件版本 7.1.3

  2. 组件拒绝

  3. 主机产品/服务:组件 ID 2 - 固件版本 12.4.54

  4. 组件拒绝

  5. 主机产品/服务:组件 ID 3 - 固件版本 4.5.0

  6. 组件拒绝

6.2 示例 2

请考虑以下设备固件:

  • 主组件 - 组件 ID 1 - 当前固件版本 7.0.1

  • 子组件 - 组件 ID 2 - 当前固件版本 12.4.54

  • 子组件 - 组件 ID 3 - 当前固件版本 7.4.2

  • 子组件 - 组件 ID 4 - 当前固件版本 23.32.9

主机具有以下三个固件映像:

  • 组件 ID 1 - 固件版本 8.0.0

  • 组件 ID 2 - 固件版本 12.4.54

  • 组件 ID 3 - 固件版本 9.0.0

此外,实现要求子组件的固件版本不得小于主组件上运行的固件版本。 主机不知道该要求,并且它由主要组件来确保此规则。

序列将为:

  1. 主机产品/服务:组件 ID 1 - 固件版本 8.0.0

  2. 主组件拒绝(因为组件 ID 3 尚未更新)

  3. 主机产品/服务:组件 ID 2 - 固件版本 12.4.54

  4. 主组件拒绝

  5. 主机产品/服务:组件 ID 3 - 固件版本 9.0.0

  6. 主要组件接受产品/服务

  7. 主机发送固件映像

  8. 主组件接受固件,验证它

由于所有产品/服务均未被拒绝,主机会重播所有产品/服务

  1. 主机产品/服务:组件 ID 1 - 固件版本 8.0.0

  2. 主要组件接受产品/服务

  3. 主机发送固件映像

  4. 主组件接受固件,验证它

  5. 主机产品/服务:组件 ID 2 - 固件版本 12.4.54

  6. 主组件拒绝

  7. 主机产品/服务:组件 ID 3 - 固件版本 9.0.0

  8. 主组件拒绝