Android USBHost模式 - 为什么我的IRDA设备在claimInterface上失败?

时间:2012-09-09 00:42:54

标签: usb

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

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

忽略失败只会使我无法排队或发送请求。

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

  1. 究竟缺少什么导致索赔失败?
  2. 有理由不需要root吗?
  3. 有办法以某种方式覆盖索赔吗?

2 个答案:

答案 0 :(得分:3)

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

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

1)究竟缺少什么,为什么这会导致不良声明? 问题是主机(我的Xperia Neo手机)正在检测设备lindy IRDA dongle,但它支持的唯一配置是要求手机支持太多功率。

奇怪的是,这并不妨碍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电缆或类似的hackery为设备提供外部电源,但我不认为这会改变手机拒绝需求的根本问题。即使使用root,也不清楚是否可以采取任何措施来覆盖功率配置文件。

问题3,有没有办法覆盖claimInterface()失败并强制通信? 这是生硬的没有。该设备根本没有由内核创建,因此首先没有任何内容可以覆盖。对于为什么Android库仍在提供它,这有点令人费解。

答案 1 :(得分:0)

关于问题2和电力需求......

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

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