Hallo Forum,
ich wollte mir ein kleines Keyboard bauen, dass nur die Mediatasten hat,
also
- Mute
- Vol+
- Vol-
- play/pause
- stop
- << (spulen)
- >> (spulen)
- skip fwd
- skip bckwd
Soweit der Plan.
Als Hardware habe ich hier einen ATmega32u2 vor mir liegen, der zwas
abenteuerlich verlötet ist, aber funktioniert. Der Atmel DFU-Bootloader
funktioniert und ich habe den AVR schon dazu gebracht, sich am PC
(Windows) als Tastatur anzumelden. Normale Tastendrücke senden geht.
Als "Lib" verwende ich diese: http://www.weigu.lu/b/usb/index.html
Diese hat einen Standard-Desc. eingebaut:
Jetzt zum Problem:
ich habe keine Ahnung, wie der richtige Descriptor auszusehen hat, damit
man auch die Media-Tasten nutzen kann.
Ich kenne mich auch mit USB nicht aus, das ist mein erstes Projekt in
dieser Richtung.
Es wäre nett, wenn evtl jmd einen passenden Desriptor hätte oder es mir
erklären könnte.
mfG
N.G.
Hallo;
Es wäre nett, wenn evtl jmd einen passenden Desriptor hätte oder es mir
erklären könnte.
Aus dem Stegreif nicht, da meine letzten Entwicklungen im Bereich HID
USB 15 Jahre zurückligen, aber(nicht böse gemeint):
- die USB Spezifikation ist verstanden, insbesondere zur HID Klasse ?
oder anders: Hast du dir die entsprechenden Schriften von der USB
Organisation einmal besorgt.
Dort gib es auch Tools zur Erstellung passender Descriptoren.
Aber:
Solange das Konzept nicht verstanden wurde ist das immer fischen im
Dunkeln.
Oder anders:
Auch wenn Ihnen / dir jemand einen zufällig passenden Descriptor Gäbe
Wäre das Prinzip nicht verstanden.
Gruss
marc schrieb:> aber(nicht böse gemeint)
ich kann die Einwände verstehen.
marc schrieb:> die USB Spezifikation ist verstanden, insbesondere zur HID Klasse ?
Naja, nur so halb, bzw: ich habs gelesen komme damit aber insgesamt noch
nicht zu recht. Die Mediatasten müssen wohl von einem Consumer Device
sein, die normalen Tasten von einem Generic desktop device/Keyboard.
Aber ich bekomme auch nach testen keinen funktionierenden Deskriptor
hin.
Habe ich mal zusammengebastelt (ist aber wahrscheinlich in mehr als 5
dingen falsch...):
1
USAGE_PAGE (Consumer Devices) 05 0C
2
USAGE (Consumer Control) 09 01
3
COLLECTION (Application) A1 01
4
USAGE_PAGE (Keyboard) 05 07
5
USAGE_MINIMUM (Keyboard Mute) 19 7F
6
USAGE_MAXIMUM (Keyboard Volume Down) 29 81
7
LOGICAL_MINIMUM (0) 15 00
8
LOGICAL_MAXIMUM (1) 25 01
9
REPORT_SIZE (1) 75 01
10
REPORT_COUNT (3) 95 03
11
INPUT (Data,Var,Abs) 81 02
12
INPUT (Cnst,Var,Abs) 81 03
13
END_COLLECTION C0
Ich würde das Prinzip jedoch schon gerne verstehen ;)
Sprich: lernwillig, nur mit Cerständnisproblemen...
aber Danke schon mal!
Das mit dem USAGE "Keyboard Mute", "Keyboard Volume Down", etc. kannst
Du vergessen, das funktioniert nicht (aus eigener Erfahrung). Die
Medientasten gehören zu den "Consumer Page"-USAGEs.
Ich habe das im Einsatz, und es funktioniert (unter Windows/Linux).
Eine Kombination aus Keyboard und Consumer Control (Keyboard wird nicht
benutzt):
Damit hat man zwei Reports, einen mit ID 1 (Keyboard, bei mir nicht
benutzt) und einen für die Medientasten (Consumer Control) mit ID 2, ein
Byte lang (jeweils ein Bit für Vol+, Vol-, Mute, und 5 Füllbits).
Oh, gerade stolpere ich über das gleiche Problem, um dann rauszufinden,
dass ich das selber sowas ähnliches schon gelöst hatte, vor 10 Jahren:
http://www.tu-chemnitz.de/~heha/basteln/PC/Mikrofonverstärker/OneKey.zip/
Üblicherweise sind HID-Deskriptoren für Tastaturen so gebaut, dass mit
einem Input-Report vom Typ "Array" eine gewisse Anzahl gleichzeigig
gedrückter Tasten als Report-ID gemeldet werden. Nullen stehen in leeren
Arraypositionen, weil HID-Reports stets konstante Länge haben. Der
Report wird immer dann abgesendet, wenn sich etwas ändert. Um
Tastenrepeat kümmert sich der Host-PC.
Bei dem von mir „erfundenen“ HID-Deskriptor habe ich die Tasten auf Bits
eines Bytes gelegt, so wie man das bei wenigen (<=16) Tasten macht: Der
HID-Deskriptor beschreibt hier für jedes Bit eine Usage (oder keine für
freie Bits). Geschickterweise so, dass ein simples Lesen von PortB (des
verwendeten ATtiny25) bereits die richtige Bitkombination liefert. Das
Umstapeln der Bits muss der PC machen (= das tut er sowieso).
Obwohl das einigermaßen unterdokumentiert ist, funktioniert das
anscheinend mit jedem Computer, denn bei Mäusen wird's auch so gemacht.
Allerdings verwendet das o.a. Beispiel keine Mediensteuertasten. Es
dürfte jedoch genauso funktionieren.
Anzumerken wäre noch, dass USB die fürchterliche Hampelei mit Extended
Keycodes bei PS/2 vergessen lässt: Selten ist etwas neues einfacher
als der Vorgänger.