PDA

Просмотр полной версии : BMW IBUS to USB Keyboard


zyxel812
08.03.2013, 16:16
Начну уже, пожалуй, тему.
И так, много народу сталкивается с необходимостью подключить кнопки на руле своего автомобиля к carpc. Среди них, в том числе, и владельцы BMW. В BMW нажатия кнопок на руле (и многие другие данные связанные с мультимедиа и приборной панелью) передаются по шине, называемой IBUS (по крайней мере, в e46 и в соседних по модельному ряду). Физически она представляет собой, так называемую, K-Line (http://ru.wikipedia.org/wiki/K-Line) диагностическую линию связи, по которой данные передаются в одном общем проводе. Передаются они так же, как и в последовательном интерфейсе RS-232, более известном как COM порт, на скорости 9600 бит/с, по 8 бит в байте, с одним стоп-битом, без контроля четности (как на этой картинке (http://eugene.mir74.su/wp-content/uploads/2011/05/how-rs232-works-tx-logic-rs232-diag.png)). Это если описывать шину в двух словах, интересующиеся техническими деталями смогут найти их на необъятных просторах Интернета.

Задача: «отлавливать» на шине нажатия кнопок на руле и передавать эти нажатия в carpc, эмулируя нажатия кнопок на обычной клавиатуре.

Для этого собирается адаптер по вот такой схеме:
(схема во вложении)

Это пока черновик, еще не собранный. Все узлы ранее проверялись по отдельности. Я сейчас в процессе написания прошивки. Уже готова часть, эмулирующая клавиатуру. Изучены посылки, которые передаются по шине при нажатии кнопок. Осталось научить контроллер распознавать эти посылки и при их обнаружении посылать в компьютер код одной из клавиш клавиатуры. Для каждой кнопки на руле свой код клавиши. Это могут быть горячие клавиши WinAMP’а или любые другие произвольные клавиши. Я это делаю для Android, который понимает клавиатуры с мультимедиа кнопками, и собираюсь эмулировать мультимедиа кнопки управления звуком и переключения треков.
Проект уже близок к финишной прямой. Начинаю тему здесь заранее, чтобы перед воплощением в железе услышать пожелания по дополнительному функционалу, который возможно будет включен в проект. Схема, печатная плата и прошивка контроллера будут выложены тут. Если кому есть что сказать, высказывайтесь.

m50b20
08.03.2013, 22:46
А когда примерно будет готов и сколько будет стоить ?

zyxel812
09.03.2013, 13:24
Первый вариант работоспособной прошивки, если пройдет полевые испытания, то сегодня или завтра будет готов.
Купив вот такую плату (http://www.chipdip.ru/product/me-smartusb-for-avr/), микросхему MC33290 (http://www.chipdip.ru/product/mc33290dr2/), пару керамических конденсаторов на 0,1мкФ (http://www.chipdip.ru/product0/77059545/) и такой (http://www.chipdip.ru/product/300-031-12/) винтовой клемник вполне можно самостоятельно изготовить работоспособный девайс уже сейчас.
Я же буду еще дорабатывать схему, разрабатывать свою печатную плату, в которую собираюсь добавить контроллер питания carpc и только потом можно будет говорить об изготовлении девайса. Надеюсь закончить работу в течении этого месяца.

zyxel812
11.03.2013, 13:17
Полевые испытания пока не пройдены, в микроконтроллер не попадают все байты с шины. При более внимательном прочтении datasheet'а на mc33290 обнаружил, что забыл резистор на 510..560 Ом между первой (vbb) и четвертой (iso) ногой микросхемы. Надеюсь вечером получить положительный результат.
Зато, теперь в прошивку включен еще CDC Class Device (COM-Порт), т.е. теперь адаптер представляется компьютеру составным устройством: USB-клавиатурой и USB-COM-портом. В COM-порт попадает всё, что "пролетает" по шине. Его можно открыть, например, в HyperTerminal'е и смотреть данные, "летающие" по шине. В финальной версии данные можно будет отправлять на шину, для тех, кто хочет не только слушать, но и управлять устройствами автомобиля. Однако, для этого легче купить BM9213 (http://www.masterkit.ru/info/magshow.php?num=389) готовый адаптер, если конечно не нужна эмуляция нажатия клавиш клавиатуры.

m50b20
11.03.2013, 13:37
ждем, удачи

zyxel812
11.03.2013, 20:18
И так, всё работает. Правда видео не очень получилось.
E0iuj2tdLWM
Дело было не в забытом резисторе, а в том, что в протоколе используется контроль четности, а я его не включил. Т.е. скорость шины не 9600 8n1, а 9600 8e1.
Итого, девайс можно собрать на таком контроллере (http://www.aliexpress.com/item/HOT-SALE-Teensy-USB-development-board-AVR-MKII-ISP-download-cable-AT90USB162/726186070.html), используя приложенную к данному сообщению прошивку. Только контроллер нужно дополнить микросхемой MC33290, например навесным монтажом, как на фотках. Я для пробы собирал всё это на том, что было под рукой. В качестве контроллера бывший программатор, "допиленный" немного под данную задачу. Далее, уже не спеша, буду дооснащать это дело другими, нужными, мне функциями, а так же делать свою печатную плату.
Контроллер можно запрограммировать на эмуляцию нажатия любых клавиш, сейчас он эмулирует "+", "-", ".", ",".
Он точно будет работать на e46 с аудиосистемой bmw business. С другими аудиосистемами не тестировалось, в них, возможно, будут другие коды назначения. Однако, если кто соберет и работать не будет именно по причине других кодов, то нужно будет записать лог с com-порта, выложить сюда, я поправлю.
.inf файл в архиве - это драйвер com-порта, который понадобится.
В контроллере из 3-го поста стоит кварц 8МГц, а нужен 16МГц, поэтому, если возьмёте тот контроллер, то берите и кварц на 16МГц, его нужно будет перепаять.

m50b20
11.03.2013, 20:31
Я так понял, что к Андроиду просто так подключить не получится?

awtoap
11.03.2013, 21:33
Автор написал, что это будет составное устройство, тобиш одновременно COM порт и HID клава. В ведроиде должна сразу завестись как внешняя клава, только нужно освоить в ведре как переназначать коды клавиш.

m50b20
11.03.2013, 21:40
Автор написал, что это будет составное устройство, тобиш одновременно COM порт и HID клава. В ведроиде должна сразу завестись как внешняя клава, только нужно освоить в ведре как переназначать коды клавиш.


ну вот это я и имел в виду под "просто так"

Hamster
11.03.2013, 21:50
"просто так"

Просто так ничего в этом мире не делается :)
Чтобы переназначить кнопки USB клавы нужно править конфиг. Ничего сложного там нет - не боги горшки обжигают :)
Вот статейка с хабра (http://habrahabr.ru/post/140384/), там все расписано.

А с другой стороны - зачем переназначать коды клавиш HID клавы, если можно поправить прошивку девайса?

awtoap
11.03.2013, 21:53
А с другой стороны - зачем переназначать коды клавиш HID клавы, если можно поправить прошивку девайса?

Менять прошу под каждую хотелку нет смысла...думаю автор реализует переназначение через COM порт на большом брате с последующим сохранением в EEPROM МК.

zyxel812
11.03.2013, 23:29
Я так понял, что к Андроиду просто так подключить не получится?

Как раз наоборот, очень даже легко получится. Я для Андроида это и делаю. Собираюсь эмулировать нажатия мультимедийных кнопок (есть такие клавиатуры, типа этой (http://www.ulmart.ru/goods/198032), на которых есть кнопки управления мультимедиа, см. мелкие кнопки сверху на фотке по преведенной ссылке). Андроит такие клавы воспринимает на ура, звук с них управляется и треки переключаются "из коробки", ничего в конфигах переделывать не надо. Просто под Виндой нужно ставить драйвер, чтоб эти кнопки работали, вот я в прошивку и залил плюсики и минусики для демонстрации. Чуть позже выложу вариант прошивки, эмулирующей мультимедиа кнопки и владельцем Андроидов ничего не надо будет "допиливать".

zyxel812
11.03.2013, 23:32
Менять прошу под каждую хотелку нет смысла...думаю автор реализует переназначение через COM порт на большом брате с последующим сохранением в EEPROM МК.

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

m50b20
11.03.2013, 23:59
А возможно ли изготовление твоими силами за деньги ?

Alex_St
12.03.2013, 12:16
zyxel812, предлагаю для универсальности написать софтинку для конфигурирования данной железки. А сами настройки хранить в еепром.
Тогда каждый сможет ее настроить так, как ему надо, и все будут довольны.
Пример можешь глянуть у Кости740. Ну и я скоро выложу свой проект тоже )

zyxel812
13.03.2013, 17:32
zyxel812, предлагаю для универсальности написать софтинку для конфигурирования данной железки. А сами настройки хранить в еепром.
Тогда каждый сможет ее настроить так, как ему надо, и все будут довольны.
Пример можешь глянуть у Кости740. Ну и я скоро выложу свой проект тоже )

В будущем сделаю. Еще планирую добавить несколько обычных кнопок, т.е. к контроллеру можно будет подключить не только ibus, но и несколько (на сколько свободных портов хватит) обычных резистивных кнопок.

А сейчас готова эмуляция мультимедийных клавиш. На видео контроллер подключен к odroid-x2 с Андроидом. В Андроиде ничего специально не настраивалось. С обычного компьютера я посылаю в контроллер последовательность байт, которую посылал бы руль по шине ibus, при нажатии соответствующих кнопок на нем. С права можно видеть, что на Андроиде регулируется громкость звука и переключаются треки.
09_w9O5gupQ

m50b20
13.03.2013, 20:02
ждем-ждем

iGeophysix
14.03.2013, 09:40
Вообще фантастика!
Zyxel812, это именно то, о чем я мечтал в своей тачке)))
Расскажи, какие коды в андроид шлешь для нажатия клавиш?

zyxel812
14.03.2013, 14:21
С кодами всё не так просто, как может показаться. Коды, которые передаются в HID-report (HID-report - это блок данных, которой HID-устройство посылает компьютеру) не соответствуют сканкодам клавиш и не соответствуют кодам клавиш в Андроиде. Прикладываю табличку соответствий. На первом листе документа - то, что я получил экспериментальным путем, подключив устройство к линукс и отлавливая события x-сервера с помощью программы xev. На втором листе табличка, которую я нашел где-то в интернете, к сожалению только ссылку потерял.

Alex_St
14.03.2013, 15:06
Коды для хида стандартны и известны. Я и Костя740 сделали такую штуку. Все работает как надо. Если что - можем помочь. Не стесняйся )

iGeophysix
14.03.2013, 15:54
в Ардуино есть библиотека Keyboard

и там есть просто метод: Keyboard.press(keyCode);

так вот какой keyCode я должен запихнуть?)))

128 для увеличения звука
129 для уменьшения
234 предыдущий трек
235 следующий трек
так?)

iGeophysix
14.03.2013, 16:00
Коды для хида стандартны и известны. Я и Костя740 сделали такую штуку. Все работает как надо. Если что - можем помочь. Не стесняйся )

Спасибо! Сегодня пришел мой CANHacker) Буду отлавливать кнопочки.
На дня приедет планшет (EMS говорит, что он уже в Москве)

