我正在基于Android的设备中使用functionfs,以允许通过USB连接到它。我已将描述符写入ep0,并且主机计算机可以从设备中看到描述符,并且可以连接到端点。但是,functionfs似乎忽略了写入ep0的终结点地址,而是从1开始对终结点进行顺序编号(如发送到主机的描述符中所示)。更糟糕的是,它似乎分别针对输入端点和输出端点执行此操作,因此,当尝试在端点1中具有批量输出和在端点2中具有批量时,它们在主机上都显示为端点1!
- 为什么functionfs会对端点重新编号?
https://www.kernel.org/doc/Documentation/usb/functionfs.txt说
从用户空间的角度来看,它是一个文件系统,当 mount提供了一个“ ep0”文件。用户空间驱动程序需要 将描述符和字符串写入该文件。不需要 担心端点,接口或字符串号,但是 只需提供描述符,例如函数是否为 仅一个(端点和字符串数字从1和 接口编号(从零开始)。 FunctionFS发生变化 当数量不同时,也可以根据需要处理它们 不同的配置。
写入描述符和字符串时,出现“ ep#”文件 (每个声明的端点一个)处理通信 一个端点。同样,FunctionFS会照顾真正的 数字和配置更改(这意味着 “ ep1”文件可能确实映射到(例如)端点3(以及何时 配置更改为(例如)端点2))。使用“ ep0” 用于接收事件和处理设置请求。
表示重新编号是故意的。但是我不明白为什么需要这样做-当然,如果设备上有多个功能,每个功能都是一个单独的USB接口,并具有自己的一组端点。
- 如何将端点固定为客户端期望的端点?
我正在实现的协议定义了应该使用的端点。如何强制functionfs使用必需的端点。
- 如何给端点分配相同的地址?
据我了解,USB不允许将相同的端点用于两个方向(控制端点除外)。那么,对于functionfs来说,为in和out端点赋予相同的地址怎么可能呢?
https://github.com/torvalds/linux/blob/master/tools/usb/ffs-test.c中的代码包含以下内容:
.hs_descs = {
.intf = {
.bLength = sizeof descriptors.fs_descs.intf,.bDescriptorType = USB_DT_INTERFACE,.bNumEndpoints = 2,.bInterfaceclass = USB_CLASS_VENDOR_SPEC,.iInterface = 1,},.sink = {
.bLength = sizeof descriptors.hs_descs.sink,.bDescriptorType = USB_DT_ENDPOINT,.bEndpointAddress = 1 | USB_DIR_IN,.bmAttributes = USB_ENDPOINT_XFER_BULK,.wMaxPacketSize = cpu_to_le16(512),.source = {
.bLength = sizeof descriptors.hs_descs.source,.bEndpointAddress = 2 | USB_DIR_OUT,.bInterval = 1,/* NAK every 1 uframe */
},
与我拥有的代码基本相同,并且主机为两个端点接收地址为1的描述符。
我正在使用的内核是4.1.15;我无法更改此设置,但可以根据需要修改驱动程序。