_URB_ISOCH_TRANSFER struttura (usb.h)
La struttura _URB_ISOCH_TRANSFER viene usata dai driver client USB per inviare dati a o recuperare dati da una pipe di trasferimento isochronous.
Sintassi
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];
};
Members
Hdr
Puntatore a una struttura di _URB_HEADER che specifica le informazioni sull'intestazione DI CONTROLLO. Hdr.Function deve essere URB_FUNCTION_ISOCH_TRANSFER e Hdr.Length deve essere la dimensione di questa struttura di dati a lunghezza variabile.
PipeHandle
Specifica un handle opaco per la pipe isochronous. Il driver del controller host restituisce questo handle quando il driver client seleziona la configurazione del dispositivo con un URB_FUNCTION_SELECT_CONFIGURATION di tipo o quando il driver client modifica le impostazioni per un'interfaccia con un'interfaccia di tipo URB_FUNCTION_SELECT_INTERFACE.
TransferFlags
Specifica zero, uno o una combinazione dei flag seguenti:
TransferBufferLength
Specifica la lunghezza, in byte, del buffer specificato in TransferBuffer o descritto in TransferBufferMDL. Il driver del controller host restituisce il numero di byte inviati o letti dalla pipe in questo membro.
TransferBuffer
Un puntatore a un buffer residente per il trasferimento è NULL se viene fornito un MDL in TransferBufferMDL. Il contenuto di questo buffer dipende dal valore di TransferFlags. Se viene specificato USBD_TRANSFER_DIRECTION_IN, questo buffer conterrà i dati letti dal dispositivo restituito dal driver del controller host. In caso contrario, questo buffer contiene dati forniti dal driver per il trasferimento nel dispositivo.
TransferBufferMDL
Un puntatore a un MDL che descrive un buffer residente è NULL se viene fornito un buffer in TransferBuffer. Il contenuto del buffer dipende dal valore di TransferFlags. Se viene specificato USBD_TRANSFER_DIRECTION_IN, il buffer descritto conterrà i dati letti dal dispositivo restituito dal driver del controller host. In caso contrario, il buffer contiene dati forniti dal driver per il trasferimento nel dispositivo. Questa MDL deve essere allocata dal pool non a pagina.
UrbLink
Riservato. Non usare.
hca
Riservato. Non usare.
StartFrame
Specifica il numero di frame che il trasferimento deve iniziare. Questa variabile deve trovarsi all'interno di un intervallo definito dal sistema del frame corrente. L'intervallo viene specificato dalla costante USBD_ISO_START_FRAME_RANGE.
Se START_ISO_TRANSFER_ASAP è impostato in TransferFlags, questo membro contiene il numero di frame avviato dal trasferimento, quando la richiesta viene restituita dal driver del controller host. In caso contrario, questo membro deve contenere il numero di frame che il trasferimento inizia.
NumberOfPackets
Specifica il numero di pacchetti descritti dal membro della matrice a lunghezza variabile IsoPacket.
ErrorCount
Contiene il numero di pacchetti completati con una condizione di errore restituita dal driver del controller host.
IsoPacket[1]
Contiene una matrice a lunghezza variabile di strutture USBD_ISO_PACKET_DESCRIPTOR che descrivono i pacchetti di trasferimento isochronous da trasferire sul bus USB. Per altre informazioni su questo membro, vedere la sezione Osservazioni.
Commenti
Il driver del bus USB restituisce sempre un valore di USBD_STATUS_SUCCESS in Hdr.Status, a meno che ogni pacchetto nel trasferimento non generasse un errore o che la richiesta non fosse ben formata e non poteva essere eseguita in tutto. La tabella seguente include i codici di errore possibili restituiti in Hdr.Status.
Valore di errore | Significato |
---|---|
USBD_STATUS_ISOCH_REQUEST_FAILED | Indica che ogni pacchetto di una richiesta isochrono è stata completata con errori. |
USBD_STATUS_BAD_START_FRAME | Indica che il frame di avvio richiesto non si trova all'interno di USBD_ISO_START_FRAME_RANGE del frame USB corrente. |
USBD_ISO_NOT_ACCESSED_LATE | Indica che ogni pacchetto è stato inviato troppo tardi per l'invio del pacchetto, in base al frame di avvio richiesto. |
USBD_STATUS_INVALID_PARAMETER | Indica che uno dei parametri DI URB non è corretto. |
Prima che il controller host invii una richiesta isochronous a un dispositivo USB, richiede informazioni sull'endpoint del dispositivo a cui deve inviare o ricevere dati. Queste informazioni vengono archiviate nei descrittori dell'endpoint (USB_ENDPOINT_DESCRIPTOR) recuperati dal descrittore di configurazione selezionato. Dopo che il driver del bus ottiene il descrittore dell'endpoint, crea una pipe di trasferimento isochronous per configurare il trasferimento dei dati. Gli attributi della pipe vengono archiviati nella struttura USBD_PIPE_INFORMATION . Per i trasferimenti isochronous, i membri vengono impostati come segue:
- Il membro PipeType specifica il tipo di trasferimento ed è impostato su UsbdPipeTypeIsochronous.
- Il membro MaximumPacketSize specifica la quantità di dati, in byte, che costituisce un pacchetto. Per i trasferimenti isochronous, le dimensioni dei pacchetti sono fisse e possono essere un valore compreso tra 0 e 1024. Le dimensioni del pacchetto sono uguali o sono inferiori al valore wMaxPacketSize del descrittore dell'endpoint.
- Il membro Interval deriva dal valore bInterval del descrittore dell'endpoint. Questo valore viene usato per calcolare il periodo di polling che indica la frequenza in cui vengono inviati i dati nel bus. Per i dispositivi a velocità completa, il periodo viene misurato in unità di 1 millisecondi; per i dispositivi ad alta velocità, il periodo viene misurato in microframe.
Per i dispositivi a velocità completa, è possibile trasferire un solo pacchetto all'interno di un frame; i bit 12.. 11 sono riservati e impostati su zero.
Per i dispositivi ad alta velocità, i dati possono essere trasferiti in un singolo pacchetto o possono estendersi su più pacchetti, all'interno di un microframe.
Se i bit 12.. 11 sono impostati su n, è possibile trasferire (n+1)*MaximumPacketSize
byte per microframe. Bit 12.. 11 impostato su zero indicano che è possibile trasferire un solo pacchetto in un microframe. Se i bit 12.. 11 sono impostati su 1, il controller host può trasferire due pacchetti in un microframe.
Il membro IsoPacket di _URB_ISOCH_TRANSFER è una matrice di USBD_ISO_PACKET_DESCRIPTOR che descrive il layout del buffer di trasferimento. Ogni elemento della matrice correla ai dati trasferiti in un microframe. Se IsoPacket ha n elementi, il controller host trasferisce i fotogrammi (per i dispositivi a velocità completa) o microframe (per i dispositivi ad alta velocità) per trasferire i dati. IsoPacket[i]. Il membro offset viene usato per tenere traccia della quantità di dati da inviare o ricevere. Questa operazione viene eseguita impostando un offset di byte dall'inizio dell'intero buffer di trasferimento per la richiesta.
Ad esempio, sono disponibili cinque microframe per trasferire pacchetti di dimensioni di 1024 byte.
Se i bit 12.. 11 sono impostati su zero (che indica un singolo pacchetto per trasferimento microframe), IsoPacket contiene le voci seguenti:
Microframe 1 IsoPacket.Element[0].Offset = 0
(indirizzo iniziale)
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
Se i bit 12.. 11 sono impostati su 1 (che indica due pacchetti per microframe), IsoPacket contiene le voci seguenti:
Microframe 1 IsoPacket.Element[0].Offset = 0
(indirizzo iniziale)
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 Per più pacchetti, il valore di offset indica le dimensioni per tutti i pacchetti all'interno del microframe.
IsoPacket[i]. Il membro di lunghezza viene aggiornato dal controller host per indicare il numero effettivo di byte ricevuti dal dispositivo per trasferimenti IN isocroni. IsoPacket[i]. La lunghezza non viene utilizzata per i trasferimenti OUT isocroni.
I driver possono utilizzare la macro GET_ISO_URB_SIZE per determinare le dimensioni necessarie per contenere l'intero OGGETTO). Se la lunghezza è troppo piccola per riempire lo spazio messo da parte per questo pacchetto, il conducente dell'autobus lascia uno spazio dalla fine dei dati recuperati all'offset per il pacchetto successivo. Il conducente del bus non regola gli offset per evitare di sprecare spazio buffer.
I membri TransferBuffer o TransferBufferMDL devono specificare un buffer virtualmente contiguo.
Trattare altri membri che fanno parte di questa struttura, ma non descritti qui come opachi. Sono riservati per l'uso del sistema.
Requisiti
Requisito | Valore |
---|---|
Intestazione | usb.h (include Usb.h) |