Bộ mô tả báo cáo (Report Descriptor)

Một phần của tài liệu ĐATN-CÔNG NGHỆ THÔNG TIN tìm hiểu về chuẩn USB 2.0 và ứng dụng chuẩn USB để thiết kế điều khiển từ xa cho trình diễn PowerPoint (Trang 55)

Chương 5: Lớp thiết bị giao diện người sử dụng

5.5Bộ mô tả báo cáo (Report Descriptor)

Một bộ mô tả thông báo định nghĩa khuôn dạng và công dụng của dữ

liệu chứa trong các report. Ví dụ nếu thiết bị là một con chuột thì dữ liệu trong report sẽ thông báo cho máy chủ biết sự di chuyển của con chuột và sự click chuột, nếu thiết bị là một bộ điều khiển rơle thì dữ liệu trong báo cáo sẽ cho biết rơle nào mở và rơle nào đóng.

Bộ mô tả report cần phải đủ linh hoạt để điều khiển thiết bị với các mục

đích khác nhau. Dữ liệu lưu trong report cần được tối ưu hoá về kích thước để

tránh lãng phí không gian lưu trữ và rút ngắn thời gian khi truyền trên bus. Sau đây là một ví dụ về bộ mô tả report của một keyboard và sẽ trình bày một số kiến thức liên quan đến bộ mô tả report thông qua việc giải thích ví dụ này ( hiểu đầy đủ và cặn kẽ về bộ mô tả report là một điều không hề đơn giản vì vậy mà ví dụ này chỉ mới nêu ra được một phần kiến thức về bộ mô tả).

Để tạo bộ mô tả Report cho lớp HID ta sử dụng phần mềm “HID Descriptor Tool”, đây là một tiện ích miễn phí và có thể tải về từđịa chỉ sau:

http://apps.intel.com/scripts-

util/download.asp?url=/intelpress/usb/Examples/

ZipFiles/DT.zip&title=HID+Descriptor+Tool&fullpg=3&site=Developer

Ví dụ mẫu cho một bộ mô tả report của keyboard [8]

USAGE_PAGE (Generic Desktop) 05 01

USAGE (Keyboard) 09 06

COLLECTION (Application) A1 01

USAGE_PAGE (Keyboard) 05 07

USAGE_MINIMUM (Keyboard LeftControl) 19 E0 USAGE_MAXIMUM (Keyboard Right GUI) 29 E7

LOGICAL_MINIMUM (0) 15 00

LOGICAL_MAXIMUM (1) 25 01

REPORT_SIZE (1) 75 01

INPUT (Data, Var, Abs) 81 02

REPORT_COUNT (1) 95 01

REPORT_SIZE (1) 75 01

USAGE_PAGE (LEDs) 05 08

USAGE_MINIMUM (Num Lock) 19 01

USAGE_MAXIMUM (Kana) 29 05

OUTPUT (Data, Var, Abs) 91 02

REPORT_COUNT (1) 95 01

REPORT_SIZE (3) 75 03

OUTPUT (Cnst, Var, Abs) 91 03

REPORT_COUNT (6) 95 06

REPORT_SIZE (8) 75 08

LOGICAL_MINIMUM (0) 15 00 (adsbygoogle = window.adsbygoogle || []).push({});

LOGICAL_MAXIMUM (101) 25 65

USAGE_PAGE (Keyboard) 05 07

USAGE_MINIMUM (Reserved (no event indicated)) 19 00 USAGE_MAXIMUM (Keyboard Application) 29 65 INPUT (Data, Aray, Abs) 81 00 END_COLLECTION

Khi nhìn vào ví dụ trên ta thấy có 2 cột số phía bên phải, đó chính là các mã hex mà host nhận được khi nó gửi yêu cầu Get_Descriptor. Cột thứ nhất thể

hiện mã hex của một mục (một mục sẽđược viết bằng chữ in hoa), cột thứ hai là mã hex thể hiện các thiết lập cụ thể của mục. Bộ mô tả bắt đầu bằng mục USAGE_PAGE có mã hex là 05h, mục này chỉ ra chức năng tổng quát của thiết bị. Hai byte sau gọi là USAGE ID, trong ví dụ này có giá trị là 01h để chỉ

ra Generic Desktop. Generic Desktop là loại USAGE ID dùng cho các thiết bị

kiểu như bàn phím, con chuột hay joystick. Tiếp theo ta có mục USAGE, mục này thực chất chỉ là một USAGE ID của mục USAGE_PAGE, cột thứ nhất có giá trị là 09h để chỉ ra mục này là một USAGE ID, còn cột thứ hai có giá trị là 06h để chỉ ra loại USAGE ID này là Keyboard. Nhiều USAGE ID có thể có

cùng chung một USAGE_PAGE. Sau khi một USAGE_PAGE xuất hiện thì tất cả các USAGE ID theo sau nó đều là các USAGE ID của nó. Điều này được áp dụng cho đến khi xuất hiện một USAGE_PAGE mới. Mục đích của 2 dòng đầu trong bộ mô tả report ở trên là để báo cho host biết thiết bị của ta có công dụng tổng quát là Generic Desktop và chức năng cụ thể của nó là một keyboard. Dòng thứ ba là mục COLLECTION, mục này được dùng để nhóm các mục có liên quan với nhau. Có 3 loại COLLECTION được định nghĩa là application, physical và logical, ngoài ra còn một loại không được định nghĩa là Vendor defined. Một application COLLECTION chứa các mục có chung một mục đích hoặc các mục cùng thực hiện một chức năng đơn nhất. Tất cả các bộ mô tả