На выходных (на этих или следующих) будет большой разбор!)))

Alex_St
14.03.2013, 16:17
в Ардуино есть библиотека Keyboard

и там есть просто метод: Keyboard.press(keyCode);

так вот какой keyCode я должен запихнуть?)))

128 для увеличения звука
129 для уменьшения
234 предыдущий трек
235 следующий трек
так?)

Я не понял - ты делаешь юсб клаву или компорт, а потом разбор данных на компе?
Если второе - то лучше так не делать.
Если первое - то тебе надо привязываться не к либе ардуйно, а к стандарту хид клавы. И в репорте передавать коды.

Для хид клавы описаны все сканкоды, которые не зависят от того что у тебя на другом конце - андроид или винда.

Вот сканкоды для мультимедиа клавы:

// PAGE 00xC:
#define KEY_NEXT_TRACK 0x00B5 /* Scan Next Track 0C 00B5 */
#define KEY_PREVIOUS_TRACK 0x00B6 /* Scan Previous Track 0C 00B6 */
#define KEY_STOP 0x00B7 /* Stop 0C 00B7 */
#define KEY_PLAY_PAUSE 0x00CD /* Play/ Pause 0C 00CD */
#define KEY_MUTE 0x00E2 /* Mute 0C 00E2 */
#define KEY_BASS_BOOST 0x00E5 /* Bass Boost 0C 00E5 */
#define KEY_LOUDNESS 0x00E7 /* Loudness 0C 00E7 */
#define KEY_VOLUME_UP 0x00E9 /* Volume Up 0C 00E9 */
#define KEY_VOLUME_DOWN 0x00EA /* Volume Down 0C 00EA */
#define KEY_BASS_UP 0x0152 /* Bass Up 0C 0152 */
#define KEY_BASS_DOWN 0x0153 /* Bass Down 0C 0153 */
#define KEY_TREBLE_UP 0x0154 /* Treble Up 0C 0154 */
#define KEY_TREBLE_DOWN 0x0155 /* Treble Down 0C 0155 */
#define KEY_MEDIA_SELECT 0x0183 /* Media Select 0C 0183 */
#define KEY_MAIL 0x018A /* Mail 0C 018A */
#define KEY_CALCULATOR 0x0192 /* Calculator 0C 0192 */
#define KEY_MY_COMPUTER 0x0194 /* My Computer 0C 0194 */
#define KEY_WWW_SEARCH 0x0221 /* WWW Search 0C 0221 */
#define KEY_WWW_HOME 0x0223 /* WWW Home 0C 0223 */
#define KEY_WWW_BACK 0x0224 /* WWW Back 0C 0224 */
#define KEY_WWW_FORWARD 0x0225 /* WWW Forward 0C 0225 */
#define KEY_WWW_STOP 0x0226 /* WWW Stop 0C 0226 */
#define KEY_WWW_REFRESH 0x0227 /* WWW Refresh 0C 0227 */
#define KEY_WWW_FAVORITES 0x022A /* WWW Favorites 0C 022A */


