我目前正在尝试与用户登陆的USB音频设备连接。我目前完全枚举了设备,并设置了接口,并为接口非零带宽备用接口设置了备用接口。
首先,我必须说我不能使用像libusb这样的东西。我想通过Linux的USB设备文件系统来做到这一点。
据我所知,我已准备好开始接收等时数据。但是我找不到关于如何进行等时传输的信息。
据我所知,我需要填充一个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端口,我的设备是插入其中的唯一设备。
有什么想法吗?
答案 0 :(得分:5)
好吧事实证明问题是因为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 );
否则我所做的就是正确的。
答案 1 :(得分:3)
我理解你不使用libusb的唯一原因是你不能自己打开usb设备,但你确实有一个指向它的文件描述符。
如果这一切都正确,为什么要尝试重新实现libusb中的所有内容,而不是仅仅重新实现usb_open()函数,该函数将文件描述符作为参数和struct usb_device *。您可以从libusb usb_open()源代码中获取大部分代码,然后使用libusb。
答案 2 :(得分:1)