report đều phải có một application COLLECTION và các mục report (tức các mục của Input report, Output report hay feature report) phải được đặt trong application COLLECTION. Một COLLECTION sẽ kết thúc với mục END_COLLECTION.

Dòng tiếp theo là mục USAGE_PAGE (Keyboard), mục này chỉ ra chức năng của Input report bởi nó được khai báo trong phần của Input report. Phần khai báo của một report sẽ bắt đầu ngay sau mục COLLECTION hoặc ngay sau sự kết thúc của một report được khai báo trước nó và phần khai báo của một report kết thúc với mục INPUT nếu loại report là Input, OUTPUT nếu loại report là Output, FEATURE nếu loại report là feature. Như vậy phần khai báo cho input report trong ví dụ của ta bắt đầu với mục USAGE_PAGE (Keyboard) và kết thúc tại mục INPUT (Data, Var, Abs)

USAGE_MINIMUM và USAGE_MAXIMUM được dùng để gán chỉ số

cho một mảng các USAGE ID sẽ được sử dụng của USAGE_PAGE. USAGE_PAGE (Keyboard) có 232 USAGE được đánh chỉ số từ 0 (cho sự kiện không có phím nào được ấn) tới 231 (ứng với sự kiện phím Right GUI được

ấn). Đối với ví dụ ta đang xét thì hai mục USAGE_MINIMUM và USAGE_MAXIMUM chỉ ra rằng báo cáo INPUT sẽ cung cấp cho host sự kiện một trong các phím LeftControl (E0h), LeftShift (E1h), LeftAlt (E2h), LeftGUI

(E3h), RightControl (E4h), RightShift (E5h), RightAlt (E6h), RightGUI (E7h)

được ấn hay không.

LOGICAL_MINIMUM và LOGICAL_MAXIMUM định nghĩa giới hạn cho các giá trị được báo cáo. Giới hạn ở đây được hiểu là giới hạn logic, ví dụ

một thiết bị đo dòng điện trong dải từ 0A tới 10A có độ chia nhỏ nhất là 0.5A thì LOGICAL_MINIMUM có giá trị là 0 còn LOGICAL_MAXIMUM có giá trị là 20. Vì việc thông báo một phím được ấn tương đương với giá trị 1 còn không được ấn tương đương với giá trị 0 nên trong ví dụ này LOGICAL_MINIMUM có giá trị là 0 còn LOGICAL_MAXIMUM có giá trị

là 1.

REPORT_SIZE chỉ ra kích thước tính theo bit của một trường dữ liệu trong report, còn REPORT_COUNT chỉ ra số trường dữ liệu được chứa trong một report. Trong ví dụ của ta thì có thể thấy rằng report thông báo sự kiện

được ấn hay không của 8 phím nên sẽ có 8 trường và mỗi trường có kích thước 1 bit => REPORT_SIZE là 1 còn REPORT_COUNT là 8.

Mục INPUT chỉ ra sự kết thúc phần khai báo cho một Input report. Các thông số (Data, Var, Abs) có ý nghĩa như sau:

- Tại thuộc tính đầu ta có thể chọn là Data hoặc Cnst (constant). Data có nghĩa là nội dung của report có thể thay đổi được tức có thể đọc hoặc ghi nội dung của report một cách tuỳ ý. Cnst có nghĩa là nội dung của report không được phép thay đổi, ta chỉ có thể đọc nội dung của report mà thôi.

- Tại thuộc tính thứ hai ta có thể chọn là Ary (Array) hoặc Var (Variable). Trong ví dụ của chúng ta đã chọn là Var tức mỗi một phím sẽđược biểu diễn riêng bởi một trường => ta mất 8 trường cho 8 phím và phần dữ liệu của report sẽ có kích thước là một byte. Việc chọn là Var cho phép sự kiện nhiều phím cùng được ấn một lúc. Nếu cũng trong ví dụ trên mà ta chọn là Ary thì 8 phím sẽđược biểu diễn bởi một trường duy nhất và kích thước của trường tính theo bit là 3 => REPORT_SIZE là 3 còn REPORT_COUNT là 1. Nếu ta chọn

như vậy thì kích thước của report sẽ rất gọn song gặp phải nhược

điểm là nó sẽ chỉ có thể thông báo sự kiện một phím nào đó được ấn. Nếu có 2 phím trở lên được ấn đồng thời thì sự kiện này sẽ không

được phản ánh (Khi không có phím nào được ấn thì sẽ trả về gói NAK thay vì một report).

Một cách hoàn toàn tương tự ta có thể giải thích phần còn lại của ví dụ

(trong phần còn lại của ví dụ có khai báo một Output report cho việc hiển thị

các đèn led trên bàn phím và một Input report khác để thông tin sự kiện một phím không phải là phím đặc biệt được ấn (phím không đặc biệt trên bàn phím

được hiểu là các phím còn lại trên bàn phím sau khi đã loại trừ các phím Ctrl, Alt, Shift, GUI). (adsbygoogle = window.adsbygoogle || []).push({});

Một phần của tài liệu ĐATN-CÔNG NGHỆ THÔNG TIN tìm hiểu về chuẩn USB 2.0 và ứng dụng chuẩn USB để thiết kế điều khiển từ xa cho trình diễn PowerPoint (Trang 55)