Tôi tìm các giá trị để xây dựng bộ mô tả USB HID ở đâu?


10

Tôi đang cố gắng tự học một chút về việc tạo một bộ mô tả USB HID trong C cho dự án USB PIC32 mà tôi muốn thử.

Tôi đã tải xuống tài liệu Bảng sử dụng HID từ http://www.usb.org/developers/hidpage/ và cố gắng tìm ra nơi các giá trị thực tế được chỉ định cho các yếu tố khác nhau trong mô tả HID.

Hãy để tôi giải thích với một đoạn trích từ mẫu tôi đang xem:

ROM struct{BYTE report[HID_RPT01_SIZE];}hid_rpt01={{
  0x05,0x01,        // USAGE_PAGE (Generic Desktop)
  0x09,0x05,        // USAGE (Game Pad)
  0xA1,0x01,        // COLLECTION (Application)
  0x15,0x00,        //   LOGICAL_MINIMUM(0)
  0x25,0x01,        //   LOGICAL_MAXIMUM(1)
  0x35,0x00,        //   PHYSICAL_MINIMUM(0)
  0x45,0x01,        //   PHYSICAL_MAXIMUM(1)
  // ...

Từ ví dụ trên, rõ ràng mảng BYTE được cấu thành từ các cặp khóa / giá trị, nếu tôi có thể gọi nó là như vậy. Ví dụ: dòng thứ 2: 0x05,0x01 chỉ ra khóa 0x05, là Trang sử dụng và 0x01 là giá trị biểu thị Bàn làm việc chung

Tôi đang cố gắng tìm ra nơi các giá trị này được chỉ định trong tài liệu PDF Bảng sử dụng HID. Ví dụ, tôi không thể tìm thấy tài liệu tham khảo nào

USAGE_PAGE == 0x05

và ví dụ

COLLECTION == 0xA1

Tôi đã thử tìm kiếm PDF cho 0xA1, không có kết quả. Cách duy nhất tôi có thể tìm ra các giá trị là gì, bằng cách xem các nhận xét của ví dụ hoặc bằng cách sử dụng Công cụ mô tả USB từ liên kết ở trên.

Tôi chỉ tự hỏi, tôi hoàn toàn không biết tài liệu tham khảo khóa / giá trị này?

Có rất nhiều ví dụ trực tuyến, ví dụ như liên kết sau: http://www.frank-zhao.com/cache/hid_tutorial_1.php

Nhưng ngay cả tài liệu tham khảo này cũng tải các giá trị chuỗi như END_COLLMENT == 0xc0

Tôi tìm tài liệu tham khảo cho các giá trị này ở đâu? Tôi đang thiếu gì?


Có vẻ như tôi sẽ phải sử dụng Công cụ mô tả USB để xây dựng bộ mô tả HID. :)
josef.van.niekerk

Câu trả lời:


19

Các tài liệu USB là khá khủng khiếp. Nó phải chịu sự chung chung quá mức, nơi họ đang cố gắng làm cho mọi thứ trở nên chung chung và chung chung đến mức khó có thể chuyển từ các tài liệu sang bất kỳ ứng dụng cụ thể nào.

Định dạng mô tả được đặt trong tài liệu có tên " Định nghĩa lớp thiết bị cho HID " tại liên kết đến usb.org mà bạn cung cấp.

Điều quan trọng bạn thiếu là các phân đoạn khác nhau (chẳng hạn như 0x05) không được ghi lại bằng tiền tố 0x . Trong thực tế, họ thường mô tả chúng trong nhị phân thô .

Ví dụ: liên quan đến 0xA1: nhập mô tả hình ảnh ở đây

Bạn có thể thấy rằng tiền tố nhị phân1010_00nn chỉ ra rằng đó là một tập hợp và hậu tố chỉ ra rằng nnnn_nn01nó dài 1 byte. Sau đó, byte tiếp theo được hiểu là kiểu tập hợp, trong trường hợp này là kiểu Ứng dụng. Sau đó, điều này đặt bối cảnh trong đó các byte tiếp theo được diễn giải, cho đến khi trình phân tích cú pháp mô tả HID nhìn thấy một thẻ bộ sưu tập khác hoặc một điểm đánh dấu bộ sưu tập kết thúc.

Bạn có thể thấy rằng END COLLECTIONđược chỉ định là 0b1100_00nn, với nnbị bỏ qua. Đây là nơi mà 0xC0đến từ.

Bạn cũng có thể bắt đầu để xem các đối số khác được xây dựng như thế nào. Ví dụ, LOGICAL MINIMUM0x25, hoặc 0b0010_0101. Từ đó, chúng ta có thể thấy rằng chúng ta có độ dài dữ liệu 0bnnnn_nn01hoặc một byte và chỉ định cho LOGICAL MINIMUM0b0010_01nn

nhập mô tả hình ảnh ở đây

Cấu trúc cho USAGE PAGEmô tả là như nhau. Lệnh chọn trang sử dụng là 0000_01nnnnnn_nn01cho biết nó dài 1 byte. Tôi đoán rằng, vì tài liệu nói rằng các trang sử dụng là 32 bit, nên các bit trên được coi là 0 hoặc được suy ra từ một phần khác của tài liệu. Tôi thực sự không biết làm thế nào họ được chỉ định.

Có một trang tốt của các hằng số HID khác nhau ở đây .

Và một phiên bản mới hơn từ các nguồn BSD đây (Cảm ơn, @crazysim!) (Mới nhất TRỤ , có thể không ngoái).


Đúng thứ tôi cần. Cảm ơn bạn rất nhiều vì câu trả lời sâu sắc. Nó thực sự giúp rất nhiều! ;)
josef.van.niekerk

1
@ josef.van.niekerk - Không vấn đề gì. Đã được một thời gian trước khi tôi đi sâu vào các tiêu chuẩn USB và chúng mờ đục như tôi nhớ.
Sói Connor

Tôi xin lỗi vì đã chấm điểm nhưng liên kết đến USB.org không còn hoạt động nữa.
Rob van der Veer

1
@RobvanderVeer nên được sửa ngay bây giờ.
hoosierEE

1
Có nên thay đổi "trang tốt của các hằng số HID khác nhau" thành phiên bản mới hơn của tệp đó từ các nguồn FreeBSD không? ?
crazysim
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.