Alokasi bandwidth USB

Artikel ini menyediakan panduan tentang manajemen bandwidth USB yang cermat. Setiap driver klien USB bertanggung jawab untuk meminimalkan bandwidth USB yang digunakannya, dan mengembalikan bandwidth yang tidak digunakan ke kumpulan bandwidth gratis secepat mungkin.

Mengapa driver USB saya keluar dari kesalahan bandwidth?

Persaingan untuk bandwidth pada bus USB berasal dari berbagai sumber, baik perangkat keras maupun perangkat lunak. Sulit untuk memprediksi dengan tepat berapa banyak bandwidth yang tersedia untuk driver klien USB. Pengontrol host USB memerlukan sejumlah bandwidth untuk operasinya. Jumlah yang diperlukan tergantung pada apakah pengontrol berkecepatan tinggi atau tidak. Ini bervariasi dari sistem ke sistem. Hub USB yang beroperasi dengan kecepatan tinggi terkadang harus menerjemahkan transaksi antara port upstream berkecepatan tinggi dan perangkat berkecepatan rendah di hilir, dan proses terjemahan ini mengonsumsi bandwidth. Tetapi apakah bandwidth diperlukan untuk terjemahan transaksi tergantung pada jenis perangkat yang terhubung dan topologi pohon perangkat.

Strain paling serius pada sumber daya bandwidth biasanya berasal dari driver klien USB yang memonopoli bandwidth. Sistem mengalokasikan bandwidth berdasarkan first-come-first-serve. Jika driver USB pertama yang dimuat meminta semua bandwidth yang tersedia, driver USB yang dimuat di lain waktu tidak diizinkan bandwidth apa pun untuk perangkatnya. Sistem tidak dapat mengonfigurasi perangkat dan gagal menghitungnya. Karena tidak jelas mengapa enumerasi gagal, pengguna memiliki pengalaman yang buruk.

Terkadang, driver klien menghabiskan bandwidth yang tersedia dengan transfer interupsi berkecepatan tinggi. Tetapi kasus yang paling umum, sejauh ini, adalah driver klien yang mengalokasikan terlalu banyak bandwidth untuk transfer isochronous, kemudian gagal merilis bandwidth secara tepat waktu. Sistem mencadangkan bandwidth yang dialokasikan sampai driver yang memintanya menutup titik akhirnya (dengan membuka titik akhir lain), atau perangkat tempat bandwidth dialokasikan dihapus. Sistem tidak mengalokasikan bandwidth yang dijamin untuk transfer massal, sehingga transfer massal tidak pernah menjadi penyebab kegagalan enumerasi. Namun, performa perangkat transfer massal tergantung pada berapa banyak bandwidth yang dialokasikan untuk perangkat yang melakukan transfer berkala (isochronous dan interupsi).

Spesifikasi USB 2.0 memerlukan perangkat isochronous untuk memiliki titik akhir bandwidth nol pada pengaturan antarmuka defaultnya. Ini memastikan bahwa tidak ada bandwidth yang disediakan untuk perangkat sampai driver fungsi membuka antarmuka non-default, yang membantu mencegah kegagalan enumerasi yang disebabkan oleh permintaan bandwidth yang berlebihan selama konfigurasi perangkat. Ini tidak mencegah driver klien mengalokasikan terlalu banyak bandwidth setelah mengonfigurasi perangkatnya, sehingga mencegah perangkat lain berfungsi dengan baik.

Kunci untuk manajemen bandwidth yang tepat adalah bahwa setiap perangkat USB dalam sistem yang melakukan transfer isochronous harus menawarkan beberapa pengaturan alternatif (Alt) untuk setiap antarmuka yang berisi titik akhir isochronous, dan driver klien harus menggunakan pengaturan Alt ini. Driver klien harus dimulai dengan meminta pengaturan antarmuka dengan bandwidth tertinggi. Jika permintaan gagal, driver klien harus meminta pengaturan antarmuka dengan bandwidth yang lebih kecil dan lebih kecil sampai permintaan berhasil.

Misalnya, perangkat webcam memiliki antarmuka berikut:

Antarmuka 0 (Pengaturan antarmuka default: Tidak ada titik akhir dengan bandwidth isochronous nonzero dalam pengaturan default)

Titik Akhir Isochronous 1: ukuran paket maksimum = 0 byte

Titik Akhir Isochronous 2: ukuran paket maksimum = 0 byte

Pengaturan Antarmuka 0 Alt 1

Titik Akhir Isochronous 1: ukuran paket maksimum = 256 byte

Titik Akhir Isochronous 2: ukuran paket maksimum = 256 byte

Pengaturan Antarmuka 0 Alt 2

Titik Akhir Isochronous 1: ukuran paket maksimum = 512 byte

Titik Akhir Isochronous 2: ukuran paket maksimum = 512 byte

Driver untuk webcam mengonfigurasi webcam untuk menggunakan pengaturan antarmuka default saat menginisialisasi. Pengaturan default tidak memiliki bandwidth isochronous, jadi menggunakan pengaturan default selama inisialisasi menghindari bahaya bahwa webcam mungkin gagal menghitung, karena permintaan yang gagal untuk bandwidth isochronous.

Ketika driver klien siap untuk melakukan transfer isochronous, ia harus mencoba menggunakan pengaturan Alt 2, karena pengaturan Alt 2 memiliki ukuran paket terbesar. Jika permintaan gagal, driver dapat melakukan upaya kedua, menggunakan pengaturan Alt 1. Karena pengaturan Alt 1 memerlukan lebih sedikit bandwidth, permintaan ini mungkin berhasil, meskipun permintaan pertama gagal. Beberapa pengaturan Alt memungkinkan driver untuk melakukan beberapa upaya, sebelum menyerah.

Setelah webcam diam, webcam dapat mengembalikan bandwidth yang dialokasikan ke kumpulan bandwidth gratis dengan memilih pengaturan default sekali lagi.

Pengguna dapat melihat berapa banyak bandwidth yang dialokasikan pengontrol USB dengan memeriksa properti pengontrol di Windows Device Manager. Pilih properti pengontrol lalu lihat di bawah tab Tingkat Lanjut. Pembacaan ini tidak menunjukkan berapa banyak hub USB bandwidth yang telah dialokasikan untuk terjemahan transaksi.

Fitur Manajer Perangkat yang melaporkan penggunaan bandwidth pengontrol USB tidak berfungsi dengan baik di Windows XP.

Transfer USB dan ukuran paket

Artikel ini menjelaskan ukuran transfer USB yang diizinkan dalam berbagai versi sistem operasi Windows.

Ukuran transfer maksimum

Ukuran transfer maksimum menentukan batas yang dikodekan secara permanen dalam tumpukan driver USB. Ada kemungkinan bahwa ukuran transfer di bawah batas ini gagal karena keterbatasan sumber daya sistem. Untuk menghindari jenis kegagalan ini dan untuk memastikan kompatibilitas di semua versi Windows, hindari menggunakan ukuran transfer besar untuk transfer USB.

Catatan

Anggota MaximumTransferSize dari struktur USBD_PIPE_INFORMATION sudah usang. Tumpukan driver USB mengabaikan nilai dalam MaximumTransferSize untuk perangkat komposit dan non-komposit.

Di Windows 2000, tumpukan driver USB menginisialisasi MaximumTransferSize ke USBD_DEFAULT_MAXIMUM_TRANSFER_SIZE. Driver klien dapat menetapkan nilai yang lebih kecil saat mengonfigurasi perangkat. Untuk perangkat komposit, driver klien untuk setiap fungsi hanya dapat mengubah MaximumTransferSize untuk pipa dalam pengaturan antarmuka non-default.

Ukuran transfer USB tunduk pada batas berikut:

Transfer pipa Windows 8.1, Windows 8 Windows 7, Windows Vista Windows XP, Windows Server 2003 Windows 2000
Kontrol 64K untuk SuperSpeed dan kecepatan tinggi (xHCI)

4K untuk kecepatan penuh dan rendah (xHCI, EHCI, UHCI, OHCI)

Untuk UHCI, 4K pada titik akhir default; 64K pada pipa kontrol non-default
64K untuk kecepatan tinggi (EHCI)

4K untuk kecepatan penuh dan rendah (EHCI, UHCI, OHCI)

Untuk UHCI, 4K pada titik akhir default; 64K pada pipa kontrol non-default (UHCI)
64K untuk kecepatan tinggi (EHCI)

4K untuk kecepatan penuh dan rendah (EHCI, UHCI, OHCI)

Untuk UHCI, 4K pada titik akhir default; 64K pada pipa kontrol non-default (UHCI)
4K pada titik akhir default; 64K pada pipa kontrol non-default (OHCI)
Interupsi 4MB untuk SuperSpeed, high, full, dan low speed (xHCI, EHCI, UHCI, OHCI) 4MB untuk kecepatan tinggi, penuh, dan rendah (EHCI, UHCI, OHCI) Tak Terbatas Undetermined(OHCI)
/Bulk 32MB untuk SuperSpeed (xHCI)

4MB untuk kecepatan tinggi dan penuh (xHCI)

4MB untuk kecepatan tinggi dan penuh (EHCI dan UHCI)

Kecepatan penuh 256K (OHCI)
4MB untuk kecepatan tinggi dan penuh (EHCI, UHCI)

256K untuk kecepatan penuh (OHCI)
3MB untuk kecepatan tinggi dan penuh (EHCI)

Tidak ditentukan (UHCI)

256K untuk kecepatan penuh (OHCI)
Undetermined(OHCI)
Isochronous 1024 * wBytesPerInterval untuk SuperSpeed (xHCI)
(lihat USB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR)

1024 * MaximumPacketSize untuk kecepatan tinggi (xHCI, EHCI)

256 * MaximumPacketSize untuk kecepatan penuh (xHCI, EHCI)

64K untuk kecepatan penuh (UHCI, OHCI)
1024 * MaximumPacketSize untuk kecepatan tinggi (EHCI)

256 * MaximumPacketSize untuk kecepatan penuh (EHCI)

64K untuk kecepatan penuh (UHCI, OHCI)
1024 * MaximumPacketSize untuk kecepatan tinggi (EHCI)

256 * MaximumPacketSize untuk kecepatan penuh (EHCI)

64K untuk kecepatan penuh (UHCI, OHCI)
64K untuk kecepatan penuh (OHCI)

Membatasi ukuran transfer dengan MaximumTransferSize tidak secara langsung memengaruhi berapa banyak bandwidth yang digunakan perangkat. Driver klien harus mengubah pengaturan antarmuka atau membatasi ukuran paket maksimum yang diatur dalam anggota MaximumPacketSizedari USBD_PIPE_INFORMATION.

Ukuran paket maksimum

Ukuran paket maksimum ditentukan oleh bidang wMaxPacketSize dari deskriptor titik akhir. Driver klien dapat mengatur ukuran paket USB dalam permintaan antarmuka tertentu ke perangkat. Mengubah nilai ini tidak mengubah wMaxPacketSize pada perangkat.

Dalam URB untuk permintaan adalah struktur USBD_PIPE_INFORMATION untuk pipa. Dalam struktur itu,

  • Ubah anggota MaximumPacketSize dari struktur USBD_PIPE_INFORMATION . Atur ke nilai yang kurang dari atau sama dengan nilai wMaxPacketSize yang ditentukan dalam firmware perangkat untuk pengaturan antarmuka saat ini.
  • Atur bendera USBD_PF_CHANGE_MAX_PACKET di struktur USBD_PIPE_INFORMATION anggota PipeFlags.

