我目前正试图从用户的土地上的USBaudio设备接口。 我目前已经完全枚举了设备,并且已经设置了接口,并将替代接口设置为接口非零带宽替代接口。
首先,我不得不说,我不能使用任何东西像libusb。 我需要通过Linux的USB设备文件系统来做到这一点。
所以据我所知,我已经准备好开始接收等时数据了。 但是,我可以find关于如何进行同步传输的信息很less。
从我可以告诉我需要填充一个usbdevfs_urb结构,但我完全不确定如何填写这个结构。
另外,一旦我填补了这个结构,我想我需要调用以下内容:
int retSubmit = ioctl( fd, USBDEVFS_SUBMITURB, &usbRequest );
然后一旦提交,我可以等待请求完成使用
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)的错误。
<7>[ 3184.243163] usb 1-1: usbfs: usb_submit_urb returned -28
我不明白为什么没有足够的USB总线带宽。 只有1个USB端口,我的设备是唯一的设备插入它。
有什么想法吗?
好,所以事实证明,这个问题是由于Android操作系统放置了一个HID驱动程序来处理HID控件。 这似乎阻止了带宽。 从HID接口分离这些驱动程序可释放带宽,以便进行同步传输。
通过执行以下操作来分离内核驱动程序:
usbdevfs_ioctl command; command.ifno = mpInterface->GetInterfaceNumber(); command.ioctl_code = USBDEVFS_DISCONNECT; command.data = NULL; int ret = ioctl( fd, USBDEVFS_IOCTL, &command );
否则我所做的是正确的。
我知道你不使用libusb的唯一原因是你不能自己打开USB设备,但你有一个文件描述符指向它。
如果这是完全正确的,那么为什么要重新实现libusb中的所有内容,而不是重新实现将文件描述符作为参数的usb_open()函数以及struct usb_device *。 您可以从libusb usb_open()源代码中获取大部分代码,其余部分使用libusb。
我为用户模式USB等时传输写了一个Java类: UsbIso
它使用JNA通过IOCTL调用访问USBFS API。