Compartir a través de


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:

Valor Significado
USBD_TRANSFER_DIRECTION_IN
Se establece para solicitar datos desde un dispositivo. Para transferir datos a un dispositivo, esta marca debe estar desactivada.
USBD_SHORT_TRANSFER_OK
Se establece para dirigir al controlador de host que no devuelva un error cuando recibe un paquete del dispositivo que es más corto que el tamaño máximo del paquete para el punto de conexión. Esta marca no tiene ningún efecto en una canalización isócrónica, porque el controlador de autobús no devuelve un error cuando recibe paquetes cortos en una tubería isócrónica.
USBD_START_ISO_TRANSFER_ASAP
Hace que la transferencia comience en el siguiente marco, si no se han enviado transferencias a la tubería desde que la tubería se abrió o se restableció por última vez. De lo contrario, la transferencia comienza en el primer fotograma que sigue todas las solicitudes actualmente en cola para la canalización. El marco real en el que comienza la transferencia se ajustará para la latencia de bus por parte del controlador del controlador host.

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.
El controlador de host también determina la cantidad de datos que se pueden transferir (dentro de un marco o un microframe) según el tipo de dispositivo. Esta información está disponible en bits 12.. 11 de wMaxPacketSize en el descriptor del punto de conexión.

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)

Consulte también

Cómo transferir datos a puntos de conexión isócronos USB

URB

Estructuras USB

USBD_ISO_PACKET_DESCRIPTOR

USBD_IsochUrbAllocate

_URB_HEADER