拔出和重新插入后,USB OTG设备无法工作

时间:2017-06-02 16:46:11

标签: android hid usb-otg

我正在尝试与Android上的USB OTG设备连接。由于代码有点冗长,我将概述基础知识:

  • 在清单中声明了USB_DEVICE_ATTACHED(我感兴趣的设备ID已过滤)的Intent过滤器活动。
  • 当使用该特定意图启动活动时,它会启动一项服务并将USB设备作为参数传递。
  • 当服务启动时,它会为USB_DEVICE_DETACHED注册广播接收器,然后连接到设备并开始与它进行交互(当前会生成一些日志输出)。
  • 当收到USB断开广播时,设备是当前正在使用的设备,在USB设备连接上调用close(),服务停止。

该设备是Si4701 USB FM调谐器,可作为USB HID设备使用。

当我第一次插入设备时,我看到我的服务连接到它,可以更改频道并接收RDS数据。

然而,当我拔下它并将其重新插入时,我看到服务再次连接到它(并且显然已成功读取设备寄存器),但它无法改变频率,我从未看到任何RDS数据。

如果我强制应用程序在拔出设备和重新插入设备之间停止,则设备会在插入电源后正常工作。

这表明某些清理无法进行,或者某些资源未正确释放。但是:

  • 我没有在连接之间保留与设备相关的任何数据结构。与USB连接相关的所有内容都是在检测到设备时创建的类实例中,并且这些类的所有静态成员都是最终成员。
  • 重新插入设备后有些工作正常,例如读取设备类型和固件版本的寄存器(通过获取USB HID功能报告来工作)。初始化还设置了几个寄存器(通过发送USB功能报告),它不会返回错误 - 但更改频率(也涉及设置寄存器)不起作用。
  • 拔出和重新插入之间约15分钟的间隔无效(设备无法工作)。另一方面,如果我拔掉设备,取消服务并重新插入,它会立即运行 - 所以问题肯定是在Android端,而不是在设备端。

拔出/重新插拔后,我需要做些什么才能使USB设备正常工作?

1 个答案:

答案 0 :(得分:0)

我仍然不完全了解这里发生了什么,但它现在似乎有效。

我应该提到应用程序是多线程的,并且从多个线程调用Si470x包装器类。

由于这导致竞争条件(一个线程在另一个线程刚关闭时访问设备),我正确地将所有方法声明为synchronized,这样就没有两个线程可以访问调谐器类的方法了。同时。将设备插入电源插头,拔下电源插头,插入电源插头,然后观察它会改变频率并按照预期的方式喷出RDS数据。

<强>怀疑:

UsbDeviceConnection#close()可能不是线程安全的。

<强>结论:

  • 完成设备后,请始终致电UsbDeviceConnection#close()(包括拆卸设备时)。
  • 如果您的应用是多线程的,请确保所有访问USB连接(直接或间接)的内容都已正确同步。