Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从设备到主机的用户模式USB同步传输_C_Linux_Usb - Fatal编程技术网

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

C 从设备到主机的用户模式USB同步传输,c,linux,usb,C,Linux,Usb,我目前正试图从用户的土地接口USB音频设备。目前,我已经对设备进行了完全枚举,并且设置了接口,并将替代接口设置为非零带宽替代接口 首先我必须说我不能使用像libusb这样的东西。我需要通过Linux的USB设备文件系统来实现这一点 据我所知,我已经准备好开始接收等时数据了。然而,关于如何进行等时传输,我能找到的信息很少 据我所知,我需要填充一个usbdevfs_urb结构,但我完全不确定如何精确填充此结构 此外,一旦我填写了此结构,我的想法是否正确,我需要调用以下内容: int retSubmi

我目前正试图从用户的土地接口USB音频设备。目前,我已经对设备进行了完全枚举,并且设置了接口,并将替代接口设置为非零带宽替代接口

首先我必须说我不能使用像libusb这样的东西。我需要通过Linux的USB设备文件系统来实现这一点

据我所知,我已经准备好开始接收等时数据了。然而,关于如何进行等时传输,我能找到的信息很少

据我所知,我需要填充一个usbdevfs_urb结构,但我完全不确定如何精确填充此结构

此外,一旦我填写了此结构,我的想法是否正确,我需要调用以下内容:

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:(破解了。如果你有兴趣找出问题所在,请看我的答案!