Hallo zusammen :)
wie der Titel erahnen lässt, möchte ich mit einem STM32F0 (72RBT6)
Nucleo Board die Fingereingabe an einem Touchscreen simulieren.
Hierfür soll das Board als HID über USB an einen Monitor angeschlossen
und erkannt werden.
Eine HID Maus konnte ich dank der zahlreichen Beispiele im Netzt bereits
erfolgreich in betrieb nehmen.
Der Touchscreen befindet sich an einem Display mit integriertem
Mainboard auf dem ein Linux Kernel läuft. (Hiervon hab ich leider keine
wirkliche Ahnung weswegen ich keine Fragen beantworten kann).
Leider habe ich noch einige Verständnisprobleme was den HID Descriptor
betrifft.
Auch mithilfe der offiziellen USB HID Usage Table Doku
(http://www.usb.org/developers/hidpage/Hut1_12v2.pdf) und anderen
Internetquellen, konnte ich es mir leider nicht 100% verständlich
erarbeiten.
Aus diesem Grunde möchte ich gerne mein Glück hier probieren um
herauszufinden, wo genau mein Verständnis noch scheitert.
Meine Erste Idee war den Descriptor wie folgt aufzubauen:
1
0x05, 0x0d, // USAGE_PAGE (Digitizers)
2
0x09, 0x04, // USAGE (Touch Screen)
3
0xa1, 0x01, // COLLECTION (Application)
4
0xa1, 0x00, // COLLECTION (Physical)
5
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
6
0x09, 0x30, // USAGE (X)
7
0x09, 0x31, // USAGE (Y)
8
0x15, 0x81, // LOGICAL_MINIMUM (-127)
9
0x25, 0x7f, // LOGICAL_MAXIMUM (127)
10
0x75, 0x08, // REPORT_SIZE (8)
11
0x95, 0x02, // REPORT_COUNT (2)
12
0x81, 0x02, // INPUT (Data,Var,Abs)
13
0x05, 0x0d, // USAGE_PAGE (Digitizers)
14
0x09, 0x42, // USAGE (Tip Switch)
15
0x15, 0x00, // LOGICAL_MINIMUM (0)
16
0x25, 0x01, // LOGICAL_MAXIMUM (1)
17
0x95, 0x01, // REPORT_COUNT (1)
18
0x75, 0x01, // REPORT_SIZE (1)
19
0x81, 0x02, // INPUT (Data,Var,Abs)
20
0x95, 0x01, // REPORT_COUNT (1)
21
0x75, 0x07, // REPORT_SIZE (7)
22
0x81, 0x01, // INPUT (Cnst,Ary,Abs)
23
0xc0, // END_COLLECTION
24
0xc0 // END_COLLECTION
(erstellt mit dem HID Descriptor Tool von USB.org)
Meine Idee war, dass ich einen Touchscreen habe welcher physische X- &
Y-Koordinaten besitzt und über einen Tip Switch eine Berührung simuliert
werden kann.
Prinzipiell scheint meine Idee auch zu funktionieren. Nachdem ich mein
Board mit dem Monitor verbunden hatte, konnte ich den Cursor bewegen
(dient zur Visualisierung) und auch "Clicks" auslösen.
Doch wenn ich über die debug message nach dem Gerät gesucht habe, stand
dort nur mehrmals die Meldung "unknown main item tag 0x0".
Untersuche ich das ganze am Windows PC mithilfe des USB Device Tree
Viewer, steht beim angeschlossenen HID Port die Meldung
"ConfigDescriptor 1 Error : ERROR_BUSY (because the device has problem
code CM_PROB_FAILED_START)"
Meine erste Idee war daraufhin, dass es daran liegen könnte, dass er
durch das Usage Tag (Touch Screen) denken könnte, dass ein Touchscreen
angeschlossen wurde und kein Eingabegerät.
Demnach sah mein 2. Versuch so aus:
1
0x05, 0x0d, // USAGE_PAGE (Digitizers)
2
0x09, 0x22, // USAGE (Finger)
3
0xa1, 0x01, // COLLECTION (Application)
4
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
5
0x09, 0x01, // USAGE (Pointer)
6
0xa1, 0x00, // COLLECTION (Physical)
7
0x09, 0x30, // USAGE (X)
8
0x09, 0x31, // USAGE (Y)
9
0x15, 0x9c, // LOGICAL_MINIMUM (-100)
10
0x25, 0x64, // LOGICAL_MAXIMUM (100)
11
0x75, 0x08, // REPORT_SIZE (8)
12
0x95, 0x02, // REPORT_COUNT (2)
13
0x81, 0x02, // INPUT (Data,Var,Abs)
14
0x05, 0x0d, // USAGE_PAGE (Digitizers)
15
0x09, 0x35, // USAGE (Tap)
16
0x15, 0x00, // LOGICAL_MINIMUM (0)
17
0x25, 0x01, // LOGICAL_MAXIMUM (1)
18
0x75, 0x01, // REPORT_SIZE (1)
19
0x95, 0x01, // REPORT_COUNT (1)
20
0x81, 0x02, // INPUT (Data,Var,Abs)
21
0x75, 0x07, // REPORT_SIZE (7)
22
0x95, 0x01, // REPORT_COUNT (1)
23
0x81, 0x01, // INPUT (Cnst,Ary,Abs)
24
0xc0, // END_COLLECTION
25
0xc0 // END_COLLECTION
Dieses mal wollte ich den eigentlichen Fingerdruck auf dem Touchpad
probieren darzustellen. Doch leider funktioniert es mit dem Descriptor
nicht.
Ändere ich allerdings das Usage(Tap) zu Usage(Tip Switch), funktioniert
es wieder.
Allerdings mit den gleichen Fehlermeldungen wie zuvor.
Die Idee für diesen Ansatz hatte ich aus dem USB HID Usage Table
Dokument.
Dort steht unter Finger:
>Finger: Any human apprendage used as a transducer, such as a finger >touching a
touch screen to set the location of the screen cursor. A >digitizer typically
reports the coordinates of center of the finger. In >the Finger collection a
Pointer physical collection will contain axes >reported by the finger.
Etwas ähnliches lässt sich dort auch zum Stylus nachlesen. Doch
betrachtet man in den gelisteten Beispielen ein Desktop Tablet Example
(A.7) wird dort keine Pointer-Physical-Collection angelegt.
Daher meine Fragen:
1. Kann ich einen Descriptor erstellen, sodass mein Board auch als Touch
Eingabegerät erkannt und dargestellt wird?
2. Habe ich den grundlegenden Aufbau des Descriptors richtig verstanden?
Dient Usage Page und Usage Tag vor der Application Collection dazu, dem
Host mitzuteilen, um was für ein HID es sich handelt?
Ein folgendes Usage Tag dazu, um ein Element zu klassifizieren wie bspw.
Pointer für eine Maus?
Und die darauf folgende Physical Collection, um die Eigenschaften des
Pointers festzulegen, wie Koordinaten oder eventl. Buttons?
3. Gibt es irgendwo Listen wo man nachlesen kann, wie HID Desriptoren
für bestimmte standard Klassen aufgebaut sein müssen, also Reihenfolge
der Tags, benötigte Tags insgesamt usw? Ich konnte bis jetzt nichts der
gleichen finden.
Falls mir jemand bei meinem Verständnis des Descriptor-Aufbaus helfen
könnte, wäre ich sehr dankbar.
Ich freue mich auf hilfreiche Antworten und wünsche euch noch eine
schöne Woche.
VG
USB_Flo