fwupd项目中的BOS DS20规范解析:实现设备自描述固件更新

fwupd项目中的BOS DS20规范解析:实现设备自描述固件更新

fwupd A system daemon to allow session software to update firmware fwupd 项目地址: https://gitcode.com/gh_mirrors/fw/fwupd

引言:固件更新面临的挑战

在现代计算环境中,固件更新对于设备安全性和功能完善至关重要。fwupd作为一个开源的固件更新框架,为Linux系统提供了统一的固件更新解决方案。然而,在实际部署过程中,fwupd面临一个关键挑战:如何在不频繁更新fwupd软件包本身的情况下,支持新设备的固件更新功能。

传统上,fwupd通过设备ID(如USB的VID/PID)匹配对应的插件(plugin),这些匹配规则需要预先编码在fwupd软件包中。这种机制导致了一个严重问题:当新设备发布时,用户必须等待Linux发行版更新fwupd软件包才能获得固件更新支持,这个过程可能耗时数周甚至数年。

BOS DS20规范的诞生

为了解决这一问题,fwupd项目引入了BOS DS20规范。这是一种创新的设备自描述机制,允许USB设备通过标准的USB描述符主动声明自己所需的fwupd插件和配置参数,从而摆脱对主机端预配置的依赖。

技术原理

BOS(Binary Object Store)是USB 2.1及更高版本引入的一种描述符类型,用于提供设备的扩展能力信息。fwupd利用这一机制定义了一个特定类型的平台能力描述符:

  1. 描述符标识:使用类型为0x05的平台能力描述符,并指定一个专有的UUID(010aec63-f574-52cd-9dda-2852550d94f0),这个UUID是通过DNS命名空间对"fwupd"进行类型5 SHA-1哈希生成的。

  2. 版本控制:描述符中包含一个版本号字段(dwVersion),设备可以指定支持该描述符的最低fwupd版本(1.9.14及以上)。

  3. 数据获取:fwupd通过特定的USB控制请求(使用描述符中指定的bVendorCode)获取设备的配置信息。

实现细节

描述符结构

BOS DS20描述符采用二进制格式,典型结构如下(十六进制表示):

1C 10 05 00 63 ec 0a 01 74 f5 cd 52 9d da 28 52 55 0d 94 f0 0e 09 01 00 20 00 2a 00

各字段含义:

  • bLength (1C): 描述符总长度
  • bDescriptorType (10): 描述符类型(BOS)
  • bDevCapabilityType (05): 设备能力类型(平台能力)
  • PlatformCapabilityUUID: 固定值(fwupd专用UUID)
  • dwVersion: 最低支持的fwupd版本
  • wLength: 控制传输请求返回数据的最大长度
  • bVendorCode: 用于获取数据的控制请求代码
  • bAltEnumCmd: 必须为0

数据格式

设备在响应控制请求时,应返回UTF-8编码的键值对数据,格式类似于INI文件。例如:

Plugin=dfu
Icon=computer

这些数据将作为设备的"quirk"配置,指导fwupd如何与该设备交互。

开发实践

生成描述符

开发者可以通过创建XML配置文件来生成BOS DS20描述符:

<firmware gtype="FuUsbDeviceFwDs20">
  <idx>42</idx>   <!-- 控制请求代码 -->
  <size>32</size> <!-- 返回数据最大长度 -->
</firmware>

然后使用fwupdtool工具生成二进制描述符:

fwupdtool firmware-build fw-ds20.builder.xml fw-ds20.bin

生成响应数据

quirk配置文件示例:

[USB\VID_273F&PID_1004]
Plugin = dfu
Icon = computer

使用提供的Python脚本生成二进制响应数据:

contrib/generate-ds20.py fw-ds20.quirk --bufsz 32

技术优势与适用场景

BOS DS20规范为固件更新生态系统带来了显著改进:

  1. 即时支持:新设备可以在不更新主机端fwupd软件的情况下立即获得支持。

  2. 离线兼容:设备在完全离线的环境中也能被正确识别和处理。

  3. 灵活配置:设备可以指定复杂的交互参数,如恢复模式标志、专用图标等。

  4. 版本兼容:通过版本控制机制确保向后兼容。

这种机制特别适合以下场景:

  • 安全敏感设备需要快速部署固件更新
  • 专有硬件设备需要特定的更新流程
  • 大规模部署环境中需要减少软件更新依赖

与其他技术的比较

传统类/子类匹配

fwupd原本支持通过USB类代码匹配设备,例如:

[USB\CLASS_FE&SUBCLASS_01]
Plugin = dfu

这种方式虽然简单,但缺乏灵活性,无法表达复杂的设备特性。

Microsoft OS描述符

Windows平台有类似的机制:

  • 1.0版本:使用固定字符串索引,但数据容量有限
  • 2.0版本:使用BOS描述符,但专为Windows设计

BOS DS20规范借鉴了这些思路,但专门为fwupd生态系统优化,提供了更好的灵活性和兼容性。

总结

fwupd的BOS DS20规范代表了固件更新技术的重要进步,它通过设备自描述机制解决了传统方案中的部署延迟问题。这种设计不仅提高了系统的灵活性,也为设备制造商提供了更大的控制权,同时保持了与现有生态系统的兼容性。随着更多设备采用这一标准,Linux平台的固件更新体验将变得更加无缝和可靠。

fwupd A system daemon to allow session software to update firmware fwupd 项目地址: https://gitcode.com/gh_mirrors/fw/fwupd

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

邴坤鸿Jewel

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值