Какой драйвер отвечает за кнопки гарнитуры на моем планшете?

Недавно я купил планшет Lenovo Tab3 710F ( страница продукта ) и пытаюсь управлять воспроизведением музыки извне с помощью небольшой электронной схемы.

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

В документации Android есть страница, в которой указан этот интерфейс: 3,5-мм гарнитура: спецификация аксессуаров . Вкратце, каждая кнопка должна быть соединена последовательно с резистором заданного значения, позволяющим устройству Android определять, какая кнопка была нажата, и запускать соответствующее действие.

Проблема в том, что мой планшет на самом деле не отвечает в соответствии с этой спецификацией (например, кнопка B запускает следующую песню вместо громкости +). Кроме того, проводка на этом планшете кажется перевернутой между GND и MIC. Я попытался открыть планшет, чтобы найти модель микросхемы обнаружения звука или гарнитуры, но безуспешно, так как все запечатано.

Таким образом, я подумал, что, возможно, я мог бы получить некоторую информацию от «программного обеспечения»: как я могу узнать, какой драйвер обрабатывает действия кнопок?

Идея состоит в том, чтобы просмотреть исходный код (доступный на веб-сайте Lenovo), найти различные возможности, закодированные в драйвере, и, возможно, даже ссылку на IC, которая поможет мне найти таблицу данных IC для получения дополнительной информации.

Ответы (1)

Хорошо, ребята, я немного удивлен, что не получил никакого ответа, но я думаю, это потому, что это был вопрос больше о 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

Надеюсь, это может помочь кому-то еще...