hat HidD_GetFeature() nen Bug?

Gast #2127656
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
Gast #2128363
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.
Gast #2128676
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
Gast #2128826
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren