![]() |
BMW IBUS to USB Keyboard
Вложений: 1
Начну уже, пожалуй, тему.
И так, много народу сталкивается с необходимостью подключить кнопки на руле своего автомобиля к carpc. Среди них, в том числе, и владельцы BMW. В BMW нажатия кнопок на руле (и многие другие данные связанные с мультимедиа и приборной панелью) передаются по шине, называемой IBUS (по крайней мере, в e46 и в соседних по модельному ряду). Физически она представляет собой, так называемую, K-Line диагностическую линию связи, по которой данные передаются в одном общем проводе. Передаются они так же, как и в последовательном интерфейсе RS-232, более известном как COM порт, на скорости 9600 бит/с, по 8 бит в байте, с одним стоп-битом, без контроля четности (как на этой картинке). Это если описывать шину в двух словах, интересующиеся техническими деталями смогут найти их на необъятных просторах Интернета. Задача: «отлавливать» на шине нажатия кнопок на руле и передавать эти нажатия в carpc, эмулируя нажатия кнопок на обычной клавиатуре. Для этого собирается адаптер по вот такой схеме: (схема во вложении) Это пока черновик, еще не собранный. Все узлы ранее проверялись по отдельности. Я сейчас в процессе написания прошивки. Уже готова часть, эмулирующая клавиатуру. Изучены посылки, которые передаются по шине при нажатии кнопок. Осталось научить контроллер распознавать эти посылки и при их обнаружении посылать в компьютер код одной из клавиш клавиатуры. Для каждой кнопки на руле свой код клавиши. Это могут быть горячие клавиши WinAMP’а или любые другие произвольные клавиши. Я это делаю для Android, который понимает клавиатуры с мультимедиа кнопками, и собираюсь эмулировать мультимедиа кнопки управления звуком и переключения треков. Проект уже близок к финишной прямой. Начинаю тему здесь заранее, чтобы перед воплощением в железе услышать пожелания по дополнительному функционалу, который возможно будет включен в проект. Схема, печатная плата и прошивка контроллера будут выложены тут. Если кому есть что сказать, высказывайтесь. |
А когда примерно будет готов и сколько будет стоить ?
|
Первый вариант работоспособной прошивки, если пройдет полевые испытания, то сегодня или завтра будет готов.
Купив вот такую плату, микросхему MC33290, пару керамических конденсаторов на 0,1мкФ и такой винтовой клемник вполне можно самостоятельно изготовить работоспособный девайс уже сейчас. Я же буду еще дорабатывать схему, разрабатывать свою печатную плату, в которую собираюсь добавить контроллер питания carpc и только потом можно будет говорить об изготовлении девайса. Надеюсь закончить работу в течении этого месяца. |
Полевые испытания пока не пройдены, в микроконтроллер не попадают все байты с шины. При более внимательном прочтении datasheet'а на mc33290 обнаружил, что забыл резистор на 510..560 Ом между первой (vbb) и четвертой (iso) ногой микросхемы. Надеюсь вечером получить положительный результат.
Зато, теперь в прошивку включен еще CDC Class Device (COM-Порт), т.е. теперь адаптер представляется компьютеру составным устройством: USB-клавиатурой и USB-COM-портом. В COM-порт попадает всё, что "пролетает" по шине. Его можно открыть, например, в HyperTerminal'е и смотреть данные, "летающие" по шине. В финальной версии данные можно будет отправлять на шину, для тех, кто хочет не только слушать, но и управлять устройствами автомобиля. Однако, для этого легче купить BM9213 готовый адаптер, если конечно не нужна эмуляция нажатия клавиш клавиатуры. |
ждем, удачи
|
Вложений: 5
И так, всё работает. Правда видео не очень получилось.
Дело было не в забытом резисторе, а в том, что в протоколе используется контроль четности, а я его не включил. Т.е. скорость шины не 9600 8n1, а 9600 8e1. Итого, девайс можно собрать на таком контроллере, используя приложенную к данному сообщению прошивку. Только контроллер нужно дополнить микросхемой MC33290, например навесным монтажом, как на фотках. Я для пробы собирал всё это на том, что было под рукой. В качестве контроллера бывший программатор, "допиленный" немного под данную задачу. Далее, уже не спеша, буду дооснащать это дело другими, нужными, мне функциями, а так же делать свою печатную плату. Контроллер можно запрограммировать на эмуляцию нажатия любых клавиш, сейчас он эмулирует "+", "-", ".", ",". Он точно будет работать на e46 с аудиосистемой bmw business. С другими аудиосистемами не тестировалось, в них, возможно, будут другие коды назначения. Однако, если кто соберет и работать не будет именно по причине других кодов, то нужно будет записать лог с com-порта, выложить сюда, я поправлю. .inf файл в архиве - это драйвер com-порта, который понадобится. В контроллере из 3-го поста стоит кварц 8МГц, а нужен 16МГц, поэтому, если возьмёте тот контроллер, то берите и кварц на 16МГц, его нужно будет перепаять. |
Я так понял, что к Андроиду просто так подключить не получится?
|
Автор написал, что это будет составное устройство, тобиш одновременно COM порт и HID клава. В ведроиде должна сразу завестись как внешняя клава, только нужно освоить в ведре как переназначать коды клавиш.
|
Цитата:
ну вот это я и имел в виду под "просто так" |
Цитата:
Чтобы переназначить кнопки USB клавы нужно править конфиг. Ничего сложного там нет - не боги горшки обжигают :) Вот статейка с хабра, там все расписано. А с другой стороны - зачем переназначать коды клавиш HID клавы, если можно поправить прошивку девайса? |
Цитата:
|
Цитата:
|
Цитата:
|
А возможно ли изготовление твоими силами за деньги ?
|
zyxel812, предлагаю для универсальности написать софтинку для конфигурирования данной железки. А сами настройки хранить в еепром.
Тогда каждый сможет ее настроить так, как ему надо, и все будут довольны. Пример можешь глянуть у Кости740. Ну и я скоро выложу свой проект тоже ) |
Вложений: 1
Цитата:
А сейчас готова эмуляция мультимедийных клавиш. На видео контроллер подключен к odroid-x2 с Андроидом. В Андроиде ничего специально не настраивалось. С обычного компьютера я посылаю в контроллер последовательность байт, которую посылал бы руль по шине ibus, при нажатии соответствующих кнопок на нем. С права можно видеть, что на Андроиде регулируется громкость звука и переключаются треки. |
ждем-ждем
|
Вообще фантастика!
Zyxel812, это именно то, о чем я мечтал в своей тачке))) Расскажи, какие коды в андроид шлешь для нажатия клавиш? |
Вложений: 1
С кодами всё не так просто, как может показаться. Коды, которые передаются в HID-report (HID-report - это блок данных, которой HID-устройство посылает компьютеру) не соответствуют сканкодам клавиш и не соответствуют кодам клавиш в Андроиде. Прикладываю табличку соответствий. На первом листе документа - то, что я получил экспериментальным путем, подключив устройство к линукс и отлавливая события x-сервера с помощью программы xev. На втором листе табличка, которую я нашел где-то в интернете, к сожалению только ссылку потерял.
|
Коды для хида стандартны и известны. Я и Костя740 сделали такую штуку. Все работает как надо. Если что - можем помочь. Не стесняйся )
|
в Ардуино есть библиотека Keyboard
и там есть просто метод: Keyboard.press(keyCode); так вот какой keyCode я должен запихнуть?))) 128 для увеличения звука 129 для уменьшения 234 предыдущий трек 235 следующий трек так?) |
Цитата:
На дня приедет планшет (EMS говорит, что он уже в Москве) На выходных (на этих или следующих) будет большой разбор!))) |
Цитата:
Если второе - то лучше так не делать. Если первое - то тебе надо привязываться не к либе ардуйно, а к стандарту хид клавы. И в репорте передавать коды. Для хид клавы описаны все сканкоды, которые не зависят от того что у тебя на другом конце - андроид или винда. Вот сканкоды для мультимедиа клавы: Код:
// PAGE 00xC: А для обычных кнопок репорт должен быть настроен на обычную клаву (0x07) Я у себя сделал две коллекции в одном дескрипторе: Код:
0x05, 0x01, // USAGE_PAGE (Generic Desktop) |
Цитата:
|
дописать в ReportDecription вторую коллекцию с другим reportID. Я тебе привел пример репорта для двух коллекций. Первая - это обычная клава (страница 0х07), а вторая - это мультимедийная (страница 0х0С).
Потом вспоминаешь, что в репорте первый байт у тебя задан reportID, и в нем выбираешь что шлешь. 1 - обычная клавиша, 2 - мультимедия. И соответственно строишь тело пакета. Что где в теле лежит - смотришь из reportDescription. Если что - стучись в аську: 307342375 |
С ReportDecription разобрался кажется.
Теперь по поводу самого репорта, для страницы 7 структура такая: uint8_t Modifier; uint8_t Reserved; uint8_t KeyCode[6]; (в моем случае размер указан именно 6) Для страницы 0х0С такая же? Только коды клавиш двух-байтные? В репорт записывать сначала младший, потом старший байт? Я правильно понял? |
нет, не такая же.
Давай на примере моего репорта. Надеюсь, ты заметил, что я показал только смысловую часть, опустив начало и конец.. ) Репортдескрипшн (описалово репорта) как раз и показывает какие данные и как мы будем передавать. Тут мы говорим, что будет новая коллекция (вариант репорта) под обычную клаву: 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x06, // USAGE (Keyboard) 0xa1, 0x01, // COLLECTION (Application) РепортИД для этой коллекции - 1: 0x85, 0x01, // REPORT_ID (1) Используем клавиатуру: 0x05, 0x07, // USAGE_PAGE (Keyboard) Диапазон значений следующего поля - от 0хе0 до 0хе7) 0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl) 0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI) Каждое значение может быть либо 0 либо 1: 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0x01, // LOGICAL_MAXIMUM (1) Размер поля - 1 бит. Кол-во полей - 8: 0x75, 0x01, // REPORT_SIZE (1) 0x95, 0x08, // REPORT_COUNT (8) То, что мы описали - вход для хоста, и данные идут как массив битов: 0x81, 0x02, // INPUT (Data,Var,Abs) Это мы описали первый блок в репорте. Иными словами и по-русски - мы передаем 1 байт (8 бит), каждый бит в котором соответствует одной из клавиш от Keyboard LeftControl до Keyboard Right GUI. Следующий блок передает опять данные клавы: 0x05, 0x07, // USAGE_PAGE (Keyboard) Размер поля - 8 бит. Кол-во полей - 1шт: 0x95, 0x01, // REPORT_COUNT (1) 0x75, 0x08, // REPORT_SIZE (8) Диапазон значений - от 0до 0х65, транслируется 1:1 : 0x25, 0x65, // LOGICAL_MAXIMUM (101) 0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated)) 0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application) Опять же - вход, но уже как значения: 0x81, 0x00, // INPUT (Data,Ary,Abs) На этом первая коллекция закончилась. Больше в этом репорте мы ничего не шлем. 0xc0, // END_COLLECTION Итого вышло три байта: байт 1 - reportID = 1 (говорит о том, что дальше данные из первой коллекции) байт 2 - массив для функциональных клавиш байт 3 - одна из обычных. Теперь вторая коллекция 0x05, 0x0c, // USAGE_PAGE (Consumer Devices) 0x09, 0x01, // USAGE (Consumer Control) 0xa1, 0x01, // COLLECTION (Application) Именно такой репортид мы будем слать для нее: 0x85, 0x02, // REPORT_ID (2) Страница - Сonsumer Devices (именно там у нас коды мультимедийных клавиш): 0x05, 0x0c, // USAGE_PAGE (Consumer Devices) Диапазон значений и его отображение. Обрати внимание, что он двухбайтный: 0x19, 0x00, // USAGE_MINIMUM (Unassigned) 0x2a, 0x08, 0x01, // USAGE_MAXIMUM (Police Alarm) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x26, 0x08, 0x01, // LOGICAL_MAXIMUM (264) Слать будем два поля по 8 байт (те же два байта): 0x95, 0x02, // REPORT_COUNT (2) 0x75, 0x08, // REPORT_SIZE (8) 0x81, 0x00, // INPUT (Data,Ary,Abs) 0xc0, // END_COLLECTION Иными словами: байт 1 - репортид = 2 байты 2и3 - код клавиши в соответствии с таблицей, что я давал выше. Все. Теперь в общем.. Если мы хотим послать событие обычной кнопки - то шлем данные только для коллекции 1. Если для мультимедийной - то данные для коллекции 2. И там и там мы задали слать по 3 байта. |
До меня постепенно доходит суть и смысл.
Только я пользуюсь библиотекой lufa, поэтому у меня всё тоже самое, только другими словами. Исходя из информации от тебя, я описал такой вот дескриптор: Код:
#define HID_DESCRIPTOR_KEYBOARD(MaxKeys) \ Сам report у меня создается в функции Код:
bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, |
баааалин... да что все это значит вообще?)))))
|
Цитата:
+1 )) жду готового продукта ) |
Alex_St, а можно ли оставить только одну коллекцию, дополнив её
Код:
0x05, 0x0c, // USAGE_PAGE (Consumer Devices) т.е. в одном репорте в начале буду данные о кнопках из обоих страниц? Или это не прокатит? |
Нет, не прокатит.
Чуть позже отвечу на предыдущие вопросы. |
Кажется, истина уже где-то рядом :)
главное, понял в какую сторону копать, изучаю пример KeyboardMouseMultiReport из lufa. |
zyxel812
Истина таки рядом. Вроде все правильно. Единственное - я не понял зачем там паддинг в виде констант и зачем в таком устройстве леды.. Я бы лишнее убрал. А в остальном - гуд. И еще я себе добавил такую коллекцию: Код:
0x06, 0x00, 0xff, // USAGE_PAGE (Vendor Defined Page 1) п.с. я пользую v-usb. |
Это всё было из демо-примера, оставил как есть. По ледам определяю, что устройство живо, значение capslock вывел на один из светодиодиков на моей плате, жму соответствующую кнопку на обычной клаве и смотрю, как он загорается и тухнет :)
Спасибо большое, Alex_ST. Благодаря твоим разъяснениям у меня таки получилось передать нажатия клавиш со страницы 0х0С. Одним из следующих шагов будет добавление возможности конфигурирования. |
Ура! Я очень рад! Удачи в продолжении!
И не забудь возможность конфигурирования ;) |
Всё почти готово, и прошивка, и конфигуратор. Вот только затык случился, весь мозг уже сломал, в моем составном устройстве работает либо виртуальный последовательный порт, либо клавиатура. Т.е., когда устройство включаешь, к нему можно подключиться через последовательный порт записать и считать конфигурацию. Потом, начинаю нажимать кнопки, сначала ни какой реакции, через несколько нажатий появляются заветные буковки, но устройство перестает отвечать по последовательному порту. При этом, вроде как оно данные по порту получает, а вот ответы не приходят.
|
Я в усб не особо соображаю, но смотри на конечные точки...то есть для клавы скажем 1 точка(только вывод), для виртуального порта 2,3 (прием/передача). Вероятно они у тебя перекрываются.
Кстати по дескриптору описанному Alex_st завел свою поделку почти сразу, за что спасибо. |
Посмотрел, не пересекаются.
Просматриваю сейчас весь свой код, но всё как будь-то бы чисто. |
Кинь финальный дескриптор - глянем ;-)
|
Часовой пояс GMT +4, время: 04:39. |
Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot