Android hardware usb host xml где взять
/system/etc/permissions
in that folder find file named
handheld_core_hardware.xml or tablet_core_hardware.xml
and add
Reboot your device. USB host API should work.
zenful
Senior Member
hacker812c
Senior Member
srijesh
Member
I tried this all in my samsung e700h but not suceeded. If anybody suceeded in doing this way plse tell how.
Subhashis
Senior Member
You can try using NeOTG in grand 2/s3 neo forums. If you have a kernel support of OTG,then it'll work
Harshiv989
Senior Member
How to check if my kernel supports native USB OTG support? Perhaps I have to check for it in "/dev/" or somewhere?
Ramy3r
Member
SnowFuhrer
Senior Member
Someone have the github files that were taken down?
Sent from my SM-A520W using XDA Labs
Harshiv989
Senior Member
No OTG in E700H it seems.
The USB controller used in Galaxy E700H is Richtek RT-5033 which is apparent by examination of
This RT-5033 handles battery management and flash LED etc. but the driver for this in kernel given by Samsung doesn't have anything specific related to USB host/OTG.
There is a mention of a register for USB OTG/Host, but it's not documented.
So even if the chip RT-5033 supports OTG, without the support in kernel, OTG can't be enabled.
Murlocking
New member
I want to enable OTG support on my Irulu X11 tablet, I can access a recovery menu and there's a lot of options in there. I can update from multiple source, I can reboot to bootloader. etc.
I don't have any knowledge in this 'domain' but I'm pretty good with that stuff usually.
If you can explain to me how I can edit those files to enable the USB OTG to work, I would bless you.
Basically, someone said that in the Recovery Menu your tablet is practically 'rooted', I'm not sure what that means and I hope someone can help me.
Итак, очередная запись. После танцев с бубном.
Без картинок… :(
Что такое ELM327 знают, наверное, все, у кого есть машина и кто интересуется процессами, в ней происходящими. Адаптеров ELM327 и его клонов — великое множество. В основном, все используют Bluetooth, как наиболее удобный. Реже Wi-Fi. Еще реже USB. У каждого подключения есть свои плюсы и минусы.
А параметры работы АКПП, двигателя и других систем наблюдать хочется.
В моем случае — Bluetooth не применим, т.к. головное устройство на платформе Allwinner R16, работающее под управлением Android, весьма странно работает с этими адаптерами. Хотя и заявлено производителем, что модуль Bluetooth двойной и способен одновременно держать подключение с телефоном (громкая связь, музыка и т.п.) и с адаптером ELM327, реально такой фокус не проходит. Связь держится минут 15-20, потом ELM отваливается и подключить его невозможно, до перезагрузки устройства. Телефон при этом работает. Адаптеров перепробовал несколько сортов, различной степени брендовости — результат одинаков. При этом, если подключаться с телефона — все прекрасно работает и ЕЛМ-ка работает часами без проблем.
WiFi — тоже не подходит. Т.к. по нему раздается интернет от GSM модема. Да и адаптеры надо покупать и все такое. Возможно модем использовать и как роутер, наверное, но пока до этих экспериментов не дошел.
В случае USB решаются все проблемы. ГУ имеет 2 штатных USB порта, можно увеличить количество хабом. Да и провода — всегда надежнее, чем радио.
Итак — решено. Адаптер у меня, самоспаянный, специально для этой цели, на базе оригинальной микросхемы STN1170. Т.е, в принципе, оригинальней не придумаешь. Только что плату сам делал. В качестве моста STN1170USB использовал FT232RL, как, наверное, самую беспроблемную, самую распространенную для адаптеров ELM327USB, да и они у меня просто есть. :)
Идем подключать. Адаптер OBDII предполагается устанавливать стационарно. Т.е. диагностический разъем не занимается, делается отвод от него, для данного авто достаточно вывести CAN, для моих целей, чтобы понять как это все работает и нужно ли. При желании можно подключить все линии диагностического разъема, если в них будет потребность — все на разъеме, достаточно вставить нужные пины. Адаптер питается от двух источников. Сам адаптер — от линий ACC + IG1 (starter) + IG2 (ON), через диоды, что нужно, чтобы питание не прерывалось при включении стартера. Аналогично, кстати, запитаны радар-детектор и регистратор, кроме линии АСС — включаются при втором щелчке ключа и также работают при включении стартера.
FT232-же, питается от USB и работает при включенном ГУ. Так сделано, т.к. STN1170 засыпает при отсутствии активности на шинах OBD, но FT232 она никак усыпить не может — возможно повышенное потребление.
Итак. Все подключено. Подключаем USB хвост адаптера к ГУ и… ничего не происходит. Ну… Бывает. Проверяю соединения — все нормально. Ладно, пробуем еще раз. Результат тот-же. Ладно, подключаю к телефону. Все работает, ошибки читаются, данные бегают. Сюжет ясен. Нет драйверов на FT232 в системе. Ну, раз нет — будем искать и ставить.
Поиск привел к единственному, в принципе, результату, кочующему по всем сайтам, с разной успешностью реализации у разных людей и на разных устройствах. Вот он:
Все действия требуют root прав!
Затем в файл handheld_core_hardware.xml или tablet_core_hardware.xml,
в зависимости от прошивки, добавить в раздел строку
Далее устанавливаем D2XXSample.apk из скаченной папки D2XXSample\bin
В случае если D2XXSample.apk из скаченной папки D2XXSample\bin не запустится
необходимо скопировать файл libftd2xx-jni.so из папки D2XXSample\obj\local\armeabi
в папку data/data/com.ftdi.d2xx устройства.
После копирование файла, повторно попытайтесь установить
драйвер D2XXSample.apk программа должна гарантировано запуститься.
Этот вариант был опробован. Мне не повезло. Не работает. Все выполнено по инструкции, D2XXSample.apk устанавливается, запускается — результат — не видит адаптер.
Ищем дальше.
Находится аналогичный способ, но уже с установкой "TN_147_Java_D2xx_for_Android_Demo.арк"
Результат аналогичен.
Поиск ничего нового не дает. Значит таки нужно читать инструкции. Читаю. И… нахожу. В итоге еще один важный момент, который должен помочь, если не помогает вышеописанный способ.
Привожу полную последовательность действий:
1. С сайта FTDI нужны 2 файла: "TN_147_Java_D2xx_for_Android_Demo_Source.zip" и "D2XXSample.zip".
Качаем с сайта производителя отсюда: TN_147_Java_D2xx_for_Android_Demo_Source и отсюда: D2XXSample
2. Распаковываем их куда-нить. Можно это сделать на компе дома и принести нужные файлы на флэшке.
3. Устанавливаем драйвер "TN_147_Java_D2xx_for_Android_Demo.арк" из "TN_147_Java_D2xx_for_Android_Demo_Source.zip", больше оттуда, вроде, ничего не нужно и
"D2XXSample.арк" (путь в папке D2XXSample\D2XXSample\bin) из соответствующих архивов.
Для начала лучше установить TN_147_Java_D2xx_for_Android_Demo, т.к. эта программа работает нормально, и попробовать дальнейшие шаги, а "D2XXSample.арк" — пользы от него в дальнейшем никакой. Только что может прописать нужные файлы и пути. Если место не критично — можно стразу ставить.
Далее все действия требуют root прав!
4. Скопировать файл "D2XXSample/obj/local/armeabi/libftd2xx-jni.so" из "D2XXSample.zip"
в папку /data/data/com.ftdi.d2xx/
и в папку /system/lib.
Затем в файл handheld_core_hardware.xml или
tablet_core_hardware.xml, в зависимости от прошивки,
добавить в раздел строку
6. Далее устанавливаем D2XXSample.apk из скаченной папки D2XXSample\bin
В случае если D2XXSample.apk из скаченной папки D2XXSample\bin не запустится
необходимо скопировать файл libftd2xx-jni.so из папки D2XXSample\obj\local\armeabi
в папку data/data/com.ftdi.d2xx планшета.
После копирование файла, повторно попытайтесь установить
драйвер D2XXSample.apk программа должна гарантировано запуститься.
Тут все. На этом этапе можно перезагрузить устройство/планшет/телефон, подключать FT232 и смотреть, что получается. D2xx_for_Android_Demo и D2XXSample должны увидеть адаптер. Если этого не произошло, то следующий пункт.
9. Ищем файл ueventd.rc — должен быть в корне.
В нем ищем строчку "/dev/bus/usb/* 0660 root usb", без кавычек.
изменяем в ней 0660 на 0666, что дает права "world readable and world writeable", в итоге должно быть:
/dev/bus/usb/* 0666 root usb
сохраняем изменения.
Все. После этого все заработало.
Надеюсь поможет заинтересованным лицам. :)
В недавней статье на Geektimes в комментариях возник вопрос о поддержке в ОС Android периферии, подключенной к шине USB. Действительно, большинство вендорского ПО, к примеру, для работы с принтерами и МФУ, поддерживает только подключение по сети. Однако это не означает, что в самой ОС Android нет такой возможности — это означает лишь то, что большинство устройств не имеют полноценного USB хоста, и далеко не все имеют поддержку OTG. По сети же могут работать абсолютно все без исключения.
Большинство устройств на Android при наличии порта OTG поддерживают на уровне системы (ядра Linux или стандартных компонентов Android) следующие классы устройств:
- Устройства ввода — клавиатуры, мыши, джойстики (HID)
- Накопители (Mass Storage)
- Сотовые модемы
- Сетевые адаптеры
- Вебкамеры
Подробнее список устройств, поддерживаемых на уровне ядра Linux, можно получить в sysfs:
$ ls /sys/bus/usb/drivers
Если же модуль в принципе доступен в исходниках ядра Linux, но не включен в Android — не стоит рассчитывать на то, что его получится собрать и расставить на все целевые системы.
Однако, начиная с Android 3.1 (API 12), в системе содержатся средства, достаточные для поддержки на уровне приложения любой USB периферии. Данные средства описаны в разделе USB Host руководства по Android API. Здесь же я хочу привести примеры реальной работы с некоторыми видами устройств.
Права доступа
Как и для прочих действий, Android требует, чтобы приложение получило разрешение на доступ к USB периферии. Существует 2 способа получить такое разрешение:
- Задекларировать список устройств в AndroidManifest
- Явно показать пользователю диалог “разрешить”
Итак, нам необходимо добавить в манифест следующее:
А в res/xml/device_filter.xml вписать следующее:
Отмечу, что хотя общепринято указывать VID:PID в 16-ричной системе счисления, здесь они должны быть указаны в десятичной. В документации заявляется, что возможно указание только класса, без VID и PID, но у меня это не стало работать.
Принтеры
Класс предельно простой. В рамках этого класса устройство должно поддерживать:
- Обязательный bulk out endpoind для отправки данных на принтер
- Опциональный bulk in endpoind для получения статуса принтера
- 3 управляющих запроса
Код, приведенный ниже, предоставляет функциональность, аналогичную устройству /dev/usb/lp в Linux. Далее нам нужен фильтр, преобразующий исходный документ в пакет данных, понятный конкретной модели принтера. Но это тема иной статьи. Как один из вариантов — можно собрать ghostscript с помощью NDK.
Для работы с устройством нам в первую очередь нужно:
1. Найти устройство. В примере для простоты я ищу первый попавшийся:
2. Получить endpoint’ы:
3. Непосредсвенно открыть устройство:
4. После этого мы можем читать и писать в устройство:
5. По завершении работы — закрыть устройство:
Преобразователи USB-Serial
1. Найти и открыть устройство:
2. Установить параметры последовательного порта:
3. Читать и писать в порт:
4. По завершении работы — закрыть порт:
Резюме
Надеюсь, что мне удалось показать, что работа с USB периферией достаточно проста и логична. Безусловно, реализация протоколов некоторых конкретных устройств не блещет простотой — но это проявится в любой системе в одинаковой степени.
Все приведенные примеры я взял из реального проекта, лишь исключил очевидные проверки, оставив только ключевые строки.
В современных Android — приложениях для взаимодействия с другими устройствами чаще всего используются беспроводные протоколы передачи данных, как например Bluetooth. В годы, когда часть устройств имеют беспроводную зарядку, сложно представить себе связку Android устройства и периферийного модуля, в которой необходимо использование проводных интерфейсов. Однако когда такая необходимость возникает, на ум сразу же приходит USB.
Давайте разберем с вами гипотетический кейс. Представьте, что к вам приходит заказчик и говорит: “Мне нужно Android приложение для управления устройством сбора данных и вывода этих самых данных на экран. Есть одно НО — приложение надо написать на одноплатный компьютер с операционной системой Android, а периферийное устройство подключено по USB”
Звучит фантастически, но и такое иногда случается. И тут как нельзя кстати пригодится глубокое знание USB стека и его протоколов, но данная статья не об этом. В данной статье мы рассмотрим, как управлять периферийным устройством по протоколу USB Custom HID с Android устройства. Для простоты напишем Android-приложение (HOST), которое будет управлять светодиодом на периферийным устройством (DEVICE) и получать состояние кнопки (нажатия). Код для периферийной платы приводить не буду, кому интересно — пишите в комментариях.
Итак, приступим.
Теория. Максимально коротко
Для начала немного теории, максимально коротко. Это упрощенный минимум, достаточный для понимания кода, но для большего понимания советую ознакомиться с этим ресурсом.
Для общения по USB на периферийном устройстве необходимо реализовать интерфейс взаимодействия. Разные функции (например, USB HID, USB Mass Strorage или USB CDC) будут реализовывать свои интерфейсы, а некоторые будут иметь несколько интерфейсов. Каждый интерфейс содержит в себе конечные точки — специальные каналы связи, своего рода буферы обмена.
На моем периферийном устройстве реализован Custom HID с одним интерфейсом и с двумя конечными точками, одной для приёма, другой для передачи. Обычно информация с существующими на устройстве интерфейсами и конечными точками написана в спецификации на устройство, в противном случае определить их можно через специальные программы, к примеру USBlyzer.
Устройства в USB HID общаются через репорты. Что такое репорты? Так как данные передаются через конечные точки, то нам надо как-то идентифицировать, а также распарсить в соответствие с протоколом. Устройства не просто кидают друг другу байты данных, а обмениваются пакетами, имеющими четко определенную структуру, которая описывается на устройстве в специальном дескрипторе репорта. Таким образом, по дескриптору репорта, мы можем точно определить, какой идентификатор, структуру, размер и частоту передачи имеют те или иные данные. Идентификация пакета происходит по первому байту, который представляет из себя ID репорта. Например данные о состоянии кнопки, идут в репорта с а светодиодом мы управляем через репорт с от железа, поближе к Android
В Android поддержка USB устройств появилась начиная с API версии 12 (Android 3.1) Для работы с периферийным устройством нам необходимо реализовать режим USB host. Работа с USB достаточно неплохо описана в документации.
Для начала необходимо идентифицировать ваше подключаемое устройство, среди всего разнообразия USB девайсов. USB девайсы идентифицируются по сочетанию vid (vendor id) и pid (product id). Создадим в папке xml файл device_filter.xml со следующим содержимым:
Теперь необходимо внести соответствующие разрешения и action (если вам они необходимы) в манифест приложения:
В android:resource мы указываем файл с необходимыми фильтрами для устройств. Также, как я уже говорил ранее, можно назначить intent фильтры, для запуска приложения, к примеру, в результате подключения вашего устройства.
Для начала необходимо получить UsbManager, найти устройство, интерфейс и конечные точки устройства. Это необходимо делать при каждом подключении устройства.
Здесь мы видим те самые интерфейсы и конечные точки, речь о которых шла в прошлом разделе. Зная номер интерфейса, мы находим обе конечные точки, на прием и передачу, и инициируем usb соединение. На этом все, теперь можно читать данные.
Как я уже говорил ранее, устройства общаются через репорты.
В метод sendReport мы передаем массив байт, в котором нулевым байтом является репорт ID, берем текущее USB подключение к устройству и выполняем передачу. В качестве параметров в метод BulkTransfer передаем номер конечной точки, данные, их размер и таймаут передачи. Стоит отметить, что класс UsbDeviceConnection имеет методы для реализации обмена данными с устройством USB — методы bulkTransfer и controlTransfer. Их использование зависит от типа передачи, который поддерживает та или иная конечная точка. В данном случае используем bulkTransfer, хотя для HID чаще всего характерно использование конечных точек с типом control. Но у нас Custom HID, так что делаем что хотим. Про тип передачи советую почитать отдельно, так как от него зависит объем и частота передаваемых данных.
Для получения данных необходимо знать размер получаемых данных, который можно, как знать заранее, так и получить из конечной точки.
Метод получения данных по USB HID является синхронным и блокирующим и выполнять его необходимо в другом потоке, кроме того, репорты от устройства могут приходить постоянно, либо в любое время, поэтому необходимо реализовать постоянный опрос репорта, чтобы не пропустить данные. Сделаем это при помощи RxJava:
Получив массив байт, мы должны проверить нулевой байт, так как он является report ID и в соответствии с ним парсить полученные данные.
По завершении всех действий с USB нужно закрыть соединение. Можно выполнять это в onDestroy activity или в onCleared во ViewModel.
Заключение
В статье рассмотрен очень небольшой и примитивный, исключительно демонстративный код с реализацией для конкретного устройства. Конечно, классов USB существует много, не только HID и для них естественно реализация будет иная. Однако все методы достаточно неплохо документированы и имея хорошее представление о USB стеке можно легко разобраться в том, как их применять.
USB On The Go(OTG) - обсуждение
В наш век, век технологий, любая информация в основном храниться в электронном виде, будь то текстовые файлы, фотографии, музыка, фильмы и.д. Как правило предметом для хранения выступает usb флешка. Но для её использования понадобиться устройство с usb портом, например компьютер, который не всегда бывает под рукой, в отличие от телефона/смартфона/планшета и т.д.. Так как же можно подключить флешку и другие устройства ( мышку, клавиатуру, джойстик, принтер и т.д ) к нашему телефону/смартфону/планшету и т.д. В этом нам поможет otg шнур. Что же такое OTG?
USB OTG ( On-The-Go) — дальнейшее расширение спецификации USB 2.0, предназначенное для лёгкого соединения периферийных USB-устройств друг с другом без необходимости подключения к ПК. Например к моделям смартфонов и телефонов, поддерживающих USB OTG, можно подключать некоторые USB-устройства. Обычно это флэш-накопители, клавиатуры, мыши и другие устройства, не требующие дополнительных драйверов.
Более подробное описание работы технологии привёл пользователь kargal в своём посте.
Первый контакт - питание +5 Вольт. В паре с GND, осуществляет питание подключаемого устройства (флешки, карты памяти и пр.)
Второй контакт - Data-.
Третий контакт - Data +.
Четвёртый контакт - контакт OTG. Замыкается с GND для перевода смартфона/(любого поддерживающего OTG устройства с подобной распиновкой) в режим хоста - подачи на разъём напряжения.
Пятый контакт - контакт GND (Ground).
- Марка Вашего аппарата (полностью).
- OTG работает? ( Да работает, нет не работает). На телефон подаётся дополнительное питание или работает и без дополнительного питания ( т.е. Вы просто подключаете OTG кабель к смартфону, или у Вас Y-кабель, третий конец которого вы подключаете к источнику питания ( порт компьютера, внешний аккумулятор, USB хаб который подключен к источнику питания и т.д.).
- Версия андроида с которой у Вас работает OTG, либо наоборот - не работает.
- Какая прошивка у Вас стоит на смартфоне заводская(стоковая) или сторонняя(кастомная).
- Название и версия ядра с которой работает/не работает OTG. Ядро стоковое или кастомное?
- Acer:
Acer E700 Trio // версия андроида 4.4.2 с ядром 3.4.67 //
Читайте также: