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:

Nilai Makna
USBD_TRANSFER_DIRECTION_IN
Diatur untuk meminta data dari perangkat. Untuk mentransfer data ke perangkat, bendera ini harus jelas.
USBD_SHORT_TRANSFER_OK
Diatur untuk mengarahkan pengontrol host untuk tidak mengembalikan kesalahan ketika menerima paket dari perangkat yang lebih pendek dari ukuran paket maksimum untuk titik akhir. Bendera ini tidak berpengaruh pada pipa isochronous, karena driver bus tidak mengembalikan kesalahan ketika menerima paket pendek pada pipa isochronous.
USBD_START_ISO_TRANSFER_ASAP
Menyebabkan transfer dimulai pada bingkai berikutnya, jika tidak ada transfer yang dikirimkan ke pipa sejak pipa dibuka atau direset terakhir. Jika tidak, transfer dimulai pada bingkai pertama yang mengikuti semua permintaan yang saat ini diantrekan untuk pipa. Bingkai aktual tempat transfer dimulai akan disesuaikan untuk latensi bus oleh driver pengontrol host.

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.
Pengontrol host juga menentukan jumlah data yang dapat ditransfer (dalam bingkai atau mikroframe) tergantung pada jenis perangkat. Informasi ini tersedia dalam bit 12.. 11wMaxPacketSize di deskriptor titik akhir.

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)

Lihat juga

Cara Mentransfer Data ke Titik Akhir USB Isochronous

URB

Struktur USB

USBD_ISO_PACKET_DESCRIPTOR

USBD_IsochUrbAllocate

_URB_HEADER