3

我有一个 Lindy IRDA USB 桥接器连接到我的 Xperia Neo (Cyanogen Mod 9)。我已经更改了功能以支持主机模式等。代码中一切看起来都很好。我检测到设备。我可以看到接口和两个端点(一进一出),但是一旦我尝试声明接口,它就会失败,无论我是否尝试强制声明。

似乎没有简单的方法可以找出索赔失败的原因。尽管 strace 给了我一个线索,因为对声明接口的 ioctl 调用失败并出现未找到设备错误。

忽略失败只会让我收到无法排队或发送的请求。

我的问题是(我认为):-

  1. 究竟缺少什么导致索赔失败?
  2. 有没有办法解决这个问题,理想情况下不需要root?
  3. 有没有办法以某种方式覆盖索赔?
4

2 回答 2

3

好的,所以我似乎已经在这里回答了我自己的问题,但是我看到很多人对 USB 主机的明显支持和可以观察到的“奇怪”行为感到困惑,所以希望这个答案可以帮助一些人你出去。

我提出了 3 个问题,我对 1 和 3 有一个明确的答案,但在这个阶段我对另一个问题不太确定。

1)究竟缺少什么,为什么这会导致错误的索赔?问题是主机(我的 Xperia Neo 手机)正在检测该设备,一个lindy IRDA 加密狗,但它支持的唯一配置是要求手机支持太多功率。

奇怪的是,这并不能阻止 a) 设备被 Android 库检测和枚举,或者 b) 设备似乎已通电(红色 LED 发光)

在任何系统库调用失败的 claimInterface() 时都没有报告,但是连接设备时运行的 dmesg|tail 提供了必要的洞察力。

dmesg | tail
<3>usb 1-1: device v066f p4200 is not supported
<6>usb 1-1: New USB device found, idVendor=066f, idProduct=4200
<6>usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
<6>usb 1-1: Product:  IrDA/USB Bridge
<6>usb 1-1: Manufacturer:  Sigmatel Inc
<6>usb 1-1: rejected 1 configuration due to insufficient available bus power
<4>usb 1-1: no configuration chosen from 1 choice

进一步的调查表明,这个小设备声称需要 440mA,这似乎相当多,但似乎几乎没有什么可以做的。

问题 2 可以做任何不需要 root 的事情来解决这个问题吗?似乎没有。从理论上讲,我可以通过使用 USB Y 电缆或类似的黑客技术为设备提供外部电源,但我认为这不会改变手机拒绝需求的根本问题。即使使用 root 也不清楚是否可以做任何事情来覆盖电源配置文件。

问题 3,有没有办法覆盖 claimInterface() 失败并强制通信?这是一个直截了当的不。该设备根本不是由内核创建的,因此首先没有什么可以覆盖的。这确实让 Android 库为什么仍然提供它有点令人费解。

于 2012-09-11T20:58:37.420 回答
0

至于问题 2 和电源需求...

我遇到的大多数支持 Host/OTG 的 android 设备仅支持大约 100 mA 的最大电流消耗。你能通过一些内核源代码强制它工作吗?很可能,但您会冒着烧毁 android 设备中的 USB 支持电路的风险。这是因为此类设备用于为外部 USB 设备供电的升压转换器仅在物理上支持最大 100 mA 的电流消耗。

您可以使用 Y 型电缆从外部提供所需的电流吗?是的,我之前在没有升压转换器的设备上做过这个,但是你需要在内核中有一个解决方法来告诉它你有这样的外部电源,现在可以给设备供电了。

于 2013-02-02T21:41:34.000 回答