USB Interface Deskriptor - USB als Keyboard

OP #3156338
Hallo zusammen,

ich habe das Forum schon ein wenig durchstöbert, hänge gerade ein 
wenig....

Kann ich generell jedes USB Gerät als virtuelles Keyboard registrieren 
lassen. Ich habe hier eine Aussage von einem Kollegen, welche ich nicht 
recht glauben kann. Er meint, dass sich Geräte, bei denen es sich um 
eine Vendor-HID-class handelt nicht ginge. Um das zu realisiern müsste 
die Klasse in eine HID sub class keyboard geändert werden.

Ich habe recherchiert, dass die Interface Deskriptoren den 
Registirierungstyp (Keyboard) dem Betriebssystem mitteilen.
Könnte man hier nicht die Information auf den Chip übertragen, heißt 
kann ich nachträglich die Informationen der Deskriptoren für das USB 
Gerät ändern?

Vielen Dank im Voraus für Ihre Mühe.

bvb09man
(Firma: matzetronics)
Fabian Hoffmann schrieb:
> Könnte man hier nicht die Information auf den Chip übertragen, heißt
> kann ich nachträglich die Informationen der Deskriptoren für das USB
> Gerät ändern?

Das geht natürlich erstmal nur, wenn die Deskriptoren nicht 'hart' im 
USB Chip kodiert sind, sondern z.B. in einem Flash erreichbar sind. Und 
dann muss sich die Peripherie auch wie ein solches Gerät verhalten, d.h. 
ein Keyboard kann nicht plötzlich relative Mauskoordinaten liefern, 
sondern muss sich an die Konventionen der jeweilige Geräteklasse halten.
Hier ist mal ein USB Deskriptor (in V-USB syntax) eines Keyboards:
1
PROGMEM char usbHidReportDescriptor[USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH] = { /* USB report descriptor */
2
    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
3
    0x09, 0x06,                    // USAGE (Keyboard)
4
    0xa1, 0x01,                    // COLLECTION (Application)
5
    0x05, 0x07,                    //   USAGE_PAGE (Keyboard)
6
    0x19, 0xe0,                    //   USAGE_MINIMUM (Keyboard LeftControl)
7
    0x29, 0xe7,                    //   USAGE_MAXIMUM (Keyboard Right GUI)
8
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
9
    0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)
10
    0x75, 0x01,                    //   REPORT_SIZE (1)
11
    0x95, 0x08,                    //   REPORT_COUNT (8)
12
    0x81, 0x02,                    //   INPUT (Data,Var,Abs)
13
    0x95, 0x01,                    //   REPORT_COUNT (1)
14
    0x75, 0x08,                    //   REPORT_SIZE (8)
15
    0x25, 0x65,                    //   LOGICAL_MAXIMUM (101)
16
    0x19, 0x00,                    //   USAGE_MINIMUM (Reserved (no event indicated))
17
    0x29, 0x65,                    //   USAGE_MAXIMUM (Keyboard Application)
18
    0x81, 0x00,                    //   INPUT (Data,Ary,Abs)
19
    0xc0                           // END_COLLECTION
20
};
Im Vergleich dazu hier mal eine Maus (mit absoluten Koordinaten, da es 
eigentlich ein Tablet ist):
1
PROGMEM char usbHidReportDescriptor[60] = {
2
    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
3
    0x09, 0x02,                    // USAGE (Mouse)
4
    0xa1, 0x01,                    // COLLECTION (Application)
5
    0x09, 0x01,                    //   USAGE (Pointer)
6
    0xa1, 0x00,                    //   COLLECTION (Physical)
7
    0x05, 0x09,                    //     USAGE_PAGE (Button)
8
    0x19, 0x01,                    //     USAGE_MINIMUM (Button 1)
9
    0x29, 0x03,                    //     USAGE_MAXIMUM (Button 3)
10
    0x15, 0x00,                    //     LOGICAL_MINIMUM (0)
11
    0x25, 0x01,                    //     LOGICAL_MAXIMUM (1)
12
    0x95, 0x03,                    //     REPORT_COUNT (3)
13
    0x75, 0x01,                    //     REPORT_SIZE (1)
14
    0x81, 0x02,                    //     INPUT (Data,Var,Abs)
15
    0x95, 0x01,                    //     REPORT_COUNT (1)
16
    0x75, 0x05,                    //     REPORT_SIZE (5)
17
    0x81, 0x03,                    //     INPUT (Cnst,Var,Abs)
18
    0x05, 0x01,                    //     USAGE_PAGE (Generic Desktop)
19
    0x09, 0x30,                    //     USAGE (X)
20
    0x09, 0x31,                    //     USAGE (Y)
21
    0x35, 0x00,                    //     PHYSICAL_MINIMUM (0)
22
    0x46, 0x9d, 0x0b,              //     PHYSICAL_MAXIMUM (2973)
23
    0x15, 0x00,                    //     LOGICAL_MINIMUM (0)
24
    0x26, 0x9d, 0x0b,              //     LOGICAL_MAXIMUM (2973)
25
    0x65, 0x11,                    //     UNIT (SI Lin:Distance)
26
    0x55, 0x0e,                    //     UNIT_EXPONENT (-2)
27
    0x75, 0x10,                    //     REPORT_SIZE (16)
28
    0x95, 0x02,                    //     REPORT_COUNT (2)
29
    0x81, 0x02,                    //     INPUT (Data,Var,Abs)
30
    0xc0,                          //   END_COLLECTION
31
    0xc0                           // END_COLLECTION
32
};
OP
Hallo, ich habe noch ein Verständnisproblem bezüglich des Anmeldens 
eines virtuellen Keyboards und hoffe, dass Ihr mir erneut helfen könnt.

Ich habe hier ein Board, welches sich jetzt über HID als virtuelles 
Keyboard anmeldet. Welcher Treiber auf der Gegenseite (windows) 
registriert denn dieses Board? Kann ich beliebige Tatsten der Tastatur 
(z.B. Pfeiltasten) für die Schalter auf dem Board festlegen? Welche 
Tasten machen denn am meisten Sinn?

Vielen Dank im Voraus für Eure Mühe.

bvb09man

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.