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)