struktur _URB_ISOCH_TRANSFER (usb.h)
Struktur _URB_ISOCH_TRANSFER digunakan oleh driver klien USB untuk mengirim data ke atau mengambil data dari pipa transfer isochronous.
Sintaks
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];
};
Anggota
Hdr
Penunjuk ke struktur _URB_HEADER yang menentukan informasi header URB. Hdr.Function harus URB_FUNCTION_ISOCH_TRANSFER, dan Hdr.Length harus berukuran struktur data panjang variabel ini.
PipeHandle
Menentukan handel buram ke pipa isochronous. Driver pengontrol host mengembalikan handel ini ketika driver klien memilih konfigurasi perangkat dengan URB jenis URB_FUNCTION_SELECT_CONFIGURATION atau ketika driver klien mengubah pengaturan untuk antarmuka dengan URB jenis URB_FUNCTION_SELECT_INTERFACE.
TransferFlags
Menentukan nol, satu, atau kombinasi bendera berikut:
TransferBufferLength
Menentukan panjang, dalam byte, dari buffer yang ditentukan dalam TransferBuffer atau dijelaskan dalam TransferBufferMDL. Driver pengontrol host mengembalikan jumlah byte yang dikirim ke atau dibaca dari pipa di anggota ini.
TransferBuffer
Penunjuk ke buffer penduduk untuk transfer adalah NULL jika MDL disediakan di TransferBufferMDL. Isi buffer ini tergantung pada nilai TransferFlags. Jika USBD_TRANSFER_DIRECTION_IN ditentukan, buffer ini akan berisi data yang dibaca dari perangkat saat dikembalikan dari driver pengontrol host. Jika tidak, buffer ini berisi data yang disediakan driver untuk ditransfer ke perangkat.
TransferBufferMDL
Penunjuk ke MDL yang menjelaskan buffer penduduk adalah NULL jika buffer disediakan di TransferBuffer. Isi buffer tergantung pada nilai TransferFlags. Jika USBD_TRANSFER_DIRECTION_IN ditentukan, buffer yang dijelaskan akan berisi data yang dibaca dari perangkat saat kembali dari driver pengontrol host. Jika tidak, buffer berisi data yang disediakan driver untuk ditransfer ke perangkat. MDL ini harus dialokasikan dari kumpulan yang tidak dipagasi.
UrbLink
Dicadangkan. Jangan gunakan.
hca
Dicadangkan. Jangan gunakan.
StartFrame
Menentukan nomor bingkai tempat transfer harus dimulai. Variabel ini harus berada dalam rentang yang ditentukan sistem dari bingkai saat ini. Rentang ditentukan oleh USBD_ISO_START_FRAME_RANGE konstanta.
Jika START_ISO_TRANSFER_ASAP diatur dalam TransferFlags, anggota ini berisi nomor bingkai tempat transfer dimulai, ketika permintaan dikembalikan oleh driver pengontrol host. Jika tidak, anggota ini harus berisi nomor bingkai tempat transfer ini dimulai.
NumberOfPackets
Menentukan jumlah paket yang dijelaskan oleh anggota array panjang variabel IsoPacket.
ErrorCount
Berisi jumlah paket yang selesai dengan kondisi kesalahan saat kembali dari driver pengontrol host.
IsoPacket[1]
Berisi array panjang variabel dari struktur USBD_ISO_PACKET_DESCRIPTOR yang menjelaskan paket transfer isochronous yang akan ditransfer pada bus USB. Untuk informasi selengkapnya tentang anggota ini, lihat bagian Keterangan.
Keterangan
Driver bus USB selalu mengembalikan nilai USBD_STATUS_SUCCESS dalam Hdr.Status, kecuali setiap paket dalam transfer menghasilkan kesalahan atau permintaan tidak terbentuk dengan baik dan tidak dapat dijalankan sama sekali. Tabel berikut ini menyertakan kemungkinan kode kesalahan yang dikembalikan dalam Hdr.Status.
Nilai kesalahan | Makna |
---|---|
USBD_STATUS_ISOCH_REQUEST_FAILED | Menunjukkan bahwa setiap paket permintaan isochronous diselesaikan dengan kesalahan. |
USBD_STATUS_BAD_START_FRAME | Menunjukkan bahwa bingkai mulai yang diminta tidak berada dalam USBD_ISO_START_FRAME_RANGE dari bingkai USB saat ini. |
USBD_ISO_NOT_ACCESSED_LATE | Menunjukkan bahwa setiap paket dikirimkan terlalu terlambat agar paket dikirim, berdasarkan bingkai mulai yang diminta. |
USBD_STATUS_INVALID_PARAMETER | Menunjukkan bahwa salah satu parameter URB salah. |
Sebelum pengontrol host mengirim permintaan isochronous ke perangkat USB, pengontrol host memerlukan informasi tentang titik akhir perangkat yang harus dikirim atau diterima datanya. Informasi ini disimpan dalam deskriptor titik akhir (USB_ENDPOINT_DESCRIPTOR) yang diambil dari deskriptor konfigurasi yang dipilih. Setelah sopir bus mendapatkan deskriptor titik akhir, ia membuat pipa transfer isochronous untuk menyiapkan transfer data. Atribut pipa disimpan dalam struktur USBD_PIPE_INFORMATION . Untuk transfer isochronous, anggota ditetapkan sebagai berikut:
- Anggota PipeType menentukan jenis transfer dan diatur ke UsbdPipeTypeIsochronous.
- Anggota MaximumPacketSize menentukan jumlah data, dalam byte, yang merupakan satu paket. Untuk transfer isochronous, ukuran paket tetap dan dapat menjadi nilai dari 0-1024. Ukuran paket sama dengan atau kurang dari nilai wMaxPacketSize dari deskriptor titik akhir.
- Anggota Interval berasal dari nilai bInterval deskriptor titik akhir. Nilai ini digunakan untuk menghitung periode polling yang menunjukkan frekuensi pengiriman data di bus. Untuk perangkat berkecepatan penuh, periode diukur dalam satuan bingkai 1 milidetik; untuk perangkat berkecepatan tinggi, periode diukur dalam mikroframe.
Untuk perangkat berkecepatan penuh, hanya satu paket yang dapat ditransfer dalam bingkai; bit 12.. 11 dicadangkan dan diatur ke nol.
Untuk perangkat berkecepatan tinggi, data dapat ditransfer dalam satu paket atau mungkin mencakup beberapa paket, dalam mikroframe.
Jika bit 12.. 11 diatur ke n, Anda dapat mentransfer (n+1)*MaximumPacketSize
byte per mikroframe. Bit 12.. 11 diatur ke nol menunjukkan bahwa hanya satu paket yang dapat ditransfer dalam mikroframe. Jika bit 12.. 11 diatur ke 1, pengontrol host dapat mentransfer dua paket dalam mikroframe.
Anggota IsoPacketdari _URB_ISOCH_TRANSFER adalah array USBD_ISO_PACKET_DESCRIPTOR yang menjelaskan tata letak buffer transfer. Setiap elemen dalam array berkorelasi dengan data yang ditransfer dalam satu mikroframe. Jika IsoPacket memiliki elemen n , transfer pengontrol host menggunakan bingkai n (untuk perangkat berkecepatan penuh) atau mikroframe (untuk perangkat berkecepatan tinggi) untuk mentransfer data. IsoPacket[i]. Anggota offset digunakan untuk melacak jumlah data yang akan dikirim atau diterima. Ini dilakukan dengan mengatur offset byte dari awal seluruh buffer transfer untuk permintaan.
Misalnya, ada lima mikroframe yang tersedia untuk mentransfer paket berukuran 1024 byte.
Jika bit 12.. 11 diatur ke nol (menunjukkan satu paket per transfer mikroframe), IsoPacket berisi entri berikut:
Microframe 1 IsoPacket.Element[0].Offset = 0
(alamat mulai)
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
Jika bit 12.. 11 diatur ke 1 (menunjukkan dua paket per mikroframe), IsoPacket berisi entri berikut:
Microframe 1 IsoPacket.Element[0].Offset = 0
(alamat mulai)
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
Catatan Untuk beberapa paket, nilai offset menunjukkan ukuran untuk semua paket dalam mikroframe.
IsoPacket[i]. Anggota panjang diperbarui oleh pengontrol host untuk menunjukkan jumlah byte aktual yang diterima dari perangkat untuk transfer IN isochronous. IsoPacket[i]. Panjang tidak digunakan untuk transfer OUT isochronous.
Driver dapat menggunakan makro GET_ISO_URB_SIZE untuk menentukan ukuran yang diperlukan untuk menahan seluruh URB. Jika panjangnya terlalu kecil untuk mengisi ruang yang disisihkan untuk paket ini, driver bus meninggalkan celah dari akhir data yang diambil ke offset untuk paket berikutnya. Pengemudi bus tidak akan menyesuaikan offset untuk menghindari membuang-buffer space.
Anggota TransferBuffer atau TransferBufferMDL harus menentukan buffer yang hampir berdampingan.
Perlakukan anggota lain yang merupakan bagian dari struktur ini tetapi tidak digambarkan di sini sebagai buram. Mereka dicadangkan untuk penggunaan sistem.
Persyaratan
Persyaratan | Nilai |
---|---|
Header | usb.h (termasuk Usb.h) |