Les Transferts de commande sont régulièrement utilisés pour les opérations de commande et d'état. Ils sont essentiels pour installer un appareil USB avec toutes les fonctions d'énumération qui seront exécutés en utilisant les Transferts de commande. Il surviennent généralement en paquets directs et par rafales qui sont initiés par l'hôte et utilisent le meilleur rendement de livraison. La longueur du paquet du Transfert de commande pour appareil basse vitesse doit être de 8 octets, les appareils pleine vitesse autorise une taille de paquet de 8, 16, 32 ou 64 octets et les appareils haute vitesse doivent avoir une taille de paquet de 64 octets. Un Transfert de commande peut avoir plus de 3 étapes.
|
![]() |
![]() |
L'étape de donées facultative consiste en un ou plusieurs transferts IN (Entrée) ou OUT (sorties). La demande d'installation indique la quantité de données qui doit être envoyée dans cette étape. Si elle dépasse la taille maximale du paquet, les données seront envoyées en plusieurs transferts, chacune ayant la longueur maximale du paquet à l'exception du dernier paquet. L'étape de données comporte 2 scénarios différents selon la direction du transfert de données. |
![]() |
![]() |
|
![]() |
![]() |
|
![]() |
![]() |
Transferts
de Commande: Le coeur du problème.
Maintenant, voyons comment tout cela s'accorde? Supposons par exemple que l'hôte veuille demander un descripteur d'appareil pendant l'énumération. Les paquets qui sont envoyés sont les suivants: L'hôte enverra un jeton d'installation disant à la fonction que le paquet suivant est un paquet d'installation. Le champ adresse fixera l'adresse de l'appareil à qui l'hôte a demandé le descripteur. Le numéro de la terminaison devrait être un zéro, indiquant une ligne défectueuse. L'hôte enverra alors un paquet DATA0. Celui-ci aura 8 octets de "charge utile" (payload) correspondant à la Demande de Descripteur d'Appareil comme souligné au chapitre 9 de la spécification USB. La fonction USB annoncera alors que le paquet d'installation a été lu correctement et sans aucune erreur. Si le paquet était reçu altéré, l'appareil ignorerait tout simplement ce paquet. L'hôte renverra alors le paquet après un court délai. |
1. Jeton d'installation |
|
|
|
|
|
|
Adresse & N° de terminaison |
2.Paquet DATA0 |
|
|
|
|
|
Demande de Descripteur d'Appareil | |
3. Poignée de mains ACK |
|
|
|
L'appareil valide le paquet d'installation |
Les 3 paquets ci-dessus représentent la première transaction USB. L'appareil USB décodera maintenant les 8 octets reçus, et déterminera que c'était une demande de Descripteur d'Appareil. L'Appareil tentera d'envoyer le Descripteur d'Appareil, qui sera la transaction USB suivante. |
1. Jeton IN |
|
|
|
|
|
|
Adresse & N° de terminaison |
2. Paquet DATA0 |
|
|
|
|
|
Les 8 premiers octets du Descripteur d'Appareil | |
3. Poignée de mains ACK |
|
|
|
L'hôte valide le paquet |
1. Jeton IN |
|
|
|
|
|
|
Adresse & N° de terminaison |
2. Paquet DATA1 |
|
|
|
|
|
Les 4 derniers octets + du remplissage | |
3. Poignée de mains ACK |
|
|
|
L'hôte valide le paquet |
Dans ce cas nous assumons que la taille maximale de "charge utile" (payload) est de 8 octets. L'hôte envoie le jeton IN, disant à l'Appareil qu'il peut maintenant envoyer des données pour cette terminaison. Comme la taille maximale du paquet est de 8 octets, nous devons scinder les 12 octets du Descripteur d'Appareil en morceaux avant de pouvoir les envoyer. Chaque morceau doit être de 8 octets excepté la dernière transaction. L'hôte validera chaque paquet de données que nous lui enverrons. Une fois que le Descripteur d'Appareil est envoyé, il s'ensuit une transaction d'état. Pour le cas où les transactions seraient réussies, l'hôte enverra un paquet de longueur Nul indiquant que l'ensemble de transactions était correct. La fonction répond alors à ce paquet de longueur Nul indiquant son état. |
1. Jeton OUT |
|
|
|
|
|
|
Adresse & N° de terminaison |
2. Paquet DATA0 |
|
|
|
|
|
Paquet de longueur Nul | |
3. Poignée de mains ACK |
|
|
|
L'appareil valide la transaction entière |
![]() |
![]() |
Le diagramme ci-dessus montre le format d'une transaction d'interruption d'entrée IN et d'interruption de sortie OUT. IN: L'hôte interrogera périodiquement la terminaison d'interruption. Le taux d'interrogation est spécifié dans le descripteur de terminaison qui sera examiné plus tard. Chaque interrogation obligera l'hôte à envoyer un jeton IN. Si le jeton IN est altéré, la fonction ignore le paquet et continue la surveillance du Bus pour de nouveaux jetons. Si une interruption a été mise en attente par l'appareil, la fonction enverra un paquet Data contenant des données ayant rapport à l'interruption quand il recevra le jeton IN. Sur des réceptions au niveau de l'hôte, celui-ci retournera un ACK. Toutefois si les données sont altérées, l'hôte ne mentionnera aucun état. Si, d'autre part, une condition d'interruption n'était pas présente quand l'hôte interrogeait la terminaison d'interruption avec un jeton IN, alors la fonction signale cet état en envoyant un NAK. Si une erreur se produisait sur cette terminaison, un STALL (Bloqué) serait envoyé en réponse à un jeton IN. OUT: Quand l'hôte veut envoyer à l'appareil les données d'interruptions, il émet un jeton OUT suivi par un paquet Data contenant les données d'interruption. Si une partie du jeton OUT ou du paquet Data est altéré alors la fonction ignore le paquet. Si le tampon de terminaison de la fonction était vide et qu'il ait cadencé les données dans le tampon de terminaison il émettrait un ACK prévenant l'hôte qu'il a reçu correctement les données. Si le tampon de terminaison n'est pas vide à cause du traitement d'un paquet précédent, alors la fonction retourne un NAK. Toutefois si une erreur se produisait à cause de la terminaison et que son bit d'arrêt (Halt ) ait été positionné, elle renverrait un STALL (Bloqué). Transferts Isochrones Les Transferts Isochrones se produisent continuellement et périodiquement. Ils contiennent généralement des informations à durée de vie critique, tel des trains de données audio ou vidéo. S'il y avait un retard ou une reprise de données dans un flot de données audio, alors on pourrait s'attendre à de l'audio par intermittence contenant des signaux transitoires. Le battement (rythme) ne serait plus synchronisé. Toutefois si un paquet ou une trame se perdait, il est vraisemblable que l'auditeur ne le remarquerait même pas. Les transferts Isochrones fournissent.
|
![]() |
![]() |
Le diagramme ci-dessus montre le format d'une transaction Isochrone IN et OUT. Les transactions Isochrones n'ont pas d'étape de poignée de mains et ne peuvent pas rendre compte des erreurs ou des conditions STALL / HALT ( (Bloqué) / Arrêt ). Les Transferts en Bloc peuvent être utilisés pour de grandes quantités de données sporadiques. De tels exemples pourraient inclure un travail d'impression envoyé à une imprimante ou une image provenant d'un scanner. Les Transferts en Bloc se prémunissent de correction d'erreurs sous la forme d'un champ CRC16 sur les données " charge utile " et sur les mécanismes de détection et de retransmission d'erreurs qui assure la transmission et la réception de données de manière infaillible. Les Transferts en Bloc utiliseront une bande passante de réserve non attribuée sur le Bus après que toutes les autres transactions aient été allouées. Si le Bus est occupé avec de l'Isochrone et/ou de l'interruption, les données en bloc peuvent alors s'écouler doucement sur le Bus. En conséquence, les transferts en bloc devraient seulement être utilisés pour des communications insensibles au temps du fait de la non garantie du temps d'attente. Les Transferts en Bloc.
|
![]() |
![]() |
Le diagramme ci-dessus montre le format d'une transaction en Bloc IN et OUT. IN: Quand l'hôte est prêt à recevoir des données en Bloc, il émet un jeton IN. Si la fonction reçoit le jeton IN avec une erreur, il ignore le paquet. Si le jeton est reçu correctement, la fonction peut soit répondre avec un paquet DATA contenant les données en Bloc à envoyer ou bien un paquet Stall signalant que la terminaison a eu une erreur ou un paquet NACK signalant à l'hôte que la terminaison travaille, mais provisoirement n'a pas de données à envoyer. OUT: Quand l'hôte veut envoyer à la fonction un paquet de données en Bloc, il émet un jeton OUT suivi par un paquet DATA contenant les données en Bloc. Si une partie du jeton OUT ou du paquet DATA est altérée, alors la fonction ignore le paquet. Si le tampon de terminaison de la fonction est vide et qu'il a cadencé les données dans le tampon de terminaison, il émet un ACK prévenant l'hôte qu'il a reçu correctement les données. Si le tampon de terminaison n'est pas vide à cause du traitement d'un paquet précédent, alors la fonction retourne un NAK. Toutefois si la terminaison a eu une erreur et que son bit d'arrêt a été positionné, elle retourne un Stall (Bloqué). L'hôte est responsable de la bande passante du Bus. Elle est faîte par l'énumération (dénombrement) lors de la configuration des terminaisons Isochrones et d'interruptions et durant le fonctionnement du Bus. La spécification place des limites sur le Bus, l'autorisant à allouer plus de 90% pour des transferts périodiques (Interruption et Isochrone) sur un Bus pleine vitesse. Sur des Bus hautes vitesses, cette limitation se réduit à moins de 80% d'une micro-trame qui peut être allouée pour des transferts périodiques. Aussi vous pouvez assez rapidement voir que si vous avez un Bus hautement saturé avec des transferts périodiques, les 10% restants sont laissés pour les transferts de contrôle et une fois qu'ils ont été attribués, les transferts en Bloc prendront ce qui reste. |
Ce document vous a plu, alors il est possible de le
télécharger au format PDF CHAPITRE
4 ![]()
|
![]() Accueil |
![]() Sommaire |
![]() |