Написание драйвера USB для Android

Я разрабатываю приложение для Android, в котором мне нужно подключиться к USB-устройству.

Я разработал аналогичное приложение для Windows, и у меня есть драйвер, написанный на c.

Я хочу разработать драйвер USB для своего приложения для Android. Я хочу знать, что необходимо для разработки USB-драйвера для Android.

or

Могу ли я повторно использовать код, написанный на c, с помощью ndk.

Спасибо,


person NK-    schedule 05.10.2012    source источник


Ответы (2)


Во-первых, Android на самом деле просто Linux, поэтому, если вы говорите о «написании USB-драйвера для моего приложения Android», вам лучше сказать «написание USB-драйвера Linux для вашего конкретного устройства».

Затем вам нужно будет каким-то образом получить доступ к вашему устройству. То, что вы получите, написав драйвер USB для linux, вероятно, является каким-то файловым узлом в /dev/. Я предполагаю, что вы хотите создать драйвер для нестандартного USB-устройства (например, мыши / джойстика / запоминающего устройства), для которого Android не предоставляет хороший JAVA API? В этом случае вам придется написать нативную библиотеку (вероятно, на основе уже имеющегося у вас кода c) и скомпилировать ее с помощью NDK. Файл .so, который вы получите, может быть упакован в ваше Android-приложение, которое затем может использовать его для связи с вашим USB-устройством.

Итак, подводя итог:

драйвер устройства usb -> создать модуль ядра или встроить драйвер в ядро ​​​​linux: это материал для программирования драйвера usb для Linux, для которого вы сможете найти достаточно руководств в Интернете. Вы должны иметь возможность повторно использовать части своего кода c, если вы действительно создали драйвер USB для Windows.

родная библиотека-оболочка для доступа к вашему устройству (файл .so или .dll, если вы привыкли к терминологии Windows) -> создайте проект NDK, который открывает правильный узел устройства и правильно читает/записывает на ваше устройство.

Android-приложение -> включить файл .so и получить доступ к его собственным (c) методам через jni. Вы можете использовать такие инструменты, как javah или swig, для генерации кода jni из файлов заголовков вашей библиотеки.

person baske    schedule 05.10.2012

В предыдущем ответе предполагается, что у вас есть root-доступ к вашему устройству, и он не подходит для массового развертывания. Начиная с API версии 12, Android предоставляет USB-интерфейс, который позволяет вам взаимодействовать с определенными устройствами, используя низкоуровневые каналы управления и буферы запросов USB.

Существует два типа поддерживаемых устройств: хост-устройства USB, аксессуары USB (Android).

Хост-режим обычно хорошо поддерживается только на планшетах, телефоны могут и поддерживают его, но их способность поддерживать хост-режим меньше и очень зависит от требований к напряжению рассматриваемого устройства.

режим аксессуара является странным, поскольку он расширяет стандарты USB, добавляя дополнительный обмен, который идентифицирует аксессуар как аксессуар «Android».

если вышеуказанные режимы подходят для вас, то они, безусловно, являются лучшим вариантом использования низкоуровневого драйвера c, если только вы не имеете полного контроля над всеми устройствами, на которые он будет установлен.

Это оба API Java, и их можно найти на сайте документации Google Android в разделе usb.

person Neil    schedule 07.10.2012
comment
Требуют ли приложения NDK корневой доступ? - person Dan Osipov; 09.11.2012
comment
Нет, ты не. Собственный код может быть создан, разработан и развернут без рута, но для доступа к системным ресурсам, таким как устройства, потребуется рут. Примером без USB может быть использование стандартного linux sshd, такого как dropbear, это правдоподобно, вы можете найти их в магазине игр, однако для запуска на стандартных портах их нужно будет запускать от имени пользователя root. - person Neil; 11.11.2012