Репорт должен быть настроен для Consumer Devices (PAGE 0x0C).

А для обычных кнопок репорт должен быть настроен на обычную клаву (0x07)
Я у себя сделал две коллекции в одном дескрипторе:
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x06, // USAGE (Keyboard)
0xa1, 0x01, // COLLECTION (Application)
0x85, 0x01, // REPORT_ID (1)
0x05, 0x07, // USAGE_PAGE (Keyboard)
0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)
0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x08, // REPORT_COUNT (8)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x05, 0x07, // USAGE_PAGE (Keyboard)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x08, // REPORT_SIZE (8)
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
0x05, 0x0c, // USAGE_PAGE (Consumer Devices)
0x09, 0x01, // USAGE (Consumer Control)
0xa1, 0x01, // COLLECTION (Application)
0x85, 0x02, // REPORT_ID (2)
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)
0x95, 0x02, // REPORT_COUNT (2)
0x75, 0x08, // REPORT_SIZE (8)
0x81, 0x00, // INPUT (Data,Ary,Abs)
0xc0, // END_COLLECTION

Первая - для обычных клавиш, вторая - для мультимедийных.

zyxel812
14.03.2013, 16:30
Репорт должен быть настроен для Consumer Devices (PAGE 0x0C).

А для обычных кнопок репорт должен быть настроен на обычную клаву (0x07)

Вот, я про эти страницы (0x07, 0x0C) знаю, я взял за основу демо-пример клавиатуры из LUFA, у которого репорт настроен на страницу 7. Подскажи, что нужно добавить, чтобы можно было использовать страницу 0x0C? Я как раз с этим сейчас пытаюсь разобраться.

Alex_St
14.03.2013, 17:17
дописать в ReportDecription вторую коллекцию с другим reportID. Я тебе привел пример репорта для двух коллекций. Первая - это обычная клава (страница 0х07), а вторая - это мультимедийная (страница 0х0С).
Потом вспоминаешь, что в репорте первый байт у тебя задан reportID, и в нем выбираешь что шлешь. 1 - обычная клавиша, 2 - мультимедия. И соответственно строишь тело пакета. Что где в теле лежит - смотришь из reportDescription.
Если что - стучись в аську: 307342375

zyxel812
14.03.2013, 18:33
С ReportDecription разобрался кажется.
Теперь по поводу самого репорта, для страницы 7 структура такая:
uint8_t Modifier;
uint8_t Reserved;
uint8_t KeyCode[6]; (в моем случае размер указан именно 6)
Для страницы 0х0С такая же?
Только коды клавиш двух-байтные?
В репорт записывать сначала младший, потом старший байт?
Я правильно понял?

Alex_St
14.03.2013, 19:44
нет, не такая же.
Давай на примере моего репорта. Надеюсь, ты заметил, что я показал только смысловую часть, опустив начало и конец.. )
Репортдескрипшн (описалово репорта) как раз и показывает какие данные и как мы будем передавать.

Тут мы говорим, что будет новая коллекция (вариант репорта) под обычную клаву:
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 байта.

zyxel812
14.03.2013, 20:07
До меня постепенно доходит суть и смысл.
Только я пользуюсь библиотекой lufa, поэтому у меня всё тоже самое, только другими словами.
Исходя из информации от тебя, я описал такой вот дескриптор:

