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
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 | };
|
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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.