Chương 5: Lớp thiết bị giao diện người sử dụng
5.4 Cách thức để chỉ ram ộ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). Ngoà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. Hoà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 một giao thức đã được đơn giản hoá được hỗ trợ bởi hệ thống vào ra cơ sở
(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ả đã