Forum: Mikrocontroller und Digitale Elektronik hat HidD_GetFeature() nen Bug?


von Markus (Gast)


Lesenswert?

Guten Abend,

ich habe eine Frage wie man die WindowsAPI HidD_GetFeature() richtig 
verwendet - weil ich tu es offensichtlich falsch oder es ist ein Bug:

-auf dem Mikrocontroller läuft VUSB

1. Szenario: ich lege auf dem Mikrocontroller die ReportID auf default 
(= 0)
wenn ich den Report abfrage mit HidD_GetFeature() dann kommen die Daten 
richtig

2. Szenario: ich lege die Report ID auf 1 (im Report Descriptor) und 
frage den Report ab (mit ID1). Der kommt dann auch, aber leider falsch - 
das 1. Byte fehlt

der Inhalt des Eingangspuffers:
Eingangspuffer (Byte Nr) [0][1][2][3][4][5][6][7][8]
         Daten bei ID0:   0  1  2  3  4  5  6  7  8
         Daten bei ID1:   1  2  3  4  5  6  7  8  ?

Was mache ich falsch?

Gruß Markus

von Guest (Gast)


Lesenswert?

Wie sehen denn Deine Descriptoren bei VUSB genau aus (Quellcode)?

von Markus (Gast)


Lesenswert?

Meinst du den ReportDescriptor?

Das ist der wo der Fehler passiert:
1
PROGMEM char usbHidReportDescriptor[27] = {
2
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)
3
    0x09, 0x01,                    // USAGE (Vendor Usage 1)
4
    0xa1, 0x01,                    // COLLECTION (Application)
5
6
    0x85, 0x01,                    //   REPORT_ID (1)
7
    0xa1, 0x01,                    //   COLLECTION (Application)
8
    0x09, 0x01,                    //     USAGE (Undefined)
9
    0x15, 0x00,                    //     LOGICAL_MINIMUM (0)
10
    0x26, 0xff, 0x00,              //     LOGICAL_MAXIMUM (255)
11
    0x75, 0x08,                    //     REPORT_SIZE (8)
12
    0x95, 0x40,                    //     REPORT_COUNT (64)
13
    0xb2, 0x02, 0x01,              //     FEATURE (Data,Var,Abs,Buf)
14
    0xc0,                          //   END_COLLECTION
15
16
    0xc0                           // END_COLLECTION

Bei dem Funktioniert es:
1
PROGMEM char usbHidReportDescriptor[25] = {
2
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)
3
    0x09, 0x01,                    // USAGE (Vendor Usage 1)
4
    0xa1, 0x01,                    // COLLECTION (Application)
5
6
    0xa1, 0x01,                    //   COLLECTION (Application)
7
    0x09, 0x01,                    //     USAGE (Undefined)
8
    0x15, 0x00,                    //     LOGICAL_MINIMUM (0)
9
    0x26, 0xff, 0x00,              //     LOGICAL_MAXIMUM (255)
10
    0x75, 0x08,                    //     REPORT_SIZE (8)
11
    0x95, 0x40,                    //     REPORT_COUNT (64)
12
    0xb2, 0x02, 0x01,              //     FEATURE (Data,Var,Abs,Buf)
13
    0xc0,                          //   END_COLLECTION
14
15
    0xc0                           // END_COLLECTION

ich verwende als Host-Software das Commandozeilen-Tool aus dem 
HID-Data-Beispiel vom VUSB Download.

von Potter (Gast)


Lesenswert?

Probiers mal hiermit:

1
PROGMEM char usbHidReportDescriptor[] = {
2
    0x06, 0x00, 0xff,              // USAGE_PAGE (Vendor Defined Page 1)
3
    0xa1, 0x01,                    // COLLECTION (Application)
4
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
5
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)
6
    0x75, 0x08,                    //   REPORT_SIZE (8)
7
8
    0x85, 0x01,                    //   REPORT_ID (1)
9
    0x95, 0x40,                    //   REPORT_COUNT (64)
10
    0x09, 0x01,                    //   USAGE (Vendor Usage 1)
11
    0xB2, 0x02, 0x01               //   FEATURE (Data,Var,Abs)
12
13
    0x85, 0x02,                    //   REPORT_ID (2)
14
    0x95, 0x80,                    //   REPORT_COUNT (128)
15
    0x09, 0x01,                    //   USAGE (Vendor Usage 1)
16
    0xB2, 0x02, 0x01               //   FEATURE (Data,Var,Abs)
17
18
    ...
19
    ...
20
    0xc0                           // END_COLLECTION
21
};

In dem Beispiel werden jetzt zwei Descriptoren definiert:

- ID = 1; Größe 64 Bytes
- ID = 2; Größe 128 Bytes

Je nach Bedarf kannst du Dir das anpassen und auch noch einen 
dritten/vierten anfügen.

Du mußt dann noch die Firmware ändern, so dass Dein erstes Byte immer 
die entsprechende Report ID enthält.

Gruß Potter

von Potter (Gast)


Lesenswert?

Vor der Collection fehlt noch eine Usage hab ich grade gesehen.

Gruß Potter

von Markus (Gast)


Lesenswert?

super,

"Du mußt dann noch die Firmware ändern, so dass Dein erstes Byte immer
die entsprechende Report ID enthält."

das war es, warum es nicht so wie gewollte geklappt hat, weil ich gleich 
mit Nutzdaten angefangen habe

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.