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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.