Untuk informasi tentang memilih pengaturan antarmuka, lihat Cara Memilih Konfigurasi untuk Perangkat USB.

Pembatasan ukuran paket maksimum pada buffer transfer baca

Ketika driver klien membuat permintaan baca, buffer transfer harus berupa kelipatan ukuran paket maksimum. Bahkan ketika driver mengharapkan data kurang dari ukuran paket maksimum, driver masih harus meminta seluruh paket. Ketika perangkat mengirim paket kurang dari ukuran maksimum (paket pendek), itu adalah indikasi bahwa transfer selesai.

Pada pengontrol yang lebih lama, driver klien dapat mengambil alih perilaku. Di anggota TransferFlagsdari URB transfer data, driver klien harus mengatur bendera USBD_SHORT_TRANSFER_OK. Bendera itu memungkinkan perangkat untuk mengirim paket yang lebih kecil dari wMaxPacketSize.

Pada pengontrol host xHCI, USBD_SHORT_TRANSFER_OK diabaikan untuk titik akhir massal dan interupsi. Transfer paket pendek pada pengontrol EHCI tidak mengakibatkan kondisi kesalahan.

Pada pengontrol host EHCI, USBD_SHORT_TRANSFER_OK diabaikan untuk titik akhir massal dan interupsi.

Pada pengontrol host UHCI dan OHCI, jika USBD_SHORT_TRANSFER_OK tidak diatur untuk transfer massal atau interupsi, transfer paket singkat menghentikan titik akhir dan kode kesalahan dikembalikan untuk transfer.

Memisahkan transfer tulis dengan paket pendek

Driver tumpukan driver USB tidak memberlakukan pembatasan yang sama pada ukuran paket, saat menulis ke perangkat, yang diberlakukan saat membaca dari perangkat. Beberapa driver klien harus sering membuat transmisi data kontrol dalam jumlah kecil untuk mengelola perangkat mereka. Tidak praktis untuk membatasi transmisi data ke paket ukuran seragam dalam kasus seperti itu. Oleh karena itu, tumpukan driver tidak menetapkan signifikansi khusus untuk paket ukuran kurang dari ukuran maksimum titik akhir selama penulisan data. Ini memungkinkan driver klien untuk memecah transfer besar ke perangkat menjadi beberapa URL dengan ukuran apa pun yang kurang dari atau sama dengan maksimum.

Driver harus mengakhiri transmisi dengan paket dengan ukuran kurang dari maksimum, atau memisahkan akhir transmisi dengan paket panjang nol. Transmisi tidak selesai sampai driver mengirim paket yang lebih kecil dari wMaxPacketSize. Jika ukuran transfer adalah kelipatan maksimum yang tepat, driver harus mengirim paket pembatas panjang nol untuk secara eksplisit menghentikan transfer

Driver klien bertanggung jawab untuk memisahkan transmisi data dengan paket panjang nol, seperti yang diperlukan oleh spesifikasi USB. Tumpukan driver USB tidak menghasilkan paket ini secara otomatis.

Memisahkan transfer data USB dengan paket yang lebih kecil dari wMaxPacketSize

Driver USB 2.0 dan USB 1.1 yang sesuai harus mengirimkan paket dengan ukuran maksimum (wMaxPacketSize) dan kemudian mengakhiri transmisi dengan paket dengan ukuran kurang dari maksimum, atau memisahkan akhir transmisi dengan paket panjang nol. Transmisi tidak selesai sampai driver mengirim paket yang lebih kecil dari wMaxPacketSize. Jika ukuran transfer adalah kelipatan maksimum yang tepat, driver harus mengirim paket pembatas panjang nol untuk secara eksplisit menghentikan transfer

Driver perangkat bertanggung jawab untuk memisahkan transmisi data dengan paket panjang nol, seperti yang diperlukan oleh spesifikasi USB. Tumpukan USB sistem tidak menghasilkan paket ini secara otomatis.