Gast
#617410
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();
}
}