Forum: Mikrocontroller und Digitale Elektronik Wie HID Endpoint mit 128 Byte beim ATMEGA32U4


von Uli (Gast)


Lesenswert?

Hallo,

ich habe ein HID Projekt mit einem ATMEGA32U4 gemacht.
Das ganze basiert auf dem Teensy Projekt.
Ich habe 3 Endpoints (0, out und in).
Zur zeit übertrage ich (out/in) 51Byte.
Jetzt will ich das ganze auf 101 Byte erweitern.

Klingt erst mal ja nicht wild.
Auf Windows Seite die Anzahl von 50 auf 120 ändern.
Und auf dem Prozessor das ganze auch ändern und den USB Buffer auf 128 
(Doppelter Puffer  ->0x46) ändern.

Tja nur leider bekomme ich jetzt immer einen Windows Error 995.
Den bekomme ich aber auch wenn ich im Debugger das langsam mache.
Auch meine Timeout-Zeiten habe ich zum Testen mal verzehnfacht.

Die Byte Anzahl ist es nicht, das ergibt einen Anderen Fehler.

Hat jemand das Problem auch schon mal gehabt?
Hat jemand mal mit den 128 Bit Buffer gearbeitet?

Uli

von Kaj (Gast)


Lesenswert?

ERROR_OPERATION_ABORTED
    995 (0x3E3)
    The I/O operation has been aborted because of either a thread exit
    or an application request.

von Uli (Gast)


Lesenswert?

Nun den Text kenne ich, aber es wird weder ein Thread verlassen noch 
veranlasse ich einen Abbruch.

Wie gesagt mit 51 Byte geht noch alles.

von Jim M. (turboj)


Lesenswert?

Das kann nicht funktionieren, denn ein USB Endpoint ist auf 64 Byte 
beschränkt.

Wenn der Durchsatz von 64000 Byte/s (64 Byte in 1 ms) zuwenig ist, musst 
Du auf Bulk Endpoints umsteigen. Die sind auch nur 64 Byte groß, können 
aber mehrmals im 1ms USB Frame übertragen.

Das erfordert einen Treiber für Windows, aber es gibt auch WinUSB und 
Libusb.

Die 128 Byte beziehen sich auf Doppelpufferung, damit man das nächste 
Frame schon reinschreiben kann während das alte noch gesendet wird.

: Bearbeitet durch User
von Uli (Gast)


Lesenswert?

Das mit der Begrenzung wusste ich nicht, würde aber alles erklären.

Kann man das irgendwo nachlesen?
Ich finde dazu nicht.

Danke Uli

von Uli (Gast)


Lesenswert?

Wikipedia hats:
Interrupt-Transfers
Bei Low-Speed können pro Abfrage bis zu 8 Byte, bei Full-Speed bis zu 64 
Byte und bei High-Speed bis zu 1024 Byte übertragen werden.

Tja uns ich habe Full-Speed was dann wohl oder übel 64 Byte sind.

von Potter (Gast)


Lesenswert?

Jim Meba schrieb:
> Das kann nicht funktionieren, denn ein USB Endpoint ist auf 64 Byte
> beschränkt.

Das stimmt zwar, aber das ist nicht das Problem, da man bei HID nämlich 
Reports versendet und diese können durchaus größer sein als 64 Bytes. 
Bei 101 Bytes müsste dann die Firmware den Report auf zwei Transaktionen 
aufteilen, was aber zusätzliches Handling verlangt, welches wiederum in 
den meisten HID-Stacks nicht implementiert ist.
Das Gleiche gilt dann auch auf PC Seite. Es ist auch hier ein 
Unterschied, ob ich versuche 64 Bytes und 37 Bytes zu empfangen oder ob 
ich 101 Bytes auf einmal annehmen möchte.

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.