Forum: Mikrocontroller und Digitale Elektronik Unterschied USB-Enpoint0 ob mit 32 oder 64Byte FIFO


von Zwille (Gast)


Lesenswert?

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!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Thomas (Gast)


Lesenswert?

>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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Zwille (Gast)


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Potter S. (potter68)


Lesenswert?

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
Noch kein Account? Hier anmelden.