Tìm hiểu về HID
Tuesday, 24. June 2008, 02:27:58
Như những bài trước mình đã nói qua về những nét chung nhất của USB, nó chỉ mang tính đặc tả để ta hình dung được một cách khái quát về hoạt động của USB
Nói chung khi thiết kế chuẩn USB bạn phải thực hiện những bước cơ bản đó là:
1. Đặc tả (mô tả thiết bị mà bạn cần thiết kế, chức năng, cách hoạt động v.v)
2. Viết chương trình cho chip (ở đây mình dung PIC loại 18f4550), mình dùng trình dịch của mikroelectronika có hỗ trợ HID)
3. Viết chương trinh trên máy tính, thông thường là sử dụng các hàm của lớp thư viện HID có thể dùng vb6 để thực hiện, nếu có khả năng thì viết driver cho thiết bị.
Nào bay giờ ta hãy tìm hiểu thêm về HID.
Human Interface Devices: Firmware Basics
Trước khi bạn có thể hiểu vấn để có thể sử dụng HID diriver truyền thông với thiết bị hay không, bạn cần phải hiểu rằng liệu thiết bị của bạn có tương thích với HID class.
Sự chỉ định một đề nghị giao diện tính người (human interface) có thể tương tác trực tiếp với con người. Một thiết bị có thể phát hiện (detect) khi người sử dụng nhấn phím hoặc di chuyển chuột v.v, hay host có thể gửi một vài thông điệp nào đó đến thiết bị. Ví dụ kinh điển của các HID là các bàn phím, chuột và các joytick.
Nhưng HID không hề có giao diện tính người chút nào. Nó chỉ cần có khả năng vận hành giới hạn trong đặc tả của lớp. Các vấn đề đó là các khả năng và giới hạn chính của lớp HID các thiết bị.
Dữ liệu trao đổi tập trung trong những cấu trúc gọi là các report (báo cáo). Vi chương trình (firmware) của thiết bị phải hỗ trợ định dạng report của HID. Host gửi và nhận dữ liệu bằng việc gửi và yêu cầu các báo cáo trong các kiểu truyền Điều khiển (Control transfer) hoặc Truyền ngắt (Interrupt Transfer).. Định dạng của report linh hoạt và có thể quản lý bất kỳ mọi kiểu dữ liệu nào.
Mỗi giao dịch có thể mang một số lượng nhỏ đến một lượng dữ liệu chừng mực nào đó. Với một thiết bị low-speed tối đa là 8byte mỗi giao dịch, full-speed là 64byte, high-speed là 1024 byte. Một report dài có thể sử dụng nhiều giao dịch.
Một thiết bị có thể gửi thông tin cho máy tính tại những thời điểm không dự báo trước. Ví dụ như thông tin từ bàn phím gửi vào máy tính .v.v.
Tốc độ truyền tối đa của các kiều truyền là có giới hạn, đặc biệt là ở tốc độ full và low.
Mặc dầu các HID phần lớn gửi dữ liệu từ thiết bị đến host, nhưng HID cũng có thể nhận dữ liệu từ host. Ví dụ thông thường là HID truyền thông nhận một “lực phản hồi” từ cần điều khiển của joystick.
Bất kỳ lớp nào có thể tồn tại trong các giới hạn của lớp thì đều có thể trở thành một HID. Sự đặc tả này đề cập đến các bộ đọc mã vạch, nhiệt kế, và đo điện áp là các ví dụ về HID mà không có giao diện người dùng truyền thống. tất cả chúng đều gửi dữ liệu đến máy tính và cũng có thể nhận các request cấu hình thiết bị.
Hai tài liệu quan trọng để làm việc với các HID là Deivce class definition (Định nghĩa lớp thiết bị) cho HID định nghĩa các lớp HID, và HID Usage Tables (Các bảng sử dụng HID) định nghĩa các giá trị giúp cho host hiểu và sử dụng dữ liệu HID.
Hardware Requirements (Yêu cầu phần cứng)
Một giao diện HID phải phù hợp với các yêu cầu của HID class như đã định nghĩa trong đặc tả. Tài liệu mô tả yêu cầu của các bộ mô tả, tần số các kiểu truyền, và các kiểu truyền sẳn có. Để tuân thủ đúng với đặc tả, các endpoint và các bộ mô tả phải của giao diện phải đáp ứng một vài yêu cầu.
Các Endpoint
Tất cả truyền HID đều sử dụng các Default Control Pipe hoặc các ống ngắt. Một HID phải có một endpoint ngắt IN để gửi dữ liệu đến host. Một endpoint ngắt OUT tùy theo.
The Control Pipe
Ống điều khiển của HID mang các reqest chuẩn USB như sáu request lớp đặc biệt được định nghĩa trong đặc tả HID. Hai trong các request này là Set_Report và Get_Report cung cấp thông tin cho host và thiết bị để truyền một khối của bất kỳ loại dữ liệu nào đi tới hoặc từ thiết bị. Host sử dụng Set_Report để gửi các report (báo cáo) và Get_Report để nhận các Report. Bốn yêu cầu khác đều liên quan đến cấu hình thiết bị: Set_Idle và Get_Idle thiết lập và đọc tốc độ Idle (tốc độ khi đường truyền rỗi). Set_Protocol và Get _Protocol dùng để thiết lập và đọc giá trị của nghi thức, nó giúp cho thiết bị vận hành với một nghi thức được đơn giản hóa khi dirver HID chưa được load trên host.
Firmware Requirements
Để driver của host truyền thông được với HID thì vi chương trình của thiết bị phải phù hợp các yêu cầu. Các descriptor (bộ mô tả) của thiết bị phải nhận dạng thiết bị như giao diện HID, và vi chương trình phải hỗ trợ một ngắt ở endpoint ngoài Default Control Pipe. Vi chương trình phải chứa một báo cáo mô tả định dạng cho việc truyền và nhận dữ liệu.
Để gửi dữ liệu, yêu cầu vi chương trình hỗ trợ Get_Report với truyền điều khiển và truyền ngắt theo hướng từ thiết bị đến Host - IN, và để nhận được dữ liệu, vi chương trình phải hỗ trợ Set_Report với truyền điều khiển và cũng có thể truyền ngắt với hướng truyền dữ liệu từ Host đến thiết bị -OUT
Tất cả dữ liệu HID phải sử dụng report cùng định dạng, trong đó đã xác định kích thước và nội dung dữ liệu. Các thiết bị có thể hỗ trợ một hoặc nhiều report. Một bộ mô tả report trong vi chương trình của thiết bị cũng mô tả các report đó , và cũng có thể có những thông tin về dữ liệu của máy thu sử dụng như thế nào
Giá trị trong mỗi report định nghĩa report như một Input, Output, hoặc tính năng (Feature). Host nhận dữ liệu trong report Input và gửi dữ liệu trong Report output. Report Feature có thể có trong cả hai hướng Input và Output.
Với Input report, driver HID từ win98 trở về sau đều sử dụng truyền ngắt. Với Output report, kiểu truyền phụ thuộc vào điểm cuối nào trên thiết bị hỗ trợ và phiên bản của windows.Với phiên bản cũ của win98 (Windows 98 Gold) tương thích với HID 1.0, và HID sử dụng kiểu truyền điều khiển cho Output report. Với win98SE win2000 WinMe tương thích với HID 1.1, HID sử dụng truyền ngắt cho Output Report nếu giao diện có một điểm cuối ngắt OUT, mặt khác nó cũng sử dụng kiểu truyền điều khiển. Nếu giao diện HID không có điểm cuối ngắt OUT hay nếu vi chương trình hỗ trợ cả hai kiểu truyền cho Output Report, HID sẽ tương thích với bất kỳ phiên bản Windows nào. Các report Feature luôn hỗ trợ kiểu truyền điều khiển. định dạng report có thể đơn giản hoặc phức tạp
Identifying a Device as a HID (Làm sao nhận biết thiết bị như một HID)
Cũng như với bất kỳ thiết bị USB nào, descriptor của HID “nói với” Host yêu cầu mà nó cần biết để giao tiếp với thiết bị. Mục 13-1 cho thấy, configuration (Cấu hình) , giao diện, lớp và những bộ mô tả endpoint của một HID-Class joystick. Host sẽ biết về giao diện HID khi nó gửi một yêu cầu Get_Descriptor cho cấu hình chứa giao diện HID. Bộ mô tả giao diện của cấu hình nhận biết giao diện như HID-Class. Bộ mô tả HID-Class chỉ rõ số bộ mô tả báo cáo được hỗ trợ bởi giao diện. Trong quá trình liệt kê, HID driver sẽ lấy các thông tin về HID class và report descriptor.
Nội dung Bộ mô tả(Descriptor Contents)
Những bộ mô tả thiết bị và cấu hình không có thông tin HID riêng. Bộ mô tả thiết bị có một trường dành cho mã lớp (class-code), nhưng không phải ở đâu thiết bị cũng được định nghĩa như một HID. Thay vào đó, bộ mô tả giao diện ở trên Host biết đó là thiết bị, hay còn gọi là giao diện thiết bị, thuộc về lớp HID. Nếu byte class-code trong bộ mô tả giao diện của thiết bị là 3, giao diện là một HID. Những trường khác chứa thông tin riêng của HID trong bộ mô tả giao diện là các trường subclass và protocol, đó là những trường có thể chỉ một giao diện khởi động (Boot interface).
(Còn tiếp)
Nói chung khi thiết kế chuẩn USB bạn phải thực hiện những bước cơ bản đó là:
1. Đặc tả (mô tả thiết bị mà bạn cần thiết kế, chức năng, cách hoạt động v.v)
2. Viết chương trình cho chip (ở đây mình dung PIC loại 18f4550), mình dùng trình dịch của mikroelectronika có hỗ trợ HID)
3. Viết chương trinh trên máy tính, thông thường là sử dụng các hàm của lớp thư viện HID có thể dùng vb6 để thực hiện, nếu có khả năng thì viết driver cho thiết bị.
Nào bay giờ ta hãy tìm hiểu thêm về HID.
Human Interface Devices: Firmware Basics
- Lớp HID là một trong những lớp đầu tiên được hỗ trợ bởi windows. Trên các PC chạy trên hệ điều hành Win98 hoặc trở về sau, các ứng dụng có thể truyền thông với các HID sử dụng các driver được xây dựng trong hệ điều hành.
Trước khi bạn có thể hiểu vấn để có thể sử dụng HID diriver truyền thông với thiết bị hay không, bạn cần phải hiểu rằng liệu thiết bị của bạn có tương thích với HID class.
Sự chỉ định một đề nghị giao diện tính người (human interface) có thể tương tác trực tiếp với con người. Một thiết bị có thể phát hiện (detect) khi người sử dụng nhấn phím hoặc di chuyển chuột v.v, hay host có thể gửi một vài thông điệp nào đó đến thiết bị. Ví dụ kinh điển của các HID là các bàn phím, chuột và các joytick.
Nhưng HID không hề có giao diện tính người chút nào. Nó chỉ cần có khả năng vận hành giới hạn trong đặc tả của lớp. Các vấn đề đó là các khả năng và giới hạn chính của lớp HID các thiết bị.
Dữ liệu trao đổi tập trung trong những cấu trúc gọi là các report (báo cáo). Vi chương trình (firmware) của thiết bị phải hỗ trợ định dạng report của HID. Host gửi và nhận dữ liệu bằng việc gửi và yêu cầu các báo cáo trong các kiểu truyền Điều khiển (Control transfer) hoặc Truyền ngắt (Interrupt Transfer).. Định dạng của report linh hoạt và có thể quản lý bất kỳ mọi kiểu dữ liệu nào.
Mỗi giao dịch có thể mang một số lượng nhỏ đến một lượng dữ liệu chừng mực nào đó. Với một thiết bị low-speed tối đa là 8byte mỗi giao dịch, full-speed là 64byte, high-speed là 1024 byte. Một report dài có thể sử dụng nhiều giao dịch.
Một thiết bị có thể gửi thông tin cho máy tính tại những thời điểm không dự báo trước. Ví dụ như thông tin từ bàn phím gửi vào máy tính .v.v.
Tốc độ truyền tối đa của các kiều truyền là có giới hạn, đặc biệt là ở tốc độ full và low.
Mặc dầu các HID phần lớn gửi dữ liệu từ thiết bị đến host, nhưng HID cũng có thể nhận dữ liệu từ host. Ví dụ thông thường là HID truyền thông nhận một “lực phản hồi” từ cần điều khiển của joystick.
Bất kỳ lớp nào có thể tồn tại trong các giới hạn của lớp thì đều có thể trở thành một HID. Sự đặc tả này đề cập đến các bộ đọc mã vạch, nhiệt kế, và đo điện áp là các ví dụ về HID mà không có giao diện người dùng truyền thống. tất cả chúng đều gửi dữ liệu đến máy tính và cũng có thể nhận các request cấu hình thiết bị.
Hai tài liệu quan trọng để làm việc với các HID là Deivce class definition (Định nghĩa lớp thiết bị) cho HID định nghĩa các lớp HID, và HID Usage Tables (Các bảng sử dụng HID) định nghĩa các giá trị giúp cho host hiểu và sử dụng dữ liệu HID.
Hardware Requirements (Yêu cầu phần cứng)
Một giao diện HID phải phù hợp với các yêu cầu của HID class như đã định nghĩa trong đặc tả. Tài liệu mô tả yêu cầu của các bộ mô tả, tần số các kiểu truyền, và các kiểu truyền sẳn có. Để tuân thủ đúng với đặc tả, các endpoint và các bộ mô tả phải của giao diện phải đáp ứng một vài yêu cầu.
Các Endpoint
Tất cả truyền HID đều sử dụng các Default Control Pipe hoặc các ống ngắt. Một HID phải có một endpoint ngắt IN để gửi dữ liệu đến host. Một endpoint ngắt OUT tùy theo.
The Control Pipe
Ống điều khiển của HID mang các reqest chuẩn USB như sáu request lớp đặc biệt được định nghĩa trong đặc tả HID. Hai trong các request này là Set_Report và Get_Report cung cấp thông tin cho host và thiết bị để truyền một khối của bất kỳ loại dữ liệu nào đi tới hoặc từ thiết bị. Host sử dụng Set_Report để gửi các report (báo cáo) và Get_Report để nhận các Report. Bốn yêu cầu khác đều liên quan đến cấu hình thiết bị: Set_Idle và Get_Idle thiết lập và đọc tốc độ Idle (tốc độ khi đường truyền rỗi). Set_Protocol và Get _Protocol dùng để thiết lập và đọc giá trị của nghi thức, nó giúp cho thiết bị vận hành với một nghi thức được đơn giản hóa khi dirver HID chưa được load trên host.
Firmware Requirements
Để driver của host truyền thông được với HID thì vi chương trình của thiết bị phải phù hợp các yêu cầu. Các descriptor (bộ mô tả) của thiết bị phải nhận dạng thiết bị như giao diện HID, và vi chương trình phải hỗ trợ một ngắt ở endpoint ngoài Default Control Pipe. Vi chương trình phải chứa một báo cáo mô tả định dạng cho việc truyền và nhận dữ liệu.
Để gửi dữ liệu, yêu cầu vi chương trình hỗ trợ Get_Report với truyền điều khiển và truyền ngắt theo hướng từ thiết bị đến Host - IN, và để nhận được dữ liệu, vi chương trình phải hỗ trợ Set_Report với truyền điều khiển và cũng có thể truyền ngắt với hướng truyền dữ liệu từ Host đến thiết bị -OUT
Tất cả dữ liệu HID phải sử dụng report cùng định dạng, trong đó đã xác định kích thước và nội dung dữ liệu. Các thiết bị có thể hỗ trợ một hoặc nhiều report. Một bộ mô tả report trong vi chương trình của thiết bị cũng mô tả các report đó , và cũng có thể có những thông tin về dữ liệu của máy thu sử dụng như thế nào
Giá trị trong mỗi report định nghĩa report như một Input, Output, hoặc tính năng (Feature). Host nhận dữ liệu trong report Input và gửi dữ liệu trong Report output. Report Feature có thể có trong cả hai hướng Input và Output.
Với Input report, driver HID từ win98 trở về sau đều sử dụng truyền ngắt. Với Output report, kiểu truyền phụ thuộc vào điểm cuối nào trên thiết bị hỗ trợ và phiên bản của windows.Với phiên bản cũ của win98 (Windows 98 Gold) tương thích với HID 1.0, và HID sử dụng kiểu truyền điều khiển cho Output report. Với win98SE win2000 WinMe tương thích với HID 1.1, HID sử dụng truyền ngắt cho Output Report nếu giao diện có một điểm cuối ngắt OUT, mặt khác nó cũng sử dụng kiểu truyền điều khiển. Nếu giao diện HID không có điểm cuối ngắt OUT hay nếu vi chương trình hỗ trợ cả hai kiểu truyền cho Output Report, HID sẽ tương thích với bất kỳ phiên bản Windows nào. Các report Feature luôn hỗ trợ kiểu truyền điều khiển. định dạng report có thể đơn giản hoặc phức tạp
Identifying a Device as a HID (Làm sao nhận biết thiết bị như một HID)
Cũng như với bất kỳ thiết bị USB nào, descriptor của HID “nói với” Host yêu cầu mà nó cần biết để giao tiếp với thiết bị. Mục 13-1 cho thấy, configuration (Cấu hình) , giao diện, lớp và những bộ mô tả endpoint của một HID-Class joystick. Host sẽ biết về giao diện HID khi nó gửi một yêu cầu Get_Descriptor cho cấu hình chứa giao diện HID. Bộ mô tả giao diện của cấu hình nhận biết giao diện như HID-Class. Bộ mô tả HID-Class chỉ rõ số bộ mô tả báo cáo được hỗ trợ bởi giao diện. Trong quá trình liệt kê, HID driver sẽ lấy các thông tin về HID class và report descriptor.
Nội dung Bộ mô tả(Descriptor Contents)
Những bộ mô tả thiết bị và cấu hình không có thông tin HID riêng. Bộ mô tả thiết bị có một trường dành cho mã lớp (class-code), nhưng không phải ở đâu thiết bị cũng được định nghĩa như một HID. Thay vào đó, bộ mô tả giao diện ở trên Host biết đó là thiết bị, hay còn gọi là giao diện thiết bị, thuộc về lớp HID. Nếu byte class-code trong bộ mô tả giao diện của thiết bị là 3, giao diện là một HID. Những trường khác chứa thông tin riêng của HID trong bộ mô tả giao diện là các trường subclass và protocol, đó là những trường có thể chỉ một giao diện khởi động (Boot interface).
(Còn tiếp)