首页 文章

用户模式USB从设备到主机的同步传输

提问于
浏览
11

我目前正在尝试与用户陆地的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端口,我的设备是插入其中的唯一设备 .

有什么想法吗?

3 回答

  • 3

    好吧事实证明问题是因为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 );
    

    否则我所做的就是正确的 .

  • 5

    我理解你不使用libusb的唯一原因是你不能自己打开usb设备,但你确实有一个指向它的文件描述符 .

    如果这一切都正确,为什么要尝试重新实现libusb中的所有内容,而不是仅仅重新实现usb_open()函数,该函数将文件描述符作为参数和struct usb_device * . 您可以从libusb usb_open()源代码中获取大部分代码,然后使用libusb .

  • 1

    我为用户模式USB等时传输编写了一个Java类:UsbIso

    它使用JNA通过IOCTL调用访问USBFS API .

相关问题