Forum: Mikrocontroller und Digitale Elektronik USB Interface Deskriptor - USB als Keyboard


von Fabian H. (bvb09man)


Lesenswert?

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

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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
};

von Fabian H. (bvb09man)


Lesenswert?

Hallo Matthias,

super vielen Dank für Deine Erklärung. Ich muss zuerst mal checken, ob 
die Deskriptoren nicht hart kodiert sind.

Vielleicht komm ich noch mal auf Dich zurück, wenn ich darf?

MFG bvb09man

von Hans-Georg L. (h-g-l)


Lesenswert?

Die genauen Spezifikationen zu HID findest du hier:

http://www.usb.org/developers/docs/hidpage/

von Fabian H. (bvb09man)


Lesenswert?

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

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Für einr HID-Tastatus ist wohl der Tastaturtreiber zuständig.

Ganz allgemein, denn mehr wissen wir hier nicht, kannst Du alle 
Tastencodes sende, die definiert sind.

von Fabian H. (bvb09man)


Lesenswert?

Jupp danke.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.