Deskriptor perangkat USB

Deskriptor perangkat berisi informasi tentang perangkat USB secara keseluruhan. Topik ini menjelaskan struktur USB_DEVICE_DESCRIPTOR dan menyertakan informasi tentang bagaimana driver klien dapat mengirim permintaan get-descriptor untuk mendapatkan pendeskripsi perangkat.

Setiap perangkat Universal Serial Bus (USB) harus dapat memberikan satu deskriptor perangkat yang berisi informasi yang relevan tentang perangkat. Struktur USB_DEVICE_DESCRIPTOR menjelaskan deskriptor perangkat. Windows menggunakan informasi tersebut untuk memperoleh berbagai set informasi. Misalnya, bidang idVendor dan idProduct masing-masing menentukan vendor dan pengidentifikasi produk. Windows menggunakan nilai bidang tersebut untuk membuat ID perangkat keras untuk perangkat. Untuk melihat ID perangkat keras perangkat tertentu, buka Manajer Perangkat dan lihat properti perangkat. Di tab Detail , nilai properti Id Perangkat Keras menunjukkan ID perangkat keras ("USB\XXX") yang dihasilkan oleh Windows. Bidang bcdUSB menunjukkan versi spesifikasi USB yang sesuai dengan perangkat. Misalnya, 0x0200 menunjukkan bahwa perangkat dirancang sesuai spesifikasi USB 2.0. Nilai bcdDevice menunjukkan nomor revisi yang ditentukan perangkat. Tumpukan driver USB menggunakan bcdDevice, bersama dengan idVendor dan idProduct, untuk menghasilkan perangkat keras dan ID yang kompatibel untuk perangkat. Anda dapat melihat pengidentifikasi tersebut di Manajer Perangkat. Deskriptor perangkat juga menunjukkan jumlah total konfigurasi yang didukung perangkat.

Perangkat mungkin melaporkan informasi yang berbeda dalam deskriptor perangkatnya ketika perangkat terhubung ke komputer host dalam kapasitas kecepatan tinggi daripada ketika terhubung dalam kapasitas kecepatan penuh. Perangkat tidak boleh mengubah informasi yang terkandung dalam deskriptor perangkat selama masa pakai koneksi, termasuk selama perubahan status daya.

Host mendapatkan pendeskripsi perangkat melalui transfer kontrol. Dalam transfer, jenis permintaan adalah GET DESCRIPTOR dan penerima adalah perangkat. Driver klien dapat memulai transfer tersebut dengan salah satu dari dua cara: dengan menggunakan objek perangkat target USB kerangka kerja atau dengan mengirim URB dengan informasi permintaan.

Mendapatkan deskriptor perangkat

Driver klien Windows Driver Frameworks (WDF) dapat memperoleh deskriptor perangkat hanya setelah objek perangkat target USB kerangka kerja dibuat.

Driver KMDF harus mendapatkan handel WDFUSBDEVICE ke objek perangkat target USB dengan memanggil WdfUsbTargetDeviceCreate. Biasanya, driver klien memanggil WdfUsbTargetDeviceCreate dalam implementasi panggilan balik EvtDevicePrepareHardware driver. Setelah itu, driver klien harus memanggil metode WdfUsbTargetDeviceGetDeviceDescriptor . Setelah panggilan selesai, pendeskripsi perangkat diterima dalam struktur USB_DEVICE_DESCRIPTOR yang dialokasikan pemanggil.

Driver UMDF harus mengkueri objek perangkat kerangka kerja untuk penunjuk IWDFUsbTargetDevice lalu memanggil metode IWDFUsbTargetDevice::RetrieveDescriptor dan menentukan USB_DEVICE_DESCRIPTOR_TYPE sebagai jenis deskriptor.

Host juga dapat memperoleh pendeskripsi perangkat dengan mengirim URB. Metode ini hanya berlaku untuk driver mode kernel. Namun, driver klien seharusnya tidak perlu mengirim URB untuk jenis permintaan ini kecuali driver didasarkan pada Windows Driver Model (WDM). Driver seperti itu harus mengalokasikan struktur URB dan kemudian memanggil makro UsbBuildGetDescriptorRequest untuk menentukan format URB untuk permintaan tersebut. Driver kemudian dapat mengirim permintaan dengan mengirimkan URB ke tumpukan driver USB. Untuk informasi selengkapnya, lihat Cara Mengirimkan URB.

Contoh kode ini menunjukkan panggilan UsbBuildGetDescriptorRequest yang memformat buffer yang ditunjukkan oleh pURB dengan URB yang sesuai:

UsbBuildGetDescriptorRequest(
    pURB,                                                 // Points to the URB to be formatted
    sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST),
    USB_DEVICE_DESCRIPTOR_TYPE,
    0,                                                    // Not used for device descriptors
    0,                                                    // Not used for device descriptors
    pDescriptor,                                          // Points to a USB_DEVICE_DESCRIPTOR structure
    NULL,
    sizeof(USB_DEVICE_DESCRIPTOR),
    NULL
);

Contoh deskriptor perangkat

Contoh ini menunjukkan pendeskripsi perangkat untuk perangkat webcam USB (lihat Tata Letak Perangkat USB), yang diperoleh dengan menggunakan aplikasi USBView:

Device Descriptor:
bcdUSB:             0x0200
bDeviceClass:         0xEF
bDeviceSubClass:      0x02
bDeviceProtocol:      0x01
bMaxPacketSize0:      0x40 (64)
idVendor:           0x045E (Microsoft Corporation)
idProduct:          0x0728
bcdDevice:          0x0100
iManufacturer:        0x01
0x0409: "Microsoft"
iProduct:             0x02
0x0409: "Microsoft LifeCam VX-5000"
0x0409: "Microsoft LifeCam VX-5000"
iSerialNumber:        0x00
bNumConfigurations:   0x01

Dalam contoh sebelumnya, Anda akan melihat bahwa perangkat telah dikembangkan sesuai Spesifikasi USB, versi 2.0. Perhatikan nilai bDeviceClass, bDeviceSubClass, dan bDeviceProtocol . Nilai-nilai tersebut menunjukkan bahwa perangkat berisi satu atau beberapa deskriptor asosiasi antarmuka USB yang dapat digunakan untuk mengelompokkan beberapa antarmuka per fungsi. Untuk informasi selengkapnya, lihat Deskriptor Asosiasi Antarmuka USB.

Selanjutnya, lihat nilai bMaxPacketSize0. Nilai ini menunjukkan ukuran paket maksimum titik akhir default. Perangkat sampel ini dapat mentransfer hingga 64 byte data melalui titik akhir defaultnya.

Biasanya, untuk mengonfigurasi perangkat, driver klien mendapatkan informasi tentang konfigurasi yang didukung di perangkat setelah mendapatkan deskriptor perangkat. Untuk menentukan jumlah konfigurasi yang didukung perangkat, periksa anggota bNumConfigurations dari struktur yang dikembalikan. Perangkat ini mendukung satu konfigurasi. Untuk mendapatkan informasi tentang konfigurasi USB, driver harus mendapatkan Deskriptor Konfigurasi USB.