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)