2012-04-13 52 views
2

我有一个USB设备,其接口使用 其端点的备用设置。如何使用 'android.hardware.usb'包中的类来选择这些设置?是否可以使用Android SDK选择备用USB接口?

在本地代码中,我使用libUsb中的'libusb_set_interface_alt_setting'函数 ,它基本上是IOCTL。但是,我不想 使用NDK。

由于

回答

1

要启用的接口的选择设定只不过是一个标准设备请求根据在USB specification(usb_2.0.pdf)章节9.4以上。

所以这个:

UsbDeviceConnection.controlTransfer(UsbConstants.USB_DIR_OUT | 0x01, SET_INTERFACE, _alternate_setting_, _interface_nr_, null, 0, _timeout_); 

应该工作。 SET_INTERFACE(= 11 = 0x0B)是一个USB规范常量。我无法在android API中找到它作为Java常量。

+0

嗨亚历山大,谢谢你的回复。我阅读文档并尝试使用'controlTransfer'玩。不幸的是,所有的alt值。我尝试过的设置无效。我提到'bulkTransfer'返回1.我使用的调用序列有错吗? 'UsbDevice - > getInterface - > getEndpoint - > openDevice - > claimInterface - > controlTransfer - > bulkTransfer ...... - > close_connection' – aknopov 2012-05-08 21:02:18

+0

你对_didn't work_有什么意思?什么返回我建议的'controlTransfer'?在claimInterface之前尝试controlTransfer,因为controlTransfer以某种方式更改了接口的相关资源,而我们的hack并没有通知libUSB它,但这与[libusb recomandation](http://libusb.sourceforge.net/api- 1.0/group__dev.html#ga3047fea29830a56524388fd423068b53)。注意:我以前从来没有这样做过,我也不知道Android在底层做什么。我只是告诉你,阅读USB规格是有意义的。 – Alexander 2012-05-10 10:43:34

+0

通过_didn't work_我的意思是数据没有正确发送到设备。设备从发送的包中收到0或1个字节,尽管这是一个猜测 - 我没有运行嗅探器。关于'controlTransfer' - 它为无效的接口ID返回-1,并且返回0用于有效接口的任何alt.settings数字。关于顺序 - 如果在'claimInterface'之前调用'controlTransfer',它将返回-1而不管参数如何。 – aknopov 2012-05-10 23:32:55

1

只是为了关闭这个问题。

我通过为我的设备编写内核驱动程序并将其用作char设备来解决此问题。

作为一个便笺,我可以说在libusbhost库中实现set_interface_alt_settings将会很好,并通过JNI在'android.hardware.usb'包中使用它。

0

我有这个问题,以及 - 检查我的解决方案在这里:

Android USB host DeviceConnection.setInterface prior to API Level 21

我第一次尝试用controlTransfer,上述方法的建议,但它太失败了我。 SET_INTERFACE命令正常,并且读回的GET_INTERFACE返回了预期的备用值,因此设备获得了正确的接口集。即便如此,读取和写入端点失败: -/

我通过libusb,usbfs和内核跟踪了libusb_set_interface_alt_setting()。在内核中,除了向USB设备发送SET_INTERFACE外,还有更多的代码,例如关于“9.1.1.5:重置在新的altsetting中切换所有端点”的注释。 libusb的对libusb_set_interface_alt_setting()文档也说:

你应该总是使用此功能,而不是制定自己 SET_INTERFACE控制要求。这是因为底层的 操作系统需要知道这些更改何时发生。

所以我想我最好这样做。长话短说:查看上面链接中的代码。

相关问题