C 从设备到主机的用户模式USB同步传输
我目前正试图从用户的土地接口USB音频设备。目前,我已经对设备进行了完全枚举,并且设置了接口,并将替代接口设置为非零带宽替代接口 首先我必须说我不能使用像libusb这样的东西。我需要通过Linux的USB设备文件系统来实现这一点 据我所知,我已经准备好开始接收等时数据了。然而,关于如何进行等时传输,我能找到的信息很少 据我所知,我需要填充一个usbdevfs_urb结构,但我完全不确定如何精确填充此结构 此外,一旦我填写了此结构,我的想法是否正确,我需要调用以下内容:C 从设备到主机的用户模式USB同步传输,c,linux,usb,C,Linux,Usb,我目前正试图从用户的土地接口USB音频设备。目前,我已经对设备进行了完全枚举,并且设置了接口,并将替代接口设置为非零带宽替代接口 首先我必须说我不能使用像libusb这样的东西。我需要通过Linux的USB设备文件系统来实现这一点 据我所知,我已经准备好开始接收等时数据了。然而,关于如何进行等时传输,我能找到的信息很少 据我所知,我需要填充一个usbdevfs_urb结构,但我完全不确定如何精确填充此结构 此外,一旦我填写了此结构,我的想法是否正确,我需要调用以下内容: int retSubmi
int retSubmit = ioctl( fd, USBDEVFS_SUBMITURB, &usbRequest );
usbdevfs_ioctl command;
command.ifno = mpInterface->GetInterfaceNumber();
command.ioctl_code = USBDEVFS_DISCONNECT;
command.data = NULL;
int ret = ioctl( fd, USBDEVFS_IOCTL, &command );
然后,一旦提交,我可以等待请求完成使用
USBDEVFS_REAPURBNDELAY
在REAPURBNDELAY的情况下,我需要传递的参数到底是什么
我是不是在找对树了
任何信息都将不胜感激
提前谢谢
编辑:
我尝试按如下方式进行等时传输:
usbdevfs_urb& urbRequest = *(usbdevfs_urb*)malloc( 384 );
urbRequest.type = USBDEVFS_URB_TYPE_ISO;
urbRequest.endpoint = mpEndpoint->GetEndpointAddress();//mpEndpoint->GetEndpointIndex();
urbRequest.status = 0;
urbRequest.flags = USBDEVFS_URB_ISO_ASAP;
urbRequest.buffer = pData;
urbRequest.buffer_length = 0;
urbRequest.actual_length = 0;
urbRequest.start_frame = 0;
urbRequest.number_of_packets = 1;
urbRequest.error_count = 0;
urbRequest.signr = 0;
urbRequest.usercontext = pData;
usbdevfs_iso_packet_desc* pIsoPacketDesc = &urbRequest.iso_frame_desc[0];
pIsoPacketDesc->length = 384;
pIsoPacketDesc->actual_length = 0;
pIsoPacketDesc->status = 0;
令人遗憾的是,这给了我一个-28的错误(ENOSPC)
[3184.243163]usb 1-1:usbfs:usb\u submit\u urb返回-28
我不明白为什么没有足够的usb总线带宽。只有1个usb端口,我的设备是唯一插入其中的设备
有什么想法吗?我知道你不使用libusb的唯一原因是你不能自己打开usb设备,但你有一个指向它的文件描述符
如果这一切都是正确的,为什么您要尝试重新实现libusb中的所有内容,而不是仅仅重新实现usb_open()函数,该函数将以文件描述符作为参数,并使用struct usb_device*。您可以从libusb-usb_-open()源代码中获取大部分代码,其余部分使用libusb。好的,所以问题是由于android操作系统放置了一个HID驱动程序来处理HID控件。这似乎阻塞了带宽。将这些驱动程序与HID接口分离将释放带宽,从而允许进行同步传输 通过执行以下操作分离内核驱动程序:
int retSubmit = ioctl( fd, USBDEVFS_SUBMITURB, &usbRequest );
usbdevfs_ioctl command;
command.ifno = mpInterface->GetInterfaceNumber();
command.ioctl_code = USBDEVFS_DISCONNECT;
command.data = NULL;
int ret = ioctl( fd, USBDEVFS_IOCTL, &command );
否则,我所做的是正确的。我为用户模式USB同步传输编写了一个Java类:
它用来通过IOCTL调用访问API。@Jim Clay,因为所讨论的特定平台是android,我已经有一个打开的文件描述符,并且由于权限,我无法使用libusb打开设备……嗨,Goz,我目前正试图解决相同的问题——android上的同步传输,避免libusb。有没有办法发布一个工作代码示例?我目前的症结是结构定义和请求值。你们在哪里采购这些?提前谢谢。@Gusdor:这很复杂。基本上,我从…的文档中找到了一切。。。在某个时候,我可能真的会抽出时间来做一个android风格的api,用于与android usb api一起工作的同步传输。不过,这是一项艰巨的工作,我宁愿不花时间,除非我能找人付钱;)我有一个版本的libusb被传递给我,它不需要root,不过……不用担心,@Goz。我在周末开始插入usb音频规范。它读起来比现在更难,所以我相信我能做到。删除HID驱动程序仍然是一个“专业提示”,谢谢@Goz我还有一个问题,因为我仍在尝试破解iso传输。ioctl正在将errno设置为“2”。这显然不是ioctl的有效代码,但它使我怀疑我的端点地址或文件描述符不正确。我读过一些有趣的关于编组FileDescriptor以在本机代码中使用的内容,但是FileDescriptor类和ParcelAPI使查询这个问题变得复杂。我正在调用USBConnection.getFileDescriptor():int。这是否正确?我不理解您的LGPL问题,您是否正在开发专有软件?如果是这种情况,您仍然可以将其链接到LGPL库,而不是GPL库。如果我没记错的话,你唯一的义务就是提供一种与另一个图书馆链接的方式。如果您正在分发一个动态链接的二进制文件,那么就没有问题了。如果您提供的是静态链接的二进制文件,那么您必须提供二进制文件的对象文件,以便人们可以轻松地与其他文件重新链接。唉,我无法做出选择。碰巧我一直在试验libusb。我在我的设备上建立了根目录,可以提交一个ISOC请求。然后。。。你猜怎么着?errno=28:(破解了。如果你有兴趣找出问题所在,请看我的答案!