Forum: Mikrocontroller und Digitale Elektronik USB HID. Finger auf Touch Screen mit STM32 simulieren.


von USB_Flo (Gast)


Lesenswert?

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

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.