Chương 5: Lớp thiết bị giao diện người sử dụng
5.4 Cách thức để chỉ ra một thiết bị thuộc lớp HID
Với bất kỳ thiết bị USB nào thuộc lớp HID thì các bộ mơ tả của nó chỉ cho máy chủ cái máy chủ cần biết để giao tiếp với thiết bị. Máy chủ tìm hiểu về giao diện HID trong suốt quá trình thiết lập bằng cách gửi một yêu cầu Get_Descriptor. Các bộ mô tả của một thiết bị thuộc lớp HID bao gồm: Bộ mô tả thiết bị (Device Descriptor), bộ mơ tả cấu hình (Configuration Descriptor), bộ mô tả giao diện (Interface Descriptor), bộ mô tả HID (HID Descriptor), bộ mô tả điểm cuối ngắt vào (IN interrupt Enpoint Descriptor), bộ mô tả điểm cuối ngắt ra (OUT Interrupt Endpoint Descriptor) và bộ mô tả điểm cuối ngắt đặc
biệt (Feature Interrupt Endpoint Descriptor). Hai bộ mơ tả sau cùng là tuỳ chọn (tức có thể có hoặc khơng). Ngồi các bộ mơ tả vừa liệt kê ở trên thiết bị thuộc lớp HID còn phải có một bộ mơ tả nữa đó là bộ mơ tả Report (bộ mơ tả Report sẽ được nói cụ thể sau). Sau đây là một ví dụ về các bộ mô tả cho một thiết bị thuộc lớp HID của một nhà cung cấp [2].
{
// Device Descriptor
0x12, // Descriptor size in bytes 0x01, // Descriptor type (Device)
0x0200, // USB Specification release number (BCD) (2.00) 0x00, // Class Code
0x00, // Subclass code 0x00, // Protocol code
0x08, // Endpoint 0 maximum packet size 0x0925, // Vendor ID (Lakeview Research)
0x1234, // Product ID
0x0100, // Device release number (BCD) 0x01, // Manufacturer string index 0x02, // Product string index
0x00, // Device serial number string index 0x01 // Number of configurations
// Configuration Descriptor
0x09, // Descriptor size in bytes
0x02, // Descriptor type (Configuration)
0x0029, // Total length of this and subordinate descriptors 0x01, // Number of interfaces in this configuration 0x01, // Index of this configuration
0x00, // Configuration string index
0xA0, // Attributes (bus powered, remote wakeup supported) 0x50, // Maximum power consumption (100 mA)
// Interface Descriptor
0x09, // Descriptor size in bytes 0x04, // Descriptor type (Interface) 0x00, // Interface Number
0x00, // Alternate Setting Number
0x02, // Number of endpoints in this interface 0x03, // Interface class (HID)
0x00, // Interface subclass 0x00, // Interface protocol 0x00, // Interface string index // HID Descriptor
0x09, // Descriptor size in bytes 0x21, // Descriptor type (HID)
0x00, // Country code
0x01, // Number of subordinate class descriptors 0x22, // Descriptor type (report)
002F, // Report descriptor size in bytes // IN Interrupt Endpoint Descriptor
0x07, // Descriptor size in bytes 0x05, // Descriptor type (Endpoint)
0x81, // Endpoint number and direction (1 IN) 0x03, // Transfer type (interrupt)
0x40, // Maximum packet size
0x0A, // Polling interval (milliseconds) // OUT Interrupt Endpoint Descriptor
0x07, // Descriptor size in bytes 0x05, // Descriptor type (Endpoint)
0x01, // Endpoint number and direction (1 OUT) 0x03, // Transfer type (interrupt)
0x40, // Maximum packet size
0x0A // Polling interval (milliseconds) }
Trong ví dụ trên, ta thấy dịng thứ sáu của bộ mơ tả giao diện (Interface Descriptor) có giá trị là 03 h để chỉ ra giao diện của thiết bị là giao diện của một HID. Các trường khác đáng lưu ý trong bộ mô tả giao diện là trường subclass và protocol ở các dòng thứ 7 và 8. Nếu bit subclass=1 thì có nghĩa là thiết bị hỗ trợ giao diện khởi động. Một HID với giao diện khởi động sẽ có thể thực hiện một phần chức năng của mình khi mà driver của nó chưa được máy chủ tải đến. Hồn cảnh này có thể xuất hiện khi máy tính khởi động trực tiếp từ DOS hoặc khi sử dụng chế độ an toàn (safe mode) của Windows để gỡ lỗi hệ thống. Một bàn phím hoặc con chuột với giao diện khởi động có thể sử dụng
(BIOS) của nhiều máy tính chủ. Trường protocol=1 tức là thiết bị hỗ trợ giao diện bàn phím cịn nếu bằng 2 thì thiết bị hỗ trợ giao diện con chuột.
Bộ mô tả HID (HID Descriptor) là bộ mô tả được bổ sung cho lớp HID. Bộ mơ tả này có thể có 7 trường hoặc nhiều hơn tuỳ thuộc vào số lượng các bộ mô tả được thêm vào cho thiết bị:
- Trường bLength có kích thước 1 byte cho biết độ dài của bộ mơ tả
HID tính theo byte.
- Trường bDescriptorType có giá trị là 21h để chỉ ra bộ mô tả này là bộ mô tả HID.
- Trường bcdHID có kích thước 2 byte để chỉ ra phiên bản USB mà thiết bị tuân theo.
- Trường bCountryCode, Nếu thiết bị được sử dụng chỉ trong phạm vi
địa lý của một nước nào đó thì trường này sẽ mang mã của quốc gia đó (Đặc tả HID có danh sách mã của các nước). Nếu việc sử dụng
thiết bị không phụ thuộc vào vị trí địa lý thì trường này có giá trị 00h - Trường bNumDescriptors chỉ ra số lượng các bộ mô tả lớp thuộc cấp
dưới của bộ mô tả này.
- Trường bDescriptorType chỉ ra loại của bộ mô tả thuộc cấp dưới của bộ mô tả này. (Ví dụ như trường này có giá trị 22h để chỉ ra rằng bộ mô tả cấp dưới của nó là bộ mơ tả Report)
- wDescriptorLength cho biết kích thước tổng cộng của các bộ mơ tả
đã được mơ tả trước nó và phần kích thước kể từ đầu cho đến trường
này của bộ mơ tả HID.
Nếu thiết bị có thêm một bộ mơ tả vật lý (physical descriptor) thì bộ mơ tả HID sẽ có thêm hai trường nữa được liệt kê lần lượt là:
- bDescriptorType có giá trị là 23h để chỉ ra bộ mô tả cấp dưới là bộ mô tả vật lý.
- wDescriptorLength cho biết tổng kích thước của các bộ mơ tả đã được mơ tả tính từ đầu cho đến hết trường này.