PCCar.ru - Ваш автомобильный компьютер

PCCar.ru - Ваш автомобильный компьютер (http://pccar.ru/index.php)
-   Общение с машиной (http://pccar.ru/forumdisplay.php?f=14)
-   -   BMW IBUS to USB Keyboard (http://pccar.ru/showthread.php?t=18794)

zyxel812 08.03.2013 16:16

BMW IBUS to USB Keyboard
 
Вложений: 1
Начну уже, пожалуй, тему.
И так, много народу сталкивается с необходимостью подключить кнопки на руле своего автомобиля к carpc. Среди них, в том числе, и владельцы BMW. В BMW нажатия кнопок на руле (и многие другие данные связанные с мультимедиа и приборной панелью) передаются по шине, называемой IBUS (по крайней мере, в e46 и в соседних по модельному ряду). Физически она представляет собой, так называемую, K-Line диагностическую линию связи, по которой данные передаются в одном общем проводе. Передаются они так же, как и в последовательном интерфейсе RS-232, более известном как COM порт, на скорости 9600 бит/с, по 8 бит в байте, с одним стоп-битом, без контроля четности (как на этой картинке). Это если описывать шину в двух словах, интересующиеся техническими деталями смогут найти их на необъятных просторах Интернета.

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

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

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

m50b20 08.03.2013 22:46

А когда примерно будет готов и сколько будет стоить ?

zyxel812 09.03.2013 13:24

Первый вариант работоспособной прошивки, если пройдет полевые испытания, то сегодня или завтра будет готов.
Купив вот такую плату, микросхему MC33290, пару керамических конденсаторов на 0,1мкФ и такой винтовой клемник вполне можно самостоятельно изготовить работоспособный девайс уже сейчас.
Я же буду еще дорабатывать схему, разрабатывать свою печатную плату, в которую собираюсь добавить контроллер питания carpc и только потом можно будет говорить об изготовлении девайса. Надеюсь закончить работу в течении этого месяца.

zyxel812 11.03.2013 13:17

Полевые испытания пока не пройдены, в микроконтроллер не попадают все байты с шины. При более внимательном прочтении datasheet'а на mc33290 обнаружил, что забыл резистор на 510..560 Ом между первой (vbb) и четвертой (iso) ногой микросхемы. Надеюсь вечером получить положительный результат.
Зато, теперь в прошивку включен еще CDC Class Device (COM-Порт), т.е. теперь адаптер представляется компьютеру составным устройством: USB-клавиатурой и USB-COM-портом. В COM-порт попадает всё, что "пролетает" по шине. Его можно открыть, например, в HyperTerminal'е и смотреть данные, "летающие" по шине. В финальной версии данные можно будет отправлять на шину, для тех, кто хочет не только слушать, но и управлять устройствами автомобиля. Однако, для этого легче купить BM9213 готовый адаптер, если конечно не нужна эмуляция нажатия клавиш клавиатуры.

m50b20 11.03.2013 13:37

ждем, удачи

zyxel812 11.03.2013 20:18

Вложений: 5
И так, всё работает. Правда видео не очень получилось.

Дело было не в забытом резисторе, а в том, что в протоколе используется контроль четности, а я его не включил. Т.е. скорость шины не 9600 8n1, а 9600 8e1.
Итого, девайс можно собрать на таком контроллере, используя приложенную к данному сообщению прошивку. Только контроллер нужно дополнить микросхемой 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

Цитата:

Сообщение от awtoap (Сообщение 250116)
Автор написал, что это будет составное устройство, тобиш одновременно COM порт и HID клава. В ведроиде должна сразу завестись как внешняя клава, только нужно освоить в ведре как переназначать коды клавиш.


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

Hamster 11.03.2013 21:50

Цитата:

Сообщение от m50b20 (Сообщение 250118)
"просто так"

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

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

awtoap 11.03.2013 21:53

Цитата:

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

zyxel812 11.03.2013 23:29

Цитата:

Сообщение от m50b20 (Сообщение 250099)
Я так понял, что к Андроиду просто так подключить не получится?

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

zyxel812 11.03.2013 23:32

Цитата:

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

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

m50b20 11.03.2013 23:59

А возможно ли изготовление твоими силами за деньги ?

Alex_St 12.03.2013 12:16

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

zyxel812 13.03.2013 17:32

Вложений: 1
Цитата:

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

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

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

m50b20 13.03.2013 20:02

ждем-ждем

iGeophysix 14.03.2013 09:40

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

zyxel812 14.03.2013 14:21

Вложений: 1
С кодами всё не так просто, как может показаться. Коды, которые передаются в 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

Цитата:

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

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

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

Alex_St 14.03.2013 16:17

Цитата:

Сообщение от iGeophysix (Сообщение 250650)
в Ардуино есть библиотека 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

Цитата:

Сообщение от Alex_St (Сообщение 250662)
Репорт должен быть настроен для 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

Цитата:

Сообщение от iGeophysix (Сообщение 250723)
баааалин... да что все это значит вообще?)))))


+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

Кинь финальный дескриптор - глянем ;-)


Часовой пояс GMT +4, время: 13:48.

Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot