Отладка физических кнопок в Android

getevent · /dev/input/event3 · recovery · кнопка питания
Реальных, а не виртуальных, кнопок на современных смартфонах становится всё меньше и меньше Первым шагом на пути портирования CyanogenMod на смартфон, для которого ещё нет этой прошивки, можно считать сборку правильно функционирующего CWM Recovery. Обычно, ничего сложного в этом нет, но мне не повезло: после того, как recovery успешно скомпилировалось и благополучно запустилось на устройстве, я обнаружил, что не могу выбрать ни один пункт в меню при помощи кнопки питания. На моём девайсе всего три физических кнопки: "громкость вниз" и "громкость вверх" заработали сразу, позволяя перемещаться по пунктам меню режима восстановления, и упрямая кнопка включения, при нажатии на которую ничего не происходит. Делать нечего, берём в руки напильник.
Во-первых, я не поверил, что при нажатии на кнопку ничего не происходит, так как увидел в выводе dmesg, что twl6030_pwrbutton (кнопка питания OMAP4) была успешно запущена ядром:
input: twl6030_pwrbutton as /devices/platform/omap/omap_i2c.1/i2c-1/1- 0049/twl6030_pwrbutton/input/input3
Во-вторых, я решил, что если кнопка не позволяет выбрать какой-либо пункт в меню, то это не значит, что она ничего не генерирует, возможно программный код recovery не слышит её отчаянный зов :)

Первым делом я воспользовался командой cat прямо в recovery:
cat /dev/input/event3
При нажатии на кнопку в консоль начал выбрасываться какой-то мусор. Скорее всего, это нормально :) В любом случае, это показатель, что кнопка работает — генерирует НЕЧТО.

По умолчанию в Linux и Android кнопка включения имеет код 116 и событие KEY_POWER, и CWM Recovery, если судить по исходникам, ждёт именно его. Вот отрывок исходного кода модуля default_recovery_keys.c:
case KEY_POWER:
case KEY_LEFTBRACE:
case KEY_ENTER:
case BTN_MOUSE:
case KEY_CAMERA:
case KEY_F21:
case KEY_SEND:
case KEY_HOMEPAGE:
case KEY_SEARCH:
  return SELECT_ITEM;
Выясним, что генерирует кнопка на самом деле. В этом деле незаменимым помощником является утилита getevent. В режиме recovery эта утилита отсутствует, поэтому загружаем на смартфоне любой работающий ROM и надеемся, что там она есть. Мне повезло. Запускаем:
root@android:/ # getevent
add device 1: /dev/input/event7
  name: "HS_KEY"
add device 2: /dev/input/event6
  name: "bma222"
add device 3: /dev/input/event5
  name: "light sensor"
add device 4: /dev/input/event4
  name: "compass"
add device 5: /dev/input/event2
  name: "ft5x0x_ts"
could not get driver version for /dev/input/mice, Not a typewriter
add device 6: /dev/input/event8
  name: "SDP4430 Headset Jack"
add device 7: /dev/input/event0
  name: "SIM_DETECT"
add device 8: /dev/input/event1
  name: "gpio-keys"
add device 9: /dev/input/event3
  name: "twl6030_pwrbutton"
Для того, чтобы просмотреть информацию конкретно по кнопке питания, запускаем так:
root@android:/ # getevent -lp /dev/input/event3
add device 1: /dev/input/event3
name: "twl6030_pwrbutton"
events:
  KEY (0001): KEY_END
input props:
  ‹none›
Оказывается, кнопка генерирует событие KEY_END вместо KEY_POWER. Поиск причины, по которой так происходит, я решил отложить на потом, а пока переназначил "громкость вниз" на выбор пункта меню, ведь перемещаться по пунктам recovery можно и при помощи одной кнопки :)

Обсуждение

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