Hallo, mir ist klar, daß der Endpunkt0 bei einem USB für die Enummeration verwendet wird. Für welche Anwendung macht es einen Unterschied, ob der Endpunkt0 nun z.B. 32- oder 64Bytes FIFO hat? Vielen Dank!
Ich habe mir in einer AT90USB1287-Implementierung, die ich mal geschrieben habe (im Rahmen des µracoli-Projekts) folgenden Kommentar gemacht:
1 | #define CTRL_EP_SIZE 64 /* this is *not* easily customizable */ |
Den genauen Grund habe ich vergessen, aber das wird wohl ein Henne-und-Ei-Problem sein: den EP 0 brauchst du zum Übertragen der Konfigurationsdaten, und erst in den Konfigurationsdaten steht dann drin, wie groß die jeweiligen Endpunkte sind.
>Für welche Anwendung macht es einen Unterschied, ob der Endpunkt0 nun >z.B. 32- oder 64Bytes FIFO hat? für gar keine die EP0 Fifo wird ja nur für Controll Transfers benutzt. >Den genauen Grund habe ich vergessen, aber das wird wohl ein >Henne-und-Ei-Problem sein: den EP 0 brauchst du zum Übertragen der >Konfigurationsdaten, und erst in den Konfigurationsdaten steht dann >drin, wie groß die jeweiligen Endpunkte sind. Nein es hat nichts damit zu tun, da der erste Request bei ernstzunehmenden OS eh nur 8 byte groß ist. Es einfach so dass bei einem kleinen EP mehr Daten stages notwendig sind die korrekt implementiert werden müssen. Ich selbst habe auch schon mit 8 Byte Fifo gearbeitet. In meinem Fall hat das Speicherplatz gespart den in anderweilig verwenden konnte (TUSBXXXX) Thomas
Thomas schrieb: > Es einfach so dass bei einem > kleinen EP mehr Daten stages notwendig sind die korrekt implementiert > werden müssen. Ja, so allmählich dämmert es wieder. Ich glaube, man hätte einfach in der Firmware mehr Aufwand treiben müssen, daher der Kommentar. Zumindest für den AT90USB1287 hätte sich daraus ohnehin kaum ein praktischer Vorteil ergeben, da der so viel DPRAM besitzt, dass man trotzdem noch genügend Puffer für die Datenendpunkte hat. Bei kleineren Controllern könnte das natürlich anders sein.
Ok, also für das was ich mit dem USB eigentlich übertragen möchte ist es egal, ob nun 32 oder 64Bytes. Das hatte ich mir schon gedacht. Aber in welchem Fall fällt mir dieser Unterschied beim Programmieren auf, ob nun der 0EP kleiner oder größer ist? Ich denke doch, daß die Übertragung der Enumerationsdaten noch eine Schicht tiefer liegt, als das Eintragen der Daten um ein Gerät zu kennzeichnen usw.
Zwille schrieb: > Aber in welchem Fall fällt mir dieser Unterschied beim Programmieren > auf, ob nun der 0EP kleiner oder größer ist? Ich müsste jetzt auch nachsehen, aus dem Hut weiß ich nicht mehr, warum ich den Kommentar damals gemacht habe. Der configuration descriptor eines CDC devices ist jedenfalls auch so schon größer als 64 Bytes, sodass man das leidige ZLP handling (zero-length packet) ohnehin benötigt. Noch eine Fundstelle: http://www.beyondlogic.org/usbnutshell/usb4.htm The packet length of control transfers in low speed devices must be 8 bytes, high speed devices allow a packet size of 8, 16, 32 or 64 bytes and full speed devices must have a packet size of 64 bytes.
Jörg Wunsch schrieb: > Ich müsste jetzt auch nachsehen, aus dem Hut weiß ich nicht mehr, > warum ich den Kommentar damals gemacht habe. Vielleicht wollte ich damit nur ausdrücken, dass es nicht genügt, dieses #define zu ändern, sondern dass man auch den entsprechenden Wert im UECFG1X noch ändern müsste. Initial hatte ich mich darum herum gemogelt, das ZLP handling für den control endpoint überhaupt zu implementieren, dadurch war die EP-Größe von 64 erstmal notwendig, um die Daten überhaupt übertragen zu bekommen. Allerdings hatte ich dann nach diversen Versuchen mit verschiedenen Betriebssystemen sowie nach Studium der USB spec für die CDC devices feststellen müssen, dass es eine Reihe von Dingen gibt, die man formal implementieren muss, obwohl man sie gar nicht braucht (allerlei Krempel, der eigentlich nur für ein Modem von Interesse wäre, das eine Verbindung wählen können soll). Wenn man das nicht macht, akzeptiert das eine oder andere OS dieses Gerät einfach mal nicht in seinem generischen Treiber. Nachdem ich dann aber alles drin hatte, war der configuration descriptor halt ohnehin auf 67 Byte angewachsen, und das ZLP handling auch für EP 0 notwendig geworden. Damit wiederum müsste man den aber in der Tat auch auf 32 Byte beschränken können.
Hallo Zwille, man kann über den EP0 auch Datenpakete versenden. Je nachdem wieviele Bytes Du übertragen willst bietet es sich an, den Buffer größer oder kleiner zu machen. Außerdem kann man in einigen Controllern den verbliebenen USB-RAM als ganz gewöhnlichen RAM nutzen. Bei wenig RAM hilft es durchaus den EP0 klein zu machen. Gruß Ralf
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.