Как обрабатываются устройства USB-HID, у которых нет исходящих конечных точек?
Я работал над плагином USB-HID Java для Android, который должен обмениваться данными с несколькими устройствами, и я в основном добился успеха, используя метод bulkTransfer().
До тех пор, пока я не столкнулся с аппаратным устройством, у которого не было исходящих конечных точек. У этого конкретного было 2 интерфейса и 1 конечная точка на каждом. Оба были входящими, поэтому было невозможно отправить ему команды с помощью bulkTransfer().
Мои вопросы:
1) Можно ли отправлять те же команды на устройство, используя вместо этого метод controlTransfer()?
2) Могу ли я использовать тот же байтовый массив, который я передавал в bulkTransfer ()?
3) Если оба вышеперечисленных являются истинными, что делают значения и параметры индекса в controlTransfer():
https://developer.android.com/reference/android/hardware/usb/UsbDeviceConnection.html
Я смотрел на: как отличается между controlTransfer и bulkTransfer?
Но это не отвечало на мой главный вопрос.
1 ответ
Во-первых, как примечание, HID обычно используют IN прерываний, а не массовые передачи. Это НЕ то же самое, что труба управления или наливная труба. Когда вы перемещаете мышь или клавиатуру (обычно), она отправляет сообщение о прерывании на ваш компьютер, чтобы ОС не приходилось постоянно опрашивать канал управления для получения отчетов. В андроиде это делается с queue
/requestWait
,
Я лично никогда не видел HID с большой трубой.
Все устройства имеют конечную точку 0, которая является каналом двустороннего управления. Если вы контролируете прошивку устройства, вы можете отправлять пользовательские команды на канал управления. Теоретически, вы можете сделать это и использовать один и тот же байтовый массив. Но вам нужно знать, что ожидает ваше устройство с точки зрения идентификатора запроса, индекса и значения. Индекс, вероятно, будет 0 (дескриптор интерфейса; UsbInterface.getId
). Значение также зависит от того, что ожидает ваше устройство (попробуйте 0).
Для справки, вот спецификация HID.