USB bulk transfer completion

OP #5231157
Lesenswert?
• ▲
▼
Hallo,
ich habe das mal in einen getrennten thread gepackt, die andere Frage 
bezieht sich auf Probleme mit der synchronen API.

Meine jetzige Frage:
Ich verwende die asynchrone API der libusb. Dazu starte ich einen 
Transfer und reagiere in der mitgelieferten Callback auf das Ende der 
Übertragung.

Ich frage den Status "LIBUSB_TRANSFER_COMPLETED" ab, um zu prüfen, ob 
der Transfer fetig ist.

Mich wundert etwas die Folgende Notiz: "Note that this does not indicate 
that the entire amount of requested data was transferred."

Ich frage mich deswegen, wann weiss ich eigentlich, wann der bulk 
transfer zu Ende ist?

Folgendes habe ich gefunden:
-The endpoint transfers exactly the amount of data expected.
-The endpoint transfers a short packet, that is a packet with a payload 
size less than the maximum.
-The endpoint transfers a zero-length packet.

Was heißt jetzt aber "exactly the amount of data expected". Wo wird das 
im USB-transfer mit gegeben, wie viele Daten man erwartet? Ich kannte 
bisher nur Fall 2. und 3., also entweder ein short Paket oder ein 
zero-length Paket, mit dem das Device dem Host mitteilen kann, dass nun 
keine Daten mehr kommen.

Viele Grüße
#5231331
Lesenswert?
• ▲
▼
A. C. schrieb:
> Wo wird das im USB-transfer mit gegeben, wie viele Daten man erwartet?
1
struct libusb_transfer {
2
  ...
3
  /** Length of the data buffer */
4
  int length;

Das funktioniert nur, wenn deine Software weiß, wie groß der Transfer 
sein wird.

Am besten hast du eine Pipeline mit mehreren Transfers, deren Länge 
jeweils ein Vielfaches der USB-Paketgröße (64 oder 512 Bytes) ist.
#5231436
Lesenswert?
• ▲
▼
A. C. schrieb:
> Mich wundert etwas die Folgende Notiz: "Note that this does not indicate
> that the entire amount of requested data was transferred."

Das bezieht sich auf das short-packet vom Device, das den Transfer 
abbricht. Das kann bei einer Pipe-Size von 64 entweder <64 sein oder 
falls es genau aufgeht, eben noch eins mit 0. Auf USB-Ebene gibt es eben 
keine Ankündigung der Länge vom Host aus, damit wird das 
short/zero-packet zum Endemarker. Die Länge in der Struct dient nur der 
Allozierung der DMA-Transfer-Deskriptoren. Die short/zero-packets 
beendet den gesamten gequeuten Transfer, auch wenn da eigentlich mehr 
erwartet wurde. Die Beendigung (normal oder abnormal) wird vom 
Host-Controller im DMA-Deskriptor vermerkt und triggert dann den 
Callback.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 8 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.