estructura _URB_ISOCH_TRANSFER (usb.h)
Los controladores de cliente USB usan la estructura _URB_ISOCH_TRANSFER para enviar o recuperar datos de una canalización de transferencia isócrónica.
Sintaxis
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];
};
Miembros
Hdr
Puntero a una estructura _URB_HEADER que especifica la información del encabezado URB. Hdr.Function debe ser URB_FUNCTION_ISOCH_TRANSFER y Hdr.Length debe ser el tamaño de esta estructura de datos de longitud variable.
PipeHandle
Especifica un identificador opaco para la canalización isócrónica. El controlador del controlador de host devuelve este identificador cuando el controlador cliente selecciona la configuración del dispositivo con un URB de tipo URB_FUNCTION_SELECT_CONFIGURATION o cuando el controlador cliente cambia la configuración de una interfaz con un URB de tipo URB_FUNCTION_SELECT_INTERFACE.
TransferFlags
Especifica cero, uno o una combinación de las marcas siguientes:
TransferBufferLength
Especifica la longitud, en bytes, del búfer especificado en TransferBuffer o descrito en TransferBufferMDL. El controlador del controlador de host devuelve el número de bytes que se envían o leen desde la canalización de este miembro.
TransferBuffer
Un puntero a un búfer residente para la transferencia es NULL si se proporciona un MDL en TransferBufferMDL. El contenido de este búfer depende del valor de TransferFlags. Si se especifica USBD_TRANSFER_DIRECTION_IN, este búfer contendrá datos leídos del dispositivo a cambio del controlador del host. De lo contrario, este búfer contiene datos proporcionados por el controlador para la transferencia al dispositivo.
TransferBufferMDL
Un puntero a un MDL que describe un búfer residente es NULL si se proporciona un búfer en TransferBuffer. El contenido del búfer depende del valor de TransferFlags. Si se especifica USBD_TRANSFER_DIRECTION_IN, el búfer descrito contendrá datos leídos del dispositivo a cambio del controlador del host. De lo contrario, el búfer contiene datos proporcionados por el controlador para la transferencia al dispositivo. Este MDL debe asignarse desde un grupo no paginado.
UrbLink
Reservado. No utilizar.
hca
Reservado. No utilizar.
StartFrame
Especifica el número de fotograma en el que debe comenzar la transferencia. Esta variable debe estar dentro de un intervalo definido por el sistema del marco actual. El intervalo se especifica mediante la constante USBD_ISO_START_FRAME_RANGE.
Si START_ISO_TRANSFER_ASAP se establece en TransferFlags, este miembro contiene el número de fotograma en el que comenzó la transferencia, cuando el controlador del controlador del host devuelve la solicitud. De lo contrario, este miembro debe contener el número de fotograma en el que comienza esta transferencia.
NumberOfPackets
Especifica el número de paquetes descritos por el miembro de matriz de longitud variable IsoPacket.
ErrorCount
Contiene el número de paquetes que se completaron con una condición de error al devolver desde el controlador del controlador del host.
IsoPacket[1]
Contiene una matriz de longitud variable de USBD_ISO_PACKET_DESCRIPTOR estructuras que describen los paquetes de transferencia isócronos que se van a transferir en el bus USB. Para obtener más información sobre este miembro, vea la sección Comentarios.
Comentarios
El controlador de bus USB siempre devuelve un valor de USBD_STATUS_SUCCESS en Hdr.Status, a menos que todos los paquetes de la transferencia generaron un error o la solicitud no estaba bien formada y no se pudo ejecutar en absoluto. En la tabla siguiente se incluyen los posibles códigos de error devueltos en Hdr.Status.
Valor de error | Significado |
---|---|
USBD_STATUS_ISOCH_REQUEST_FAILED | Indica que cada paquete de una solicitud isócrónica se completó con errores. |
USBD_STATUS_BAD_START_FRAME | Indica que el marco de inicio solicitado no está dentro de USBD_ISO_START_FRAME_RANGE del marco USB actual. |
USBD_ISO_NOT_ACCESSED_LATE | Indica que cada paquete se envió demasiado tarde para que se envíe el paquete, en función del marco de inicio solicitado. |
USBD_STATUS_INVALID_PARAMETER | Indica que uno de los parámetros URB era incorrecto. |
Antes de que el controlador de host envíe una solicitud isócrónica a un dispositivo USB, requiere información sobre el punto de conexión del dispositivo al que debe enviar o recibir datos. Esta información se almacena en descriptores de punto de conexión (USB_ENDPOINT_DESCRIPTOR) que se recuperan del descriptor de configuración seleccionado. Una vez que el controlador de bus obtiene el descriptor del punto de conexión, crea una canalización de transferencia isócrónica para configurar la transferencia de datos. Los atributos de la canalización se almacenan en la estructura USBD_PIPE_INFORMATION . En el caso de las transferencias isócrónicas, los miembros se establecen de la siguiente manera:
- El miembro PipeType especifica el tipo de transferencia y se establece en UsbdPipeTypeIsochronous.
- El miembro MaximumPacketSize especifica la cantidad de datos, en bytes, que constituye un paquete. Para las transferencias isócrónicas, el tamaño del paquete es fijo y puede ser un valor comprendido entre 0 y 1024. El tamaño del paquete es igual o es menor que el valor wMaxPacketSize del descriptor de punto de conexión.
- El miembro Interval se deriva del valor bInterval del descriptor de punto de conexión. Este valor se usa para calcular el período de sondeo que indica la frecuencia con la que se envían los datos en el bus. Para dispositivos de velocidad completa, el período se mide en unidades de 1 milisegundos; para dispositivos de alta velocidad, el período se mide en microframes.
Para dispositivos de velocidad completa, solo se puede transferir un paquete dentro de un marco; bits 12.. 11 están reservados y se establecen en cero.
En el caso de los dispositivos de alta velocidad, los datos se pueden transferir en un solo paquete o pueden abarcar varios paquetes, dentro de un microframe.
Si los bits 12.. 11 se establecen en n, puede transferir (n+1)*MaximumPacketSize
bytes por microframe. Los bits 12.. 11 establecidos en cero indican que solo se puede transferir un paquete en un microframe. Si los bits 12.. 11 se establecen en 1, el controlador de host puede transferir dos paquetes en un microframe.
El miembro IsoPacket de _URB_ISOCH_TRANSFER es una matriz de USBD_ISO_PACKET_DESCRIPTOR que describe el diseño del búfer de transferencia. Cada elemento de la matriz se correlaciona con los datos transferidos en un microframe. Si IsoPacket tiene n elementos, el controlador de host transfiere n marcos (para dispositivos de velocidad completa) o microframes (para dispositivos de alta velocidad) para transferir datos. IsoPacket[i]. El miembro offset se usa para realizar un seguimiento de la cantidad de datos que se van a enviar o recibir. Esto se hace estableciendo un desplazamiento de bytes desde el principio del búfer de transferencia completo para la solicitud.
Por ejemplo, hay cinco microframes disponibles para transferir paquetes de tamaño de 1024 bytes.
Si los bits 12.. 11 se establecen en cero (lo que indica un único paquete por transferencia de microframe), IsoPacket contiene las siguientes entradas:
Microframe 1 IsoPacket.Element[0].Offset = 0
(dirección de inicio)
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 los bits 12.. 11 se establecen en 1 (lo que indica dos paquetes por microframe), IsoPacket contiene las siguientes entradas:
Microframe 1 IsoPacket.Element[0].Offset = 0
(dirección de inicio)
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
Nota Para varios paquetes, el valor de desplazamiento indica los tamaños de todos los paquetes del microframe.
IsoPacket[i]. El controlador host actualiza el miembro length para indicar el número real de bytes que se reciben del dispositivo para las transferencias IN isócrónicas. IsoPacket[i]. La longitud no se usa para las transferencias OUT isócrónicas.
Los controladores pueden usar la macro GET_ISO_URB_SIZE para determinar el tamaño necesario para contener todo el URB. Si la longitud es demasiado pequeña para rellenar el espacio reservado para este paquete, el controlador de bus deja un espacio desde el final de los datos recuperados hasta el desplazamiento del siguiente paquete. El controlador de bus no ajustará los desplazamientos para evitar perder espacio de búfer.
Los miembros TransferBuffer o TransferBufferMDL deben especificar un búfer prácticamente contiguo.
Trate a otros miembros que forman parte de esta estructura, pero que no se describen aquí como opacos. Están reservados para uso del sistema.
Requisitos
Requisito | Valor |
---|---|
Header | usb.h (incluye Usb.h) |