USB Device Class và Composite Device là gì?
Các USB class thông dụng (HID, CDC, MSC, Vendor Specific) và composite device kết hợp nhiều class trên một thiết bị như thế nào.
Host không biết sản phẩm của bạn là gì. Nó chỉ biết descriptor khai báo class nào, rồi tự quyết định load driver tương ứng. Ghi chú này giải thích class là gì, các class thông dụng khác nhau ra sao và vì sao một thiết bị có thể mang nhiều class cùng lúc dưới dạng composite device.
USB device class là gì?
Class là một con số (hoặc bộ ba số: class/subclass/protocol) nằm trong descriptor. Nó nói cho host biết thiết bị thuộc nhóm chức năng nào. Host dựa vào đúng con số này để chọn driver thích hợp chứ không đọc tên sản phẩm hay “đoán mò” qua VID/PID.
Class có thể khai ở hai chỗ:
- Device Descriptor (
bDeviceClass), khi toàn bộ thiết bị chỉ có một chức năng duy nhất. - Interface Descriptor (
bInterfaceClass), khi thiết bị có nhiều interface, mỗi interface tự khai báo class riêng. Đây chính là cách composite device hoạt động.
Các class thông dụng
| Class code | Tên | Dùng cho |
|---|---|---|
| 0x03 | HID (Human Interface Device) | Bàn phím, chuột, gamepad, và bất kỳ thiết bị nào muốn dùng driver có sẵn của OS thay vì viết driver riêng |
| 0x02 | CDC (Communications Device Class) | Cổng COM ảo, modem, thiết bị giao tiếp nối tiếp qua USB |
| 0x08 | MSC (Mass Storage Class) | USB drive, thẻ nhớ gắn ngoài, thiết bị lưu trữ nhận dạng như ổ đĩa |
| 0xFF | Vendor Specific | Không có driver chuẩn của OS, host cần driver riêng (WinUSB, libusbK) mới truy cập được |
Điểm chung của HID, CDC, MSC là cả ba đều có driver cài sẵn trong mọi hệ điều hành phổ biến. Cắm vào là chạy, không cần cài đặt gì thêm. Vendor Specific thì ngược lại: linh hoạt hoàn toàn về giao thức nhưng người dùng phải tự viết, tự cài driver hoặc dùng công cụ như Zadig.
HID không chỉ dành cho bàn phím và chuột
Đối với class HID thì có 1 điểm khác biệt với các class khác là nó có 1 HID Report Descriptor riêng. Đây là ngôn ngữ mô tả cấu trúc dữ liệu tuỳ ý mà thiết bị với host sẽ giao tiếp với nhau, không giới hạn ở bàn phím hay chuột. Vì host đã có sẵn driver HID tổng quát để đọc Report Descriptor và tự suy ra cấu trúc report nên bất kỳ thiết bị nào muốn trao đổi dữ liệu có cấu trúc mà không thích viết driver riêng đều có thể khai báo là HID, kể cả khi dữ liệu đó không liên quan gì đến bàn phím hay chuột.
Composite device: nhiều class trên một thiết bị
Composite device là một thiết bị vật lý khai báo nhiều interface, mỗi interface một class khác nhau. Host thấy nó như nhiều thiết bị logic cùng nằm trên một sợi cáp: một bàn phím HID, một cổng COM CDC, một kênh Vendor Specific, tất cả kết hợp lại cùng một lúc.
Khi Device Descriptor chỉ khai báo một class duy nhất (bDeviceClass = 0x00), host tự đọc
class từ từng Interface Descriptor. Điều này hoạt động tốt nếu mỗi chức năng chỉ cần
đúng một interface, như HID hay Vendor Specific.
CDC là ngoại lệ, một cổng COM ảo cần tới hai interface (Control và Data) hoạt động cùng
nhau như một chức năng duy nhất. Nếu không có gì đánh dấu hai interface đó thuộc về
nhau, host có thể hiểu nhầm thành hai chức năng độc lập mà không liên quan dẫn tới không
tạo ra đúng cổng COM cho thiết bị. IAD (Interface Association Descriptor) sinh ra để giải
quyết đúng vấn đề này. Nó nhóm một dải interface liên tiếp lại thành một chức năng. Và khi
dùng IAD, bDeviceClass ở Device Descriptor phải là 0xEF (Miscellaneous) để báo cho host
biết cần đọc IAD.
Ví dụ về Composite Device
Trong series USB Device trên STM32 có một dự án đi kèm xây dựng một composite device với 4 interface như sau:
| Interface | Class | Chức năng |
|---|---|---|
| 0 | HID (0x03) | Bàn phím, xem bài 5 |
| 1 + 2 | CDC (0x02), nhóm bằng IAD | Log qua cổng COM ảo, xem bài 6 |
| 3 | Vendor Specific (0xFF) | Lệnh tuỳ chỉnh và bulk dump, xem bài 7 |
Bài liên quan
- USB Descriptor từ gốc đến ngọn
- USB Descriptor Overview là gì?
- STM32 HAL USB Device Architecture là gì?
- USB CDC ACM Basics là gì?
Nguồn tham khảo public
- USB 2.0 Specification, Chapter 9: Device Framework
- USB Interface Association Descriptor ECN, spec chính thức về IAD và device class 0xEF
- Defined Class Codes, danh sách class code chính thức từ USB-IF
Bài viết này hữu ích với bạn?
Chia sẻ, góp ý, hoặc ủng hộ nếu bạn thấy nội dung này có giá trị.
Nội dung liên quan
Một số bài viết, ghi chú hoặc project có liên quan đến nội dung bạn vừa đọc.
STM32G0 USB Lab: Composite Device
USB composite device trên STM32G0B1RE: HID Keyboard + CDC log + EP0 Vendor Request + Vendor Bulk IN. Một codebase phát triển từ HID đơn đến debug tool hoàn chỉnh qua commit/tag.
USB Enumeration Process là gì?
Chuỗi hỏi–đáp qua Endpoint 0 từ lúc device cắm vào đến khi host giao address và chọn configuration. 7 bước, điểm nào dễ fail và cách debug từ dưới lên.
USB Transfer Types là gì?
So sánh Control, Interrupt, Bulk và Isochronous transfer: dùng ở đâu, đảm bảo gì, và dễ debug sai ở điểm nào — đặc biệt là cách bInterval thực sự hoạt động trên Windows.
Biến note thành bài viết hoàn chỉnh
Notes là nơi ghi nhanh khái niệm.