Forum: Compiler & IDEs USB Endpoint mit nur 8 Bytes?


von Armin Feucht (Gast)


Lesenswert?

Servus,

ich programmiere gerade eine USB-Anwendung mit dem Atmel AT90USB1287. 
Die Anwendung basiert auf dem Demo-Programm usb_hid von Atmel. Dieses 
Demoprogramm hat für beide Endpoints (In & Out) 8 Bytes als maximale 
Länge. Für meine Anwendung benötige ich aber mehr. Es ist dokumentiert, 
dass man in der Datei usb_descriptor.h nur zwei Defines ändern muss. Ich 
habe für Out 50 und für In 34 eingetragen. Beides wird im PC richtig 
angezeigt, wenn ich mir die Deskriptoren des Geräts ausgeben lass. Es 
klappt auch einwandfrei, dem Gerät 50 Bytes zu schicken, nur als Antwort 
bekomm ich maximal 8 Bytes.

Testweise schicke ich gerade die Anzahl an Bytes in der FIFO-Schlange 
raus. Wenn alles gehen würde, sollte 34 1 2 3 4 ... 31 32 33 rauskommen. 
Die FIFO lässt aber irgendwie nur 8 Bytes zu und es kommt 8 1 2 3 4 5 6 
7 raus. Der erste Wert (8) wurde beim Senden des 34. Bytes gesetzt. Da 
dieser Wert 8 ist und nicht 34, verstehe ich darunter, dass die FIFO nur 
bis 8 hochzählt und die weiteren Werte ignoriert. EP_IN_LENGTH wurde 
aber als 34 definiert, was auch der PC so anzeigt.
Beim Out-Endpoint klappt es ohne Probleme, ich verstehe nicht, warum es 
beim In-Endpoint nicht klappt.

Das Gerät ist im Fullspeed-Modus. Es sollten also in beide Richtungen 64 
Bytes möglich sein.

Hat jemand zufällig Erfahrung mit Endpoints größer als 8 Bytes? Welcher 
Wert könnte noch falsch gesetzt sein, so dass zwar der Deskriptor 
richtig ist, aber die FIFO nicht mehr zulässt.



Das ist meine aktuelle Testroutine, deren Ergebnis ich oben beschrieben 
hab:

uint8_t counter = 0;

void hid_task(void) {
    Usb_select_endpoint(EP_HID_IN);
    if(Is_usb_write_enabled()) {
  uint8_t i;
  for (i=0; i < EP_IN_LENGTH; i++) {
    Usb_write_byte(counter);
    counter = Usb_byte_counter_8();
  }
  Usb_ack_in_ready();
    }
}

von Josef P. (ngc1232)


Lesenswert?

Hallo Armin,

keine Ahnung, ob Du hier noch mitließt, aber wenn ja: hat sich Dein 
Problem mitlerweile erledigt? Ich habe nämlich exakt das selbe und wäre 
über einen Tipp froh...

CS

Josef
www.cAPELLA-OBSERVATORY:COM

von Armin Feucht (Gast)


Lesenswert?

Hab erst jetzt wieder reingeguckt. Das Problem, wie es hier beschrieben 
ist, hab ich nicht gelöst. Ich habe es aber umgangen. Die 8-Bytes sind 
beim In- und Out-Endpoint. Daher habe ich jetzt die Kommunikation auf 
8-Bytes pro Transfer begrenzt und eine Art Protokoll draufgesetzt. Einer 
Methode übergeb ich einen Pointer und die Länge in Bytes. Diese Methode 
sendet dann einen oder mehrere Transfers. Im 1. Byte steht, ob noch mehr 
kommt:
0..EP_SIZE-1 = Anzahl gültiger Bytes + Info letzter Transfer
EP_SIZE..255 = Paket ist voll und es kommen noch weitere Transfers

Wenn du Interesse an Codebeispielen hast, kannst dich mal unter 
armin.feucht@web.de oder ICQ 103172172 melden. Dann kann ich dir was 
zuschicken. Weiß nicht, wann ich hier wieder reinguck. Das war jetzt nur 
wegen einem anderen Projekt.

von Josef P. (ngc1232)


Lesenswert?

Hallo Armin,


Nach längerem Forschen habe ich das Problem selbst gelöst. Das gemeine 
war, dass zwei Stellen gleichzeitig zu ändern sind, um die Buffergröße 
für den Datentransfer über USB zu verändern.
Die erste und einsichtige Stelle ist die Definition der End-Punkte (in 
den Demo-Sourcen von Atmel ist das im File „usb_discriptors.h“, und da 
das define von EP_(IN|OUT)_LENGTH[_n]. Diese Stelle war offensichtlich 
und sie muss ja auch zu der enstprechenden USB-Hostsoftware passen. Dass 
aber trotz einer dort eingestellten Länge von z.B. 32 Bytes immer nur 
8-Byte-Pakete verschickt werden, liegt an der Einstellung der 
EPSIZE2:0-(Endpoint Size)–Bits im UECFG1X-Registers des AT90USB.  Das 
passiert in den Demos von Atmel mit Hilfe der Funktion 
usb_user_endpoint_init in usb_specific_request.c. Dort steht als vierter 
Parameter der Funktion (besser des Makros) usb_configure_endpoint halt 
SIZE_8 und nicht SIZE_32. Ändern des entsprechenden Wertes und voila: 
Der Buffer fasst 32 Bytes und alles arbeitet so, wie gedacht…
Irgendwie hätten die Jungs von Atmel da bei der Endpoint-Definition 
schon mal einen entsprechenden Kommentar hinschreiben können :-(

Na ja, vielleicht hilft Dir das Wissen ja im Nachhinein oder außer uns 
beiden stolpert noch jemand über dieses Problem.

CS

Josef
www.capella-observatory.com

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.