FunctionFS 描述符¶
以下描述了一些可以写入 FFS gadget 的描述符。设备和配置描述符由复合 gadget 处理,用户不会将其写入 FFS gadget。
描述符按照描述符头部写入 FFS gadget 中的“ep0”文件。
描述符格式
偏移 |
名称 |
类型 |
描述 |
0 |
magic |
LE32 |
FUNCTIONFS_DESCRIPTORS_MAGIC_V2 |
4 |
length |
LE32 |
整个数据块的长度 |
8 |
flags |
LE32 |
functionfs_flags 的组合 |
eventfd |
LE32 |
eventfd 文件描述符 |
|
fs_count |
LE32 |
全速描述符的数量 |
|
hs_count |
LE32 |
高速描述符的数量 |
|
ss_count |
LE32 |
超高速描述符的数量 |
|
os_count |
LE32 |
MS OS 描述符的数量 |
|
fs_descrs |
Descriptor[] |
全速描述符列表 |
|
hs_descrs |
Descriptor[] |
高速描述符列表 |
|
ss_descrs |
Descriptor[] |
超高速描述符列表 |
|
os_descrs |
OSDesc[] |
MS OS 描述符列表 |
根据设置的标志,结构中可能会缺少各种字段。任何无法识别的标志都会导致整个块被拒绝,并返回 -ENOSYS。
旧版描述符格式(自 3.14 起已弃用)
偏移 |
名称 |
类型 |
描述 |
0 |
magic |
LE32 |
FUNCTIONFS_DESCRIPTORS_MAGIC |
4 |
length |
LE32 |
整个数据块的长度 |
8 |
fs_count |
LE32 |
全速描述符的数量 |
12 |
hs_count |
LE32 |
高速描述符的数量 |
16 |
fs_descrs |
Descriptor[] |
全速描述符列表 |
hs_descrs |
Descriptor[] |
高速描述符列表 |
所有数字必须采用小端字节序。
Descriptor[] 是一个有效的 USB 描述符数组,其格式如下
偏移 |
名称 |
类型 |
描述 |
0 |
bLength |
U8 |
描述符的长度 |
1 |
bDescriptorType |
U8 |
描述符类型 |
2 |
payload |
描述符的有效载荷 |
OSDesc[] 是一个有效的 MS OS 功能描述符数组,具有以下格式之一
偏移 |
名称 |
类型 |
描述 |
0 |
interface |
U8 |
相关接口编号 |
1 |
dwLength |
U32 |
描述符的长度 |
5 |
bcdVersion |
U16 |
当前支持:1 |
7 |
wIndex |
U16 |
当前支持:4 |
9 |
bCount |
U8 |
ext. compat. 的数量 |
10 |
Reserved |
U8 |
0 |
11 |
ExtCompat[] |
ext. compat. d. 列表 |
偏移 |
名称 |
类型 |
描述 |
0 |
interface |
U8 |
相关接口编号 |
1 |
dwLength |
U32 |
描述符的长度 |
5 |
bcdVersion |
U16 |
当前支持:1 |
7 |
wIndex |
U16 |
当前支持:5 |
9 |
wCount |
U16 |
ext. compat. 的数量 |
11 |
ExtProp[] |
ext. prop. d. 列表 |
ExtCompat[] 是一个有效的扩展兼容性描述符数组,其格式如下
偏移 |
名称 |
类型 |
描述 |
0 |
bFirstInterfaceNumber |
U8 |
接口索引或第一个 |
IAD 组中的接口 |
|||
1 |
Reserved |
U8 |
1 |
2 |
CompatibleID |
U8[8] |
兼容 ID 字符串 |
10 |
SubCompatibleID |
U8[8] |
子兼容 ID 字符串 |
18 |
Reserved |
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)