客户端收到的Linux USB functionfs端点地址与ep0中描述的不同

我正在基于Android的设备中使用functionfs,以允许通过USB连接到它。我已将描述符写入ep0,并且主机计算机可以从设备中看到描述符,并且可以连接到端点。但是,functionfs似乎忽略了写入ep0的终结点地址,而是从1开始对终结点进行顺序编号(如发送到主机的描述符中所示)。更糟糕的是,它似乎分别针对输入端点和输出端点执行此操作,因此,当尝试在端点1中具有批量输出和在端点2中具有批量时,它们在主机上都显示为端点1!

  1. 为什么functionfs会对端点重新编号?

https://www.kernel.org/doc/Documentation/usb/functionfs.txt

  

从用户空间的角度来看,它是一个文件系统,当   mount提供了一个“ ep0”文件。用户空间驱动程序需要   将描述符和字符串写入该文件。不需要   担心端点,接口或字符串号,但是   只需提供描述符,例如函数是否为   仅一个(端点和字符串数字从1和   接口编号(从零开始)。 FunctionFS发生变化   当数量不同时,也可以根据需要处理它们   不同的配置。

     

写入描述符和字符串时,出现“ ep#”文件   (每个声明的端点一个)处理通信   一个端点。同样,FunctionFS会照顾真正的   数字和配置更改(这意味着   “ ep1”文件可能确实映射到(例如)端点3(以及何时   配置更改为(例如)端点2))。使用“ ep0”   用于接收事件和处理设置请求。

表示重新编号是故意的。但是我不明白为什么需要这样做-当然,如果设备上有多个功能,每个功能都是一个单独的USB接口,并具有自己的一组端点。

  1. 如何将端点固定为客户端期望的端点?

我正在实现的协议定义了应该使用的端点。如何强制functionfs使用必需的端点。

  1. 如何给端点分配相同的地址?

据我了解,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;我无法更改此设置,但可以根据需要修改驱动程序。

monkey1210 回答:客户端收到的Linux USB functionfs端点地址与ep0中描述的不同

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3144339.html

大家都在问