2017-10-26 3 views
0

Ich entwickle ein USB HID Gerät mit einem STMicro Mikrocontroller. Ich habe mit STMicros HID-Beispiel angefangen, was gut funktioniert. Ich verwende C++ unter Windows 7 64-Bit für die PC-Seite. Ich habe eine Anwendung, die mit meinem Gerät funktioniert. Es gibt jedoch eine Sache, die ich nicht herausfinden kann.Windows USB HID Bericht Länge

Die Beispiel-Firmware erlaubt nur das Senden und Empfangen von 2 Bytes gleichzeitig, was durch eine HIDP_CAPS.OutputReportByteLength und InputReportByteLength bestimmt wird. Ich würde gerne mehr Daten als dieses sofort senden, aber ich kann nicht herausfinden, wie man die Berichtslängen erhöht. Ich habe erfolgreich den Endpunkt wMaxPacketSize, die VID und PID, und ein paar andere Dinge geändert, aber ich kann nicht herausfinden, wie Windows die Länge der eingehenden und ausgehenden Berichte berechnet. Es scheint keine Felder in meinem Bericht oder Gerätebeschreibungen zu geben, die diese Länge angeben, aber ich kann mir nicht vorstellen, woher es sonst kommen könnte.

Kann mir jemand sagen, wie Windows die HIDP_CAPS.OutputReportByteLength und HIDP_CAPS.InputReportByteLength ermittelt?

Wie kann ich diese Längen erhöhen?

Antwort

0

Ich fand es heraus. Ich dachte, ich würde hier posten, falls jemand anders es wissen sollte. Ich bin mir nicht ganz sicher, ob ich das alles wirklich verstehe. Wenn ich also einen Fehler gemacht habe, bitte korrigieren Sie mich.

Ich musste die Berichtsbeschreibung in meiner Firmware ändern. Ich hatte mehrere Nutzungen. Windows ruft die Berichtsbeschreibung ab und ermittelt, welche Verwendung die längste Länge benötigt und verwendet diese Länge. Auf einer meiner Eingangs Berichte habe ich die folgenden Änderungen (der Input-Report ist nur ein Array von Bytes in der Firmware):

0x27, 0xFF, 0xFF, 0xFF, 0xFF, //Logical maximum is 4 bytes long, and has a value of 0xFFFFFFFF 0x95, 0x01, //There is one report 0x75, 0x20, //There are 32 bits per report

habe ich etwas ähnliches für den Ausgang, aber es gibt keinen Bericht Nummernfeld (0x95).

Windows sagt mir jetzt, dass ich 5 Bytes senden und empfangen kann, was bedeutet, dass der Endpunkt plus Berichtsnummer mal die Berichtsgröße bedeutet.

+0

Können Sie Ihren vollständigen HID-Berichtsdeskriptor posten? Wenn Sie eine Berichts-ID darin haben, müssen Sie alle Berichte mit dieser ID voranstellen, die für das zusätzliche Byte verantwortlich sind. – aja

+0

Sie können das gesamte ursprüngliche Projekt hier erhalten: https://github.com/zegervdv/PS2-controller/tree/master/STM32F072B-Discovery_FW_V1.0.1/Projects/Peripheral_Examples/USB_Example –

+0

Nicht ein großes Problem, aber es ist ein kleiner Fehler im HID-Berichtsdeskriptor dieses Beispiels ... 0x25, 0xFF, // Logisches Maximum (255) ... bedeutet wirklich "Logisches Maximum -1". Es sollte sein: 0x26, 0xFF, 0x00, // Logisches Maximum (255) Auch das Angeben von 0xA0 anstelle von 0xA1 0x00 für die physische Auflistung ist ein grauer Bereich. Die Spezifikation sagt nicht explizit, welcher Standardwert angenommen wird, wenn ein Wert weggelassen wird ... aber ich denke, dass Null sinnvoll wäre. Ansonsten ist kein Berichtsdeskriptor vorhanden, daher würde ich erwarten, dass 5-Byte-Berichte angezeigt werden (je einer für Ry, Rx, Y, X und die Schaltflächenbits). – aja

Verwandte Themen