linux 如何在FunctionFS中扩展BOS描述符?

ocebsuys  于 2023-08-03  发布在  Linux
关注(0)|答案(1)|浏览(141)

我正在尝试在Raspberry Pi 4上实现一个简单的WebUSB设备。我为此创建了一个带有FunctionFS函数的Linux USB Gadget。目前我以Linux内核中的usb/ffs-test.c示例为基础。
根据这个优秀的Google blog by Reilly Grant在“为WebUSB构建一个设备”,我必须扩展二进制设备对象存储(BOS)与Microsoft OS compatibility descriptors让这在Windows上工作。我还可以向它添加WebUSB描述符,但这不是功能需求。
但是我在这一步卡住了,我该如何用FunctionFS扩展BOS?这是我第一次使用FunctionFS或USB,所以我可能错过了一些明显的东西。我在usb/functionfs.h中发现了一些usb_os_desc_header结构体,但我不知道这是否是我需要的,也不知道我应该如何使用它。

vuv7lop3

vuv7lop31#

我最终也弄明白了这一点,所以这就是我必须做的事情(基于tools/usb/ffs-test. c)。
一个用户空间函数必须将所有描述符写入ep 0,所以诀窍是扩展描述符struct:

  • ss_count之后添加__le32 os_count
  • ss_descs后添加struct usb_os_desc_header os_headerstruct usb_ext_compat_desc os_desc
  • FUNCTIONFS_HAS_MS_OS_DESC需要添加到header.flags

下面是我如何初始化WinUSB兼容性的新字段,我假设WebUSB一般工作类似:

.os_count = cpu_to_le32(1),
    .os_header = {
        .interface = cpu_to_le32(1),
        .dwLength = cpu_to_le32(sizeof(descriptors.os_header) + sizeof(descriptors.os_desc)),
        .bcdVersion = cpu_to_le32(1),
        .wIndex = cpu_to_le32(4),
        .bCount = cpu_to_le32(1),
        .Reserved = cpu_to_le32(0),
    },
    .os_desc = {
        .bFirstInterfaceNumber = 0,
        .Reserved1 = cpu_to_le32(1),
        .CompatibleID = {'W', 'I', 'N', 'U', 'S', 'B', 0, 0},
        .SubCompatibleID = {0},
        .Reserved2 = {0},
    }

字符串

相关问题