#define HID_DESCRIPTOR_KEYBOARD(MaxKeys) \
HID_RI_USAGE_PAGE(8, 0x01), \
HID_RI_USAGE(8, 0x06), \
HID_RI_COLLECTION(8, 0x01), \
HID_RI_REPORT_ID(8, 0x01), \
HID_RI_USAGE_PAGE(8, 0x07), \
HID_RI_USAGE_MINIMUM(8, 0xE0), \
HID_RI_USAGE_MAXIMUM(8, 0xE7), \
HID_RI_LOGICAL_MINIMUM(8, 0x00), \
HID_RI_LOGICAL_MAXIMUM(8, 0x01), \
HID_RI_REPORT_SIZE(8, 0x01), \
HID_RI_REPORT_COUNT(8, 0x08), \
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \
HID_RI_REPORT_COUNT(8, 0x01), \
HID_RI_REPORT_SIZE(8, 0x08), \
HID_RI_INPUT(8, HID_IOF_CONSTANT), \
HID_RI_USAGE_PAGE(8, 0x08), \
HID_RI_USAGE_MINIMUM(8, 0x01), \
HID_RI_USAGE_MAXIMUM(8, 0x05), \
HID_RI_REPORT_COUNT(8, 0x05), \
HID_RI_REPORT_SIZE(8, 0x01), \
HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), \
HID_RI_REPORT_COUNT(8, 0x01), \
HID_RI_REPORT_SIZE(8, 0x03), \
HID_RI_OUTPUT(8, HID_IOF_CONSTANT), \
HID_RI_LOGICAL_MINIMUM(8, 0x00), \
HID_RI_LOGICAL_MAXIMUM(8, 0xFF), \
HID_RI_USAGE_PAGE(8, 0x07), \
HID_RI_USAGE_MINIMUM(8, 0x00), \
HID_RI_USAGE_MAXIMUM(8, 0xFF), \
HID_RI_REPORT_COUNT(8, MaxKeys), \
HID_RI_REPORT_SIZE(8, 0x08), \
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE), \
HID_RI_END_COLLECTION(0), \ <-- на этом заканчивается то, что у меня было
HID_RI_USAGE_PAGE(8, 0x0C), \ <--это то, что я дописал для второй коллекции
HID_RI_USAGE(8, 0x01), \
HID_RI_COLLECTION(8, 0x01), \
HID_RI_REPORT_ID(8, 0x02), \
HID_RI_USAGE_PAGE(8, 0x0C), \
HID_RI_USAGE_MINIMUM(8, 0x00), \
HID_RI_USAGE_MAXIMUM(16, 0x0108), \
HID_RI_LOGICAL_MINIMUM(8, 0x00), \
HID_RI_LOGICAL_MAXIMUM(16, 0x0108), \
HID_RI_REPORT_COUNT(8, 0x02), \
HID_RI_REPORT_SIZE(8, 0x08), \
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE), \
HID_RI_END_COLLECTION(0)

его начало (до строки HID_RI_USAGE_PAGE(8, 0x0C)) это то, что у меня было, оставил как есть, только вставил строку HID_RI_REPORT_ID(8, 0x01) в начало, так как report_id небыло вообще.
Сам report у меня создается в функции
bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_ HID_Device_t* const HIDInterfaceInfo,
uint8_t* const ReportID,
const uint8_t ReportType,
void* ReportData,
uint16_t* const ReportSize)
Я теперь разбираюсь, от куда вызывается эта функция, от куда берется ReportID, который в нее передается, чтобы внести изменения с учетом того, что у меня теперь две коллекции.

iGeophysix
14.03.2013, 21:03
баааалин... да что все это значит вообще?)))))

m50b20
14.03.2013, 21:25
баааалин... да что все это значит вообще?)))))


+1 ))

жду готового продукта )

zyxel812
14.03.2013, 21:34
Alex_St, а можно ли оставить только одну коллекцию, дополнив её
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)
0x95, 0x02, // REPORT_COUNT (2)
0x75, 0x08, // REPORT_SIZE (8)
0x81, 0x00, // INPUT (Data,Ary,Abs),
т.е. в одном репорте в начале буду данные о кнопках из обоих страниц? Или это не прокатит?

Alex_St
14.03.2013, 22:04
Нет, не прокатит.
Чуть позже отвечу на предыдущие вопросы.

zyxel812
15.03.2013, 00:17
Кажется, истина уже где-то рядом :)
главное, понял в какую сторону копать,
изучаю пример KeyboardMouseMultiReport из lufa.

