structure _URB_ISOCH_TRANSFER (usb.h)
La structure _URB_ISOCH_TRANSFER est utilisée par les pilotes clients USB pour envoyer ou récupérer des données à partir d’un canal de transfert isochroneuse.
Syntaxe
struct _URB_ISOCH_TRANSFER {
struct _URB_HEADER Hdr;
USBD_PIPE_HANDLE PipeHandle;
ULONG TransferFlags;
ULONG TransferBufferLength;
PVOID TransferBuffer;
PMDL TransferBufferMDL;
struct _URB *UrbLink;
struct _URB_HCD_AREA hca;
ULONG StartFrame;
ULONG NumberOfPackets;
ULONG ErrorCount;
USBD_ISO_PACKET_DESCRIPTOR IsoPacket[1];
};
Membres
Hdr
Pointeur vers une structure de _URB_HEADER qui spécifie les informations d’en-tête URB. Hdr.Function doit être URB_FUNCTION_ISOCH_TRANSFER, et Hdr.Length doit être de la taille de cette structure de données de longueur variable.
PipeHandle
Spécifie une poignée opaque pour le canal isochroque. Le pilote du contrôleur hôte retourne ce handle quand le pilote client sélectionne la configuration du périphérique avec un URB de type URB_FUNCTION_SELECT_CONFIGURATION ou quand le pilote client modifie les paramètres d’une interface avec une interface URB de type URB_FUNCTION_SELECT_INTERFACE.
TransferFlags
Spécifie zéro, un ou une combinaison des indicateurs suivants :
TransferBufferLength
Spécifie la longueur, en octets, de la mémoire tampon spécifiée dans TransferBuffer ou décrite dans TransferBufferMDL. Le pilote du contrôleur hôte retourne le nombre d’octets envoyés ou lus à partir du canal dans ce membre.
TransferBuffer
Un pointeur vers une mémoire tampon résidente pour le transfert est NULL si une MDL est fournie dans TransferBufferMDL. Le contenu de cette mémoire tampon dépend de la valeur de TransferFlags. Si USBD_TRANSFER_DIRECTION_IN est spécifié, cette mémoire tampon contient des données lues à partir de l’appareil au retour du pilote du contrôleur hôte. Sinon, cette mémoire tampon contient des données fournies par le pilote à transférer vers l’appareil.
TransferBufferMDL
Un pointeur vers une MDL qui décrit une mémoire tampon résidente est NULL si une mémoire tampon est fournie dans TransferBuffer. Le contenu de la mémoire tampon dépend de la valeur de TransferFlags. Si USBD_TRANSFER_DIRECTION_IN est spécifié, la mémoire tampon décrite contient des données lues à partir de l’appareil au retour du pilote du contrôleur hôte. Sinon, la mémoire tampon contient des données fournies par le pilote à transférer vers l’appareil. Cette MDL doit être allouée à partir d’un pool non paginé.
UrbLink
Réservé. Ne pas utiliser.
hca
Réservé. Ne pas utiliser.
StartFrame
Spécifie le numéro de trame sur lequel le transfert doit commencer. Cette variable doit se trouver dans une plage définie par le système de l’image actuelle. La plage est spécifiée par la constante USBD_ISO_START_FRAME_RANGE.
Si START_ISO_TRANSFER_ASAP est défini dans TransferFlags, ce membre contient le numéro de trame sur lequel le transfert a commencé, lorsque la demande est retournée par le pilote du contrôleur hôte. Sinon, ce membre doit contenir le numéro de trame sur lequel ce transfert commence.
NumberOfPackets
Spécifie le nombre de paquets décrits par le membre de tableau de longueur variable IsoPacket.
ErrorCount
Contient le nombre de paquets qui se sont terminés avec une condition d’erreur au retour à partir du pilote du contrôleur hôte.
IsoPacket[1]
Contient un tableau de longueur variable de structures USBD_ISO_PACKET_DESCRIPTOR qui décrivent les paquets de transfert isochroneuses à transférer sur le bus USB. Pour plus d’informations sur ce membre, consultez la section Remarques.
Remarques
Le pilote de bus USB retourne toujours une valeur de USBD_STATUS_SUCCESS dans Hdr.Status, sauf si chaque paquet du transfert a généré une erreur ou si la demande n’a pas été correctement formée et n’a pas pu être exécutée du tout. Le tableau suivant inclut les codes d’erreur possibles retournés dans Hdr.Status.
Valeur d’erreur | Signification |
---|---|
USBD_STATUS_ISOCH_REQUEST_FAILED | Indique que chaque paquet d’une requête isochroneuse a été terminé avec des erreurs. |
USBD_STATUS_BAD_START_FRAME | Indique que le frame de début demandé n’est pas dans USBD_ISO_START_FRAME_RANGE du frame USB actuel. |
USBD_ISO_NOT_ACCESSED_LATE | Indique que chaque paquet a été envoyé trop tard pour que le paquet soit envoyé, en fonction du frame de début demandé. |
USBD_STATUS_INVALID_PARAMETER | Indique que l’un des paramètres URB était incorrect. |
Avant que le contrôleur hôte envoie une requête isochroneuse à un périphérique USB, il nécessite des informations sur le point de terminaison de l’appareil auquel il doit envoyer ou recevoir des données. Ces informations sont stockées dans des descripteurs de point de terminaison (USB_ENDPOINT_DESCRIPTOR) qui sont récupérés à partir du descripteur de configuration sélectionné. Une fois que le pilote de bus obtient le descripteur de point de terminaison, il crée un canal de transfert isochroque pour configurer le transfert de données. Les attributs du canal sont stockés dans la structure USBD_PIPE_INFORMATION . Pour les transferts isochrones, les membres sont définis comme suit :
- Le membre PipeType spécifie le type de transfert et est défini sur UsbdPipeTypeIsochronous.
- Le membre MaximumPacketSize spécifie la quantité de données, en octets, qui constitue un paquet. Pour les transferts isochrone, la taille du paquet est fixe et peut être une valeur comprise entre 0 et 1024. La taille du paquet est égale ou inférieure à la valeur wMaxPacketSize du descripteur de point de terminaison.
- Le membre Interval est dérivé de la valeur bInterval du descripteur de point de terminaison. Cette valeur est utilisée pour calculer la période d’interrogation qui indique la fréquence à laquelle les données sont envoyées sur le bus. Pour les appareils à pleine vitesse, la période est mesurée en unités d’images de 1 milliseconde ; pour les appareils à grande vitesse, la période est mesurée en microframes.
Pour les appareils à pleine vitesse, un seul paquet peut être transféré dans un cadre ; les bits 12.. 11 sont réservés et définis sur zéro.
Pour les appareils à haut débit, les données peuvent être transférées en un seul paquet ou peuvent s’étendre sur plusieurs paquets, au sein d’un microframe.
Si les bits 12.. 11 sont définis sur n, vous pouvez transférer (n+1)*MaximumPacketSize
des octets par microframe. Les bits 12.. 11 définis sur zéro indiquent qu’un seul paquet peut être transféré dans un microframe. Si les bits 12.. 11 sont définis sur 1, le contrôleur hôte peut transférer deux paquets dans un microframe.
Le membre IsoPacket de _URB_ISOCH_TRANSFER est un tableau de USBD_ISO_PACKET_DESCRIPTOR qui décrit la disposition de la mémoire tampon de transfert. Chaque élément du tableau est corrélé aux données transférées dans un microframe. Si IsoPacket a n éléments, les transferts du contrôleur hôte utilisent n frames (pour les appareils à pleine vitesse) ou des microframes (pour les appareils haute vitesse) pour transférer des données. IsoPacket[i]. Le membre offset est utilisé pour suivre la quantité de données à envoyer ou à recevoir. Pour ce faire, définissez un décalage d’octets à partir du début de la mémoire tampon de transfert entière pour la requête.
Par exemple, cinq microframes sont disponibles pour transférer des paquets de 1 024 octets.
Si les bits 12.. 11 sont définis sur zéro (indiquant un paquet unique par transfert de microframe), IsoPacket contient les entrées suivantes :
Microframe 1 IsoPacket.Element[0].Offset = 0
(adresse de début)
Microframe 2 IsoPacket.Element[1].Offset = 1024
Microframe 3 IsoPacket.Element[2].Offset = 2048
Microframe 4 IsoPacket.Element[3].Offset = 3072
Microframe 5 IsoPacket.Element[4].Offset = 4096
Si les bits 12.. 11 sont définis sur 1 (indiquant deux paquets par microframe), IsoPacket contient les entrées suivantes :
Microframe 1 IsoPacket.Element[0].Offset = 0
(adresse de début)
Microframe 2 IsoPacket.Element[1].Offset = 2048
Microframe 3 IsoPacket.Element[2].Offset = 4096
Microframe 4 IsoPacket.Element[3].Offset = 6144
Microframe 5 IsoPacket.Element[4].Offset = 8192
Note Pour plusieurs paquets, la valeur de décalage indique la taille de tous les paquets au sein du microframe.
IsoPacket[i]. Le membre de longueur est mis à jour par le contrôleur hôte pour indiquer le nombre réel d’octets reçus de l’appareil pour les transferts IN isochrones. IsoPacket[i]. La longueur n’est pas utilisée pour les transferts OUT isochronous.
Les pilotes peuvent utiliser la macro GET_ISO_URB_SIZE pour déterminer la taille nécessaire pour contenir l’intégralité de l’URB. Si la longueur est trop petite pour remplir l’espace réservé à ce paquet, le pilote de bus laisse un espace entre la fin des données récupérées et le décalage du paquet suivant. Le pilote de bus n’ajuste pas les décalages pour éviter de gaspiller l’espace tampon.
Les membres TransferBuffer ou TransferBufferMDL doivent spécifier une mémoire tampon pratiquement contiguë.
Traitez les autres membres qui font partie de cette structure, mais qui ne sont pas décrits ici comme opaques. Ils sont réservés à l’utilisation du système.
Configuration requise
Condition requise | Valeur |
---|---|
En-tête | usb.h (incluez Usb.h) |
Voir aussi
Guide pratique pour transférer des données vers des points de terminaison isochroux USB