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.

Cập nhật 5 phút đọc
STM32 cover

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

Nguồn tham khảo public

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ị.

Góp ý

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.

Biến note thành bài viết hoàn chỉnh

Notes là nơi ghi nhanh khái niệm.