FunctionFS 描述符¶
下面描述了一些可以写入 FFS gadget 的描述符。设备和配置描述符由复合 gadget 处理,用户不会将它们写入 FFS gadget。
描述符在描述符头之后写入 FFS gadget 中的 “ep0” 文件。
描述符格式
偏移量 |
名称 |
类型 |
描述 |
0 |
魔术数 |
LE32 |
FUNCTIONFS_DESCRIPTORS_MAGIC_V2 |
4 |
长度 |
LE32 |
整个数据块的长度 |
8 |
标志 |
LE32 |
functionfs_flags 的组合 |
eventfd |
LE32 |
eventfd 文件描述符 |
|
fs_count |
LE32 |
全速描述符的数量 |
|
hs_count |
LE32 |
高速描述符的数量 |
|
ss_count |
LE32 |
超高速描述符的数量 |
|
os_count |
LE32 |
MS OS 描述符的数量 |
|
fs_descrs |
描述符[] |
全速描述符列表 |
|
hs_descrs |
描述符[] |
高速描述符列表 |
|
ss_descrs |
描述符[] |
超高速描述符列表 |
|
os_descrs |
OSDesc[] |
MS OS 描述符列表 |
根据设置的标志,结构中可能会缺少各种字段。任何无法识别的标志都会导致整个块被拒绝,并返回 -ENOSYS。
传统描述符格式(自 3.14 版本起已弃用)
偏移量 |
名称 |
类型 |
描述 |
0 |
魔术数 |
LE32 |
FUNCTIONFS_DESCRIPTORS_MAGIC |
4 |
长度 |
LE32 |
整个数据块的长度 |
8 |
fs_count |
LE32 |
全速描述符的数量 |
12 |
hs_count |
LE32 |
高速描述符的数量 |
16 |
fs_descrs |
描述符[] |
全速描述符列表 |
hs_descrs |
描述符[] |
高速描述符列表 |
所有数字必须以小端顺序排列。
描述符[] 是有效的 USB 描述符数组,其格式如下
偏移量 |
名称 |
类型 |
描述 |
0 |
bLength |
U8 |
描述符的长度 |
1 |
bDescriptorType |
U8 |
描述符类型 |
2 |
payload |
描述符的有效负载 |
OSDesc[] 是有效的 MS OS 功能描述符的数组,其格式如下之一
偏移量 |
名称 |
类型 |
描述 |
0 |
接口 |
U8 |
相关的接口号 |
1 |
dwLength |
U32 |
描述符的长度 |
5 |
bcdVersion |
U16 |
当前支持:1 |
7 |
wIndex |
U16 |
当前支持:4 |
9 |
bCount |
U8 |
扩展兼容性的数量。 |
10 |
保留 |
U8 |
0 |
11 |
ExtCompat[] |
扩展兼容性列表。 |
偏移量 |
名称 |
类型 |
描述 |
0 |
接口 |
U8 |
相关的接口号 |
1 |
dwLength |
U32 |
描述符的长度 |
5 |
bcdVersion |
U16 |
当前支持:1 |
7 |
wIndex |
U16 |
当前支持:5 |
9 |
wCount |
U16 |
扩展兼容性的数量。 |
11 |
ExtProp[] |
扩展属性列表。 |
ExtCompat[] 是有效的扩展兼容性描述符的数组,其格式如下
偏移量 |
名称 |
类型 |
描述 |
0 |
bFirstInterfaceNumber |
U8 |
接口的索引或 IAD 组中第一个接口的索引 |
接口 |
|||
1 |
保留 |
U8 |
1 |
2 |
CompatibleID |
U8[8] |
兼容 ID 字符串 |
10 |
SubCompatibleID |
U8[8] |
子兼容 ID 字符串 |
18 |
保留 |
U8[6] |
0 |
ExtProp[] 是有效的扩展属性描述符的数组,其格式如下
偏移量 |
名称 |
类型 |
描述 |
0 |
dwSize |
U32 |
描述符的长度 |
4 |
dwPropertyDataType |
U32 |
1..7 |
8 |
wPropertyNameLength |
U16 |
bPropertyName 长度 (NL) |
10 |
bPropertyName |
U8[NL] |
此属性的名称 |
10+NL |
dwPropertyDataLength |
U32 |
bPropertyData 长度 (DL) |
14+NL |
bProperty |
U8[DL] |
此属性的有效负载 |
接口描述符¶
可以写入标准的 USB 接口描述符。最近的接口描述符的类/子类决定了接受哪种类型的特定于类的描述符。
特定于类的描述符¶
仅接受最近的接口描述符的类/子类的特定于类的描述符。以下是一些受支持的特定于类的描述符。
DFU 功能描述符¶
当接口类为 USB_CLASS_APP_SPEC 且接口子类为 USB_SUBCLASS_DFU 时,可以提供 DFU 功能描述符。DFU 功能描述符在本文撰写时在设备固件升级 (DFU) 的 USB 规范 1.1 版中进行了描述。
-
struct usb_dfu_functional_descriptor¶
DFU 功能描述符
定义:
struct usb_dfu_functional_descriptor {
__u8 bLength;
__u8 bDescriptorType;
__u8 bmAttributes;
__le16 wDetachTimeOut;
__le16 wTransferSize;
__le16 bcdDFUVersion;
};
成员
bLength
描述符的大小(字节)
bDescriptorType
USB_DT_DFU_FUNCTIONAL
bmAttributes
DFU 属性
wDetachTimeOut
DFU_DETACH 后等待的最大时间(毫秒,le16)
wTransferSize
每次控制写入的最大字节数 (le16)
bcdDFUVersion
DFU 规范版本 (BCD, le16)