gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:00:54 37 4
gpt4 key购买 nike

我目前正在尝试与来自用户空间的 USB 音频设备进行交互。我目前已完全枚举设备,并且已设置接口(interface)并将替代接口(interface)设置为接口(interface)非零带宽替代接口(interface)。

首先我不得不说我不能使用像 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 端口,我的设备是唯一插入其中的设备。

有什么想法吗?

最佳答案

好的,事实证明问题是由于 android 操作系统放置了一个 HID 驱动程序来处理 HID 控件。这似乎阻塞了带宽。从 HID 接口(interface)分离这些驱动程序释放带宽,允许同步传输继续进行。

通过执行以下操作分离内核驱动程序:

usbdevfs_ioctl command;
command.ifno = mpInterface->GetInterfaceNumber();
command.ioctl_code = USBDEVFS_DISCONNECT;
command.data = NULL;

int ret = ioctl( fd, USBDEVFS_IOCTL, &command );

否则我所做的是正确的。

关于c - 从设备到主机的用户模式 ​​USB 同步传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7964315/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com