Многие владельцы Android-устройств сталкивались с тем, что подключаемые по USB устройства ввода, такие как джойстики, клавиатуры, мышки и т.д., не всегда работают, как положено. То кнопки джойстика перепутаны, то медиаклавиши на клавиатуре или мышке не работают и т.п. В моём случае геймпад определялся, как клавиатура, и приходилось использовать программный «костыль», типа USB BT Joystick center или Tincore keymapper. Которые, используя свой IME (метод ввода в Android), позволяют переназначить кнопки. Также использовалась программа PerApp, которая может автоматически переключать IME в зависимости от активного приложения. Данный способ меня раздражал тем, что при включении всего этого хозяйства я не мог пользоваться любимой клавиатурой, а при выключении нельзя было перемещаться джойстиком по интерфейсу системы. Выход я видел только один: сделать нативную поддержку своего геймпада в системе или, грубо говоря, «драйвер».
Первым делом я заглянул в папку /system/usr/keylayout, где обнаружил файлы с очень красноречивыми названиями: Vendor_xxxx_Product_xxxx.kl, где xxxx - это набор цифр и букв. Как уже многие догадались, это не что иное, как идентификаторы устройства (VID и PID). Открыв первый по списку файл в текстовом редакторе, я почти закричал «БИНГО!». Но не закричал, потому что на работе нужно работать, а не джойстики к планшету прикручивать. А увидел я вот что:
# Classic NES Controller
key 289 BUTTON_A
key 290 BUTTON_B
key 297 BUTTON_START
key 296 BUTTON_SELECT
axis 0x00 HAT_X
axis 0x01 HAT_Y
Да-да, это настройки кнопок для джойстика от Nintendo (Денди). Просмотрев соседние файлы, я обнаружил конфиги для различных устройств. В основном игровые контроллеры (Play Station 3, X-box, ASUS gamepad и другие), но есть и клавиатуры.
Исходя из вышесказанного, уже можно понять, что для добавления поддержки устройства на уровне системы нужно создать файл с VID и PID устройства в названии и прописать в нем значения кнопок.
От теории к практике
Инструментарий:
- устройство на Android 4+ (проверял только на 5.0 и 4.4);
- поддержка устройством USB OTG;
- наличие root-доступа;
- файловый менеджер с поддержкой root (в моём случае это Total Commander);
- текстовый редактор (в моём случае это опять Total Сommander);
- лист бумаги и карандаш;
- USB Device Info (для определения свойств устройства);
- KeyTest (для отображения кодов кнопок устройства).
1. Создание файла с VID и PID
Подключаем наше устройство ввода и запускаем приложение USB Device Info. Нас интересует вкладка Linux, в которой выбираем своё устройство (у меня оно было последним в списке) и ищем значения строчек Vendor ID и Product ID. В моём случае это были 0c45 и 7700 соответственно.
Копируем любой файл из /system/usr/keylayout на sdcard и переименовываем его в соответствии с полученными данными, для моего джойстика название получилось таким: Vendor_0c45_Product_7700.kl. (Обратите внимание, что регистр букв имеет значение)
2. Получение кодов кнопок
Запускаем приложение KeyTest и, вооружившись бумагой и карандашом, начинаем поочерёдно нажимать кнопки на устройстве, записывая цифры, высвечивающиеся после scanCode=. Я записывал коды, располагая их на бумаге, как кнопки на геймпаде. Из программы можно выйти только по кнопке «Домой».
3. Маппинг кнопок
Теперь, когда стали известны коды всех клавиш, необходимо прописать их функции. Тут есть два пути:
а) найти среди имеющихся в Android конфигов устройство, максимально приближенное к вашему, и просто изменить в нём коды кнопок, скопировав содержимое в свой файл;
б) прописать все самому.
Я пошёл по второму пути, ибо мой джойстик имеет только крестовину управления и четыре кнопки. Для начала нужно понять синтаксис файла раскладки, он очень прост:
key код_кнопки действие_кнопки
Но тут возник вопрос: а какие действия кнопок писать в конфиге? За много лет использования различных геймпадов на Android я для себя определил, что самый универсальный конфиг — это раскладка от Sony Xperia Play, она одинаково хорошо ведёт себя как в играх, так и в интерфейсе системы.
Ok Google, key mapping for Xperia Play
Key code constant scancode
X 23 KEYCODE_DPAD_CENTER 304
circle 4 KEYCODE_BACK 305
square 99 KEYCODE_BUTTON_X 307
triangle 100 KEYCODE_BUTTON_Y 308
up 19 KEYCODE_DPAD_UP 106
down 20 KEYCODE_DPAD_DOWN 105
left 21 KEYCODE_DPAD_LEFT 103
right 22 KEYCODE_DPAD_RIGHT 108
select 109 KEYCODE_BUTTON_SELECT 314
start 108 KEYCODE_BUTTON_START 28
L trigger 102 KEYCODE_BUTTON_L1 310
R trigger 103 KEYCODE_BUTTON_R1 311
Нас интересует третья колонка, но запись действий в ней немного отличается от тех, что были найдены в системе — это не помеха, просто убираем KEYCODE_.
Прописываю свои кнопки (помните листок с карандашными записями? Самое время найти его...):
key 147 DPAD_CENTER
key 149 BUTTON_B
key 148 BUTTON_Y
key 146 BUTTON_X
key 157 DPAD_DOWN
key 145 DPAD_LEFT
key 155 DPAD_UP
key 156 DPAD_RIGHT
Но и тут не обошлось без нюансов. У Sony на кнопку «круг» (circle) назначено действие KEYCODE_BACK (привычная нам кнопка «назад»). Несложно догадаться, что нажатие такой кнопки в игре может вызвать нервный срыв. А всё дело в том, что во время игры на Xplay эта кнопка принимает альтернативное значение — KEYCODE_BUTTON_B. Вот её мы и пропишем.
4. Момент истины
Сохраняем наш файл и копируем его в папку /system/usr/keylayout. Выставляем права -rw -r -r (644). Перезагружаем устройство (сам я этого не делал, просто заблокировал и разблокировал, но для чистоты совести и эксперимента обязан был это написать).
Подключаем наше устройство, и если всё сделали правильно, тут же сможете «крестовиной» перемещаться по меню Android. Кнопка, на которую назначили DPAD_CENTER, будет кнопкой выбора, а BUTTON_B — кнопкой «назад».
Итоги
- на планшете стало на две программы меньше;
- джойстик теперь реальный Plug and Play;
- можно играть в игры с маркета без танцев с бубном (если игра поддерживает геймпады);
- можно перемещаться по интерфейсу Android;
- свои настройки для каждого устройства;
- скорость отклика кнопок повысилась (плацебо?).
Полезная информация
Настроить можно не только нажатие, но и смещение по осям (аналоговые контроллеры, мышки).
Тема на форуме: Нативная поддержка для устройств ввода в Андроид своими руками
Автор: Dreamer...
Источник:
(Комментарий удален)
Мне как чайнику и ламеру значительно проще стало, благодаря этой рубрике. Но, вот тостер от айпада по этой инструкции так и не завелся(((
Обязательно создам в ближайшее время.
Спасибо, грамотно расписано. Ждём на форуме
А у аппле пс3 контроллер нативно настроить можно или как? А другие контроллеры?
у них же есть какие то по *00$
конечно, лучше ждать пока святой тим кук запилит поддержку через 5 лет и ещё за доп плату, чем возможность сделать всё своими руками
Поддержка MFi - контроллеров есть еще с иос7, а с джейлом можно по блютусу подключить геймпад от пс3/4 и WiiU Pro контроллер.
джейл чуть ли не в первый дбень выходит)))
То есть это не "через одно место"?
получение рут прав не "через одно место"?
Зато после рута не как после джейла - аппарат не начинает глючить и тупить
не замечал, чтобы мой после джейла глючил
На большинстве девайсов проще пареной репы, нажатием одной кнопки и без ПК, и на многих китайцах рут уже из коробки. ;)
А теперь расскажи, как мне к айПадлу 3 подключить мою блутус мышку? Мне только ради этого пришлось джейл делать на 6 иос, а потом сидеть и смотреть как Огрызок Стор меня посылает на 3 буквы на многих приложениях, вякая, что они для иос7. Супер!
зачем ждать?
Если этого нет - значит пользователям этого не надо. Эпплу лучше знать)))
Я лучше подожду Ubuntu Touch. Надеюсь, хоть она не будет настолько обрезана по функциям :)
ждите дальше - последний билд был от июля 2013 года а дальше... ой, а дальше не было ничего )
Я верю в чудеса и в мир во всем мире :)
Последний билд был сегодня! Не надо тут...
если Тимка запилит то это будут инновации
Для брендовых геймпадов данные действия не нужны. Для того же контроллера от XBox 360, в большинстве устройств раскладка уже есть.
Ну ка, расскажи, как мне мышку подключить к iPad-у...
Лучше как в инструкции, сделать один раз и не ставить лишние проши , и после дата ресета все останется
Проги*
Проще не значит лучше
За сравнение с Хабром - спасибо!
Спасибо за совет, надо будет с блютуз джойстиком попробовать.
Спасибо за наводку.
для него нативная поддержка есть. А тут ноунейм непойми что, скорее всего рублей за 300. Вендор ид соответствует конторе Microdia.
за 0.99$ :) MEEP! Joystick
покупал для переделки под Nexus 7
>своими руками
Где-то подвох.
Никакого подвоха. Статья описывает способ запилить нативную поддержку девайса на уровне системы без лишних сторонних прослоек. Но как и написано в заголовке делать это нужно своими руками )
Для меня нативно это когда работает на уровне системы. Работает, а не требует допилов каких-то. Предположим у меня есть планшет не ведре - я найду на что потратить своё время помимо получения рута и ковыряния в потрохах оси. Нативно это на винде - воткнул джойстик от бокса, и играй.
так и тут - воткнул брендовый джойстик и играй. Тот же икс бокс. Руководство для ноунейм джоев
Учитывая, что для небрендовых устройств мы просто делаем подходящий конфиг для уже существующего драйвера, то, на мой взгляд, все очень даже нативно... Хардкорно, но нативно.
Согласен, но я дизайнер, а не программист.
Если кто-то возьмется - помогу с дизайном.
Можно еще создать каталог с готовыми файлами.
Любишь впустую тратить время?
с помощью к примеру рут эксплорера.
Уже выставил , но по прежнему не пашет у меня беспроводной джой от xbox подключеный через ресивер.
кнопки маппились?
Название файла правильно прописали - регистр очень важен!
Кабель для ОТГ с внешним питанием бери и всё будет норм
Вчера прикручивал, ради интереса, Genius MaxFire Pandora Pro, так сначала KeyTest тоже не видел нажатий, но и в USB Device Info его не было видно. Подключил к компу - работает. Снова подключил к планшету - заработал :)
У Вас USB Device Info видит устройство? Если да, то можно, для начала, взять файл от другого джоя, переименовать по инструкции и положить в систему.
Завтра запилю тему на форуме.
USB Device Info видит.
Как файл переделаешь, если кодов кнопок не знаешь ?
Если, что в QMS напишите.
Можно без кодов или взять от любого. при отсутствии кодов или их несовпадении джой просто не работает но в keyTest все показывает.
Сейчас попробую отпишусь.
http://4pda.ru/forum/index.php?showtopic=627766
Поддерживаю вопрос!
Тупорылый китайский джой Leimon 200b.
Решение проблемы с BT коды кнопок по BT высвечивает программа GamepadTest. Осталось только найти программу, которая высвечивает VID и PID.
ivanchik2006,
на форуме описано как посмотреть, да и в комментариях проскакивало
>программа GamepadTest.
Она для Андроида?
так же как и для джойстика
Владельцы Defender Mobile Master помнят эти тацны с бубном (на форуме уже было решение этой проблемы).
До сих пор не пойму, почему изначально не предусмотрели нормальные конфиги для него