Ist es möglich, USB 2.0-Steuerungsanfragen aufzuteilen?

Ich entwickle eine Anwendung für Mikrocontroller mit integriertem USB. Die Anwendung soll so portabel wie möglich sein, daher kann ich nicht nur auf eine Familie hinweisen.

Ich bin dabei, den Konfigurationsdeskriptor eines Geräts zu lesen, aber er ist zu lang, um in meinen internen Puffer zu passen. Ich kann dafür keinen dynamischen Speicher verwenden, daher muss ein Puffer für Steuerübertragungen statisch zugewiesen werden, und ich möchte seine Größe wirklich minimieren, da er nicht viel verwendet wird. Es ist also keine Option, ihm nur für diesen cfg-Deskriptor ein paar Kb zuzuweisen.

Ich habe es nicht im Standard gefunden, aber vielleicht habe ich einfach nicht gut genug gesucht ... ist es möglich, Steueranforderungen in mehrere aufzuteilen ? Fordern Sie zum Beispiel 128 (oder was auch immer) Bytes der cfg desc an, fordern Sie dann weitere 128 Bytes desselben Deskriptors an, diese müssten natürlich mit einem 128-Offset zurückgegeben werden, um die bereits gelesenen zu berücksichtigen, und so weiter.

Ist das möglich?

Vielen Dank für Ihre Zeit.

Ich glaube, Sie können die übertragene Größe begrenzen, aber Sie können nicht mit einem Versatz beginnen. Der offensichtliche Weg, dies zu lösen (kann der beste sein oder auch nicht), besteht darin, selbst zu verfolgen, wo Sie sich befinden, und dasselbe mehrmals anzufordern.
Willkommen bei SE übrigens.
Danke =) Das Problem ist, dass ich nicht den gesamten Deskriptor in den Speicher einpassen kann, also kann ich ihn nicht einfach mehrmals anfordern, weil ich ihn nie vollständig haben werde. Nehmen wir zum Beispiel an, ich habe einen 1k-Puffer und der Deskriptor ist 2,5k.
Oh ja, ich habe vergessen, dass dies USB ist, nicht UART, SPI oder ein anderes Byte-at-a-Time-Protokoll. Aber wenn Sie irgendwie sehen können , wie einzelne Bytes hereinkommen, dann gilt meine Idee immer noch. Um etwas in der Mitte zu lesen, lassen Sie einfach die ersten N Bytes vergehen, bevor Sie mit der Aufnahme beginnen.
Ja das stimmt. Ich hatte gehofft, dass so etwas möglich wäre, damit ich die Treiber auf niedrigerer Ebene nicht ändern müsste (was der Portabilität sehr helfen würde) ... aber ich denke nicht = (
Vor nicht allzu langer Zeit habe ich einen USB-HID-Treiber für das Geräteende geschrieben, und ich erinnere mich an etwas in der Spezifikation über Übertragungen mit begrenzter Größe. Ich erinnere mich jedoch nicht an alle Details, daher könnte sich dies auf die begrenzte Größe eines HID-Pakets im Allgemeinen bezogen haben. Warten wir mal ab, ob sich noch jemand meldet.
Sie haben mir klar gemacht, dass ich die Begriffe Transaktion und Anfrage in meiner Frage verwechselt habe, ich werde das beheben. Ich denke, das Übertragungslimit ist von der Hostseite abhängig von der Implementierung. Danke für die Hilfe, ich werde abwarten und sehen, ob sich jemand weiter dazu äußern kann.

Antworten (1)

Anstatt den Konfigurationsdeskriptor anzufordern und alle Schnittstellen- und Endpunktdeskriptoren zusammenzustellen, könnten Sie die Deskriptoren einzeln anfordern. Ein Gerätedeskriptor ist 18 Bytes lang, und die anderen Standarddeskriptoren sind sogar noch kleiner. (Klassendeskriptoren können größer sein, wählen Sie also den größten, den Sie als Puffergröße benötigen.) Sie müssen die Deskriptoren parsen, um herauszufinden, was Sie sonst noch anfordern müssen, aber das ist nicht viel zusätzliche Arbeit. Der Gerätedeskriptor gibt die Anzahl der Konfigurationen an, config gibt die Anzahl der Schnittstellen an und interface gibt die Anzahl der Endpunkte und die Klasse an.

Oh, ich hatte nicht gewusst, dass ich das tun könnte. Sie meinen, die cfg desc gerade genug anzufordern, um zu analysieren, wie viele Schnittstellen vorhanden sind, und dann jeden Schnittstellen- (und Endpunkt-) Deskriptor einzeln anzufordern?
Ja, genau das meine ich.