Недавно я купил планшет Lenovo Tab3 710F ( страница продукта ) и пытаюсь управлять воспроизведением музыки извне с помощью небольшой электронной схемы.
Идея состоит в том, чтобы воспроизвести то же поведение, что и кнопки, которые можно найти на внешней гарнитуре, которая подключается к порту мини-джек.
В документации Android есть страница, в которой указан этот интерфейс: 3,5-мм гарнитура: спецификация аксессуаров . Вкратце, каждая кнопка должна быть соединена последовательно с резистором заданного значения, позволяющим устройству Android определять, какая кнопка была нажата, и запускать соответствующее действие.
Проблема в том, что мой планшет на самом деле не отвечает в соответствии с этой спецификацией (например, кнопка B запускает следующую песню вместо громкости +). Кроме того, проводка на этом планшете кажется перевернутой между GND и MIC. Я попытался открыть планшет, чтобы найти модель микросхемы обнаружения звука или гарнитуры, но безуспешно, так как все запечатано.
Таким образом, я подумал, что, возможно, я мог бы получить некоторую информацию от «программного обеспечения»: как я могу узнать, какой драйвер обрабатывает действия кнопок?
Идея состоит в том, чтобы просмотреть исходный код (доступный на веб-сайте Lenovo), найти различные возможности, закодированные в драйвере, и, возможно, даже ссылку на IC, которая поможет мне найти таблицу данных IC для получения дополнительной информации.
Хорошо, ребята, я немного удивлен, что не получил никакого ответа, но я думаю, это потому, что это был вопрос больше о stackoverflow...
В любом случае, я продолжил свои исследования и сам нашел ответ, в частности, благодаря этому PDF-файлу, в котором подробно описана « Архитектура ввода Android ».
В PDF-файле представлены все подробности, но в основном каждый драйвер регистрирует input_devices в ядре Linux, и файл устройства создается для каждого события в /dev/input/eventXX. Кроме того, есть механизм Android для маршрутизации этих событий в приложения, но здесь это не проблема.
getevent
Для получения дополнительной информации об этих событиях можно использовать команду ( см. также документацию Android ):
getevent -li
предоставляет список зарегистрированных устройств ввода с возможными событиями для каждого устройстваgetevent -lp
печатает новую строку для каждого полученного события ( -l
флажок отображает типы и имена событий в виде простого текста, а не числа)Так, например, в случае с моим планшетом Lenovo мы обнаруживаем, что:
add device 6: /dev/input/event1
bus: 0019
vendor 0000
product 0000
version 0000
name: "ACCDET"
location: ""
id: ""
version: 1.0.1
events:
KEY (0001): KEY_VOLUMEDOWN KEY_VOLUMEUP KEY_HANGEUL
KEY_NEXTSONG
KEY_PLAYPAUSE KEY_PREVIOUSSONG KEY_STOPCD
KEY_SEND
input props:
<none>
ПРИМЕЧАНИЕ. Это только выдержка из полного вывода, ограниченная обнаружением кнопок гарнитуры.
Таким образом, похоже, что управление кнопками гарнитуры осуществляется каким-то компонентом "ACCDET". Я до сих пор не придумал «формальный» способ узнать, какой драйвер регистрирует это событие, но с помощью ключевых слов ACCDET и KEY_XX в поиске по исходному коду я смог найти соответствующий исходный файл (accdet.c) , который содержал другую информацию, которую я искал (а именно, пороговые значения напряжения для обнаружения каждой кнопки).
Наконец, также стоит отметить, что с помощью sendevents
команды можно моделировать события. Так, например, для имитации нажатия (и отпускания) кнопки воспроизведения/паузы можно использовать:
sendevent /dev/input/event1 1 164 1; \
sendevent /dev/input/event1 1 164 0; \
sendevent /dev/input/event1 0 0 0
Надеюсь, это может помочь кому-то еще...