Alex_St
15.03.2013, 01:15
zyxel812
Истина таки рядом. Вроде все правильно. Единственное - я не понял зачем там паддинг в виде констант и зачем в таком устройстве леды.. Я бы лишнее убрал.
А в остальном - гуд.
И еще я себе добавил такую коллекцию:

0x06, 0x00, 0xff, // USAGE_PAGE (Vendor Defined Page 1)
0x09, 0x01, // USAGE (Vendor Usage 1)
0xa1, 0x01, // COLLECTION (Application)
0x85, 0x03, // REPORT_ID (3)
0x19, 0x00, // USAGE_MINIMUM (Undefined)
0x29, 0xff, // USAGE_MAXIMUM (Vendor Usage 255)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x07, // REPORT_COUNT (8)
0x91, 0x00, // OUTPUT (Data,Ary,Abs)
0x19, 0x00, // USAGE_MINIMUM (Undefined)
0x29, 0xff, // USAGE_MAXIMUM (Vendor Usage 255)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x07, // REPORT_COUNT (8)
0x81, 0x00, // INPUT (Data,Ary,Abs)
0xc0, // END_COLLECTION

Через такой репорт я могу посылать данные туда и обратно программой-конфигуратором для записи/чтения еепром.

п.с. я пользую v-usb.

zyxel812
15.03.2013, 01:33
Это всё было из демо-примера, оставил как есть. По ледам определяю, что устройство живо, значение capslock вывел на один из светодиодиков на моей плате, жму соответствующую кнопку на обычной клаве и смотрю, как он загорается и тухнет :)
Спасибо большое, Alex_ST. Благодаря твоим разъяснениям у меня таки получилось передать нажатия клавиш со страницы 0х0С. Одним из следующих шагов будет добавление возможности конфигурирования.

Alex_St
15.03.2013, 01:53
Ура! Я очень рад! Удачи в продолжении!
И не забудь возможность конфигурирования ;)

zyxel812
24.03.2013, 14:19
Всё почти готово, и прошивка, и конфигуратор. Вот только затык случился, весь мозг уже сломал, в моем составном устройстве работает либо виртуальный последовательный порт, либо клавиатура. Т.е., когда устройство включаешь, к нему можно подключиться через последовательный порт записать и считать конфигурацию. Потом, начинаю нажимать кнопки, сначала ни какой реакции, через несколько нажатий появляются заветные буковки, но устройство перестает отвечать по последовательному порту. При этом, вроде как оно данные по порту получает, а вот ответы не приходят.

awtoap
24.03.2013, 15:06
Я в усб не особо соображаю, но смотри на конечные точки...то есть для клавы скажем 1 точка(только вывод), для виртуального порта 2,3 (прием/передача). Вероятно они у тебя перекрываются.

Кстати по дескриптору описанному Alex_st завел свою поделку почти сразу, за что спасибо.

zyxel812
24.03.2013, 15:49
Посмотрел, не пересекаются.
Просматриваю сейчас весь свой код, но всё как будь-то бы чисто.

Alex_St
24.03.2013, 16:21
Кинь финальный дескриптор - глянем ;-)

zyxel812
24.03.2013, 16:55
Разобрался, вроде.
В LUFAConfig.h нужно было определить:
#define INTERRUPT_CONTROL_ENDPOINT
Подглядел в demo примере составного устройства мышки и последовательного порта. Теперь работает четко. Еще один глюк не связанный с usb отлавлю и будет очет с описанием, фотографиями, прошивками и программами :)

zyxel812
24.03.2013, 19:08
Готово, результат тут: http://www.pccar.ru/showthread.php?t=18903

Alex_St
24.03.2013, 19:39
Браво! Респект и уважуха!
Теперь вопросы позадаю я :)
Ком порт работает под 64бит системой?
Можешь кинуть десантного для компорта?

zyxel812
24.03.2013, 19:50
Ком порт работает под 64бит системой?
Да.
Можешь кинуть десантного для компорта?
"десантного" - это что?

Alex_St
24.03.2013, 20:46
Ой, писал с мобилки - т9 поменял )))
Дескриптор )

zyxel812
24.03.2013, 21:04
Так это всё есть в демо примерах библиотеки LUFA, скачать можно от сюда (http://www.fourwalledcubicle.com/LUFA.php).
В каждом примере есть файлы descriptors.c и descriptors.h, в них и есть дескриптор.
Содержание этих файлов из своего проекта прикладываю.

Alex_St
24.03.2013, 23:08
Пасиб! На досуге поиграюсь )