Je répète le code pour un périphérique USB. Supposons que l'hôte USB commence un transfert de contrôle de contrôle pour lire certaines données de l'appareil et la quantité de données demandée (Wlength dans le paquet de configuration) est un multiple de la taille du point de terminaison 0 max. Ensuite, une fois que l'hôte a reçu toutes les données (sous la forme de plusieurs transactions avec des paquets de données de taille maximale), initiera-t-il une autre en transaction pour voir s'il y a plus de données, même s'il ne peut y avoir plus? P >
Voici un exemple de séquence d'événements que je m'interroge sur: p>
J'ai testé cela sur mon ordinateur (Windows Vista, s'il est important) et la réponse était Je pense que j'ai lu les parties pertinentes des spécifications USB 2.0 et USB 3.0 de USB.org mais je n'ai pas trouvé ce problème adressé. J'apprécierais que quelqu'un puisse me signaler à la droite de l'un ou l'autre de ces documents. P>
Je sais qu'un paquet de longueur zéro peut être nécessaire si l'appareil choisit d'envoyer moins de données que l'hôte demandé à Wlength. P>
Je sais que je pourrais rendre mon code suffisamment flexible pour gérer les deux cas, mais j'espère que je n'ai pas à. p>
Merci à tous ceux qui peuvent répondre à cette question! P>
4 Réponses :
Vous n'êtes pas obligé. (*) p>
L'ensemble du point de wlength est de dire à l'hôte le nombre maximum d'octets qu'il devrait tenter de lire (mais cela pourrait être lu moins!) P>
(*) J'ai vu des périphériques qui se bloque lorsque des demandes d'entrée / sortie ont été effectuées à un moment incorrect pendant les transferts de contrôle (lors du débogage de notre solution d'hôte). Donc, n'importe quel hôte faisant ce que vous êtes inquiet, voudriez-vous tuer ces appareils et que vous n'ayez espérons pas sur le marché. p>
Il n'est pas clair ce que l'on entend par "dire à l'hôte" - wlength code> est envoyé par l'hôte et non à l'hôte.
En général, USB utilise un paquet moins que maximum pour délimiter une fin de transfert. Donc, dans le cas d'un transfert qui est un multiple entier de longueur maximale de paquets, un ZLP est utilisé pour la démarcation. p>
Vous voyez beaucoup cela dans des tuyaux en vrac. Par exemple, si vous avez un transfert d'octets de 4096, qui sera divisé en un nombre entier de paquets de longueur maximale plus un paquet zéro-longueur. Si le pilote SW ait un tampon de réception suffisamment important, SW de niveau supérieur reçoit l'ensemble du transfert à la fois, lorsque le ZLP survient. P>
Les transferts de contrôle sont un cas particulier car ils ont le champ de lawthongthentique, le ZLP n'est donc pas strictement nécessaire. P>
Mais je suggère fortement que SW soit flexible aux deux, car vous pouvez voir des variations avec différents pilotes de silicium d'hôte USB ou de haut niveau HCD. P>
"ZLP n'est pas strictement nécessaire" - non, il pourrait être nécessaire dans la phase de données des demandes "Lecture de contrôle", car périphérique peut envoyer moins de données que spécifiées dans Wlength b> b> ( Par exemple, pour les descripteurs de périphérique 64 octets est demandé, mais seulement 18 octets transférés)
Lire soigneusement la spécification USB: p>
La phase de données d'un transfert de contrôle d'un point d'extrémité à l'hôte est terminée lorsque le point final fait l'un des ce qui suit: p>
Donc, dans votre cas, lorsque la taille de transfert de wltength ==, la réponse est non, vous n'avez pas besoin de ZLP. P>
Dans le cas Wlength> Taille du transfert, et (Taille de transfert% EP0 Taille) == 0 Réponse est oui, vous avez besoin de ZLP. P>
Est-ce hors de spécification d'envoyer le ZLP dans le premier cas, quand ce n'est pas nécessaire?
Je voudrais développer la réponse de MBR. Spécification USB 2.0 , à la section 5.5.3, explique: P>
La phase de données d'un transfert de contrôle d'un point de terminaison à l'hôte est Complétez lorsque le noeud final effectue l'une des opérations suivantes: p>
- a transféré exactement la quantité de données spécifiée pendant la phase de configuration li>
- transfère un paquet avec une taille de charge utile inférieure à WMAXPackSIser ou transfère un paquet de longueur zéro li> ul>
Lorsqu'une étape de données est terminée, le contrôleur hôte avance à la Étape de l'état au lieu de poursuivre avec une autre transaction de données. si le contrôleur hôte ne fait pas passer à la phase d'état lorsque le La phase de données est complète, le point final arrête le tuyau comme indiqué dans Section 5.3.2. Strong> Si une charge utile de données plus grande que prévu est reçue de le point final, le CRP pour le transfert de contrôle sera abandonné / retiré. p> blockQuote>
J'ai ajouté l'accent sur l'une des phrases de cette citation, car il semble de dire spécifiquement ce que le périphérique devrait faire: il devrait "arrêter" le tuyau si l'hôte tente de continuer la phase de données après sa fin. Fait si toutes les données demandées ont été transmises (c.-à-d. Le nombre d'octets transférés est supérieur ou égal à
wlength code>). Je pense que l'arrêt se désira d'envoyer un paquet de stalle. P>
En d'autres termes, le périphérique n'a pas besoin d'un paquet de longueur zéro dans cette situation et, en fait, la spécification USB indique qu'il ne faut pas en fournir une. P>
"Toutes les données demandées" doivent être corrigées à "toutes les données spécifiées dans wlength code>"
USB a des implémentations notoirement médiocres. Aide à la rendre plus robuste: être libéral dans ce que vous acceptez et conservateur dans ce que vous faites. Assurez-vous donc que votre appareil ne casse pas dans ce cas. Aucun hôte conforme ne se souciera de retourner un paquet vide sur une troisième demande.