選擇語言Bahasa Indonesia (Bahasa Indonesia)Bahasa Malaysia (Malay)Čeština (Czech)Dansk (Danish)Deutsch (German)English (English)Español (Spanish)繁體中文 (Chinese (Traditional))Français (French)한국어 (Korean)Italiano (Italian)简体中文 (Chinese (Simplified))Nederlands (Dutch)日本語 (Japanese)Norsk (Norwegian)Polski (Polish)Português (Portuguese)Română (Romanian)Русский (Russian)Svenska (Swedish)Tagalog (Tagalog)ภาษาไทย (Thai)Türkçe (Turkish)العربية (Arabic)
/* USB Standard Device Descriptor */ const uint8_t RHID_DeviceDescriptor[RHID_SIZ_DEVICE_DESC] = { RHID_SIZ_DEVICE_DESC, // общая длина дескриптора устройства в байтах USB_DEVICE_DESCRIPTOR_TYPE, // bDescriptorType — показывает, что это за дескриптор. В данном случае — Device descriptor 0x00, 0x02, // bcdUSB — какую версию стандарта USB поддерживает устройство. 2.0 // класс, подкласс устройства и протокол, по стандарту USB. У нас нули, означает каждый интерфейс сам за себя 0x00, //bDeviceClass 0x00, //bDeviceSubClass 0x00, //bDeviceProtocol 0x40, //bMaxPacketSize — максимальный размер пакетов для Endpoint 0 (при конфигурировании) // те самые пресловутые VID и PID, по которым и определяется, что же это за устройство. 0x83, 0x04, //idVendor (0x0483) 0x11, 0x57, //idProduct (0x5711) DEVICE_VER_L, DEVICE_VER_H, // bcdDevice rel. DEVICE_VER_H.DEVICE_VER_L номер релиза устройства // дальше идут индексы строк, описывающих производителя, устройство и серийный номер. // Отображаются в свойствах устройства в диспетчере устройств // А по серийному номеру подключенные устройства с одинаковым VID/PID различаются системой.
/* USB Configuration Descriptor */ /* All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */ const uint8_t RHID_ConfigDescriptor[RHID_SIZ_CONFIG_DESC] = { 0x09, // bLength: длина дескриптора конфигурации USB_CONFIGURATION_DESCRIPTOR_TYPE, // bDescriptorType: тип дескриптора — конфигурация RHID_SIZ_CONFIG_DESC, 0x00, // wTotalLength: общий размер всего дерева под данной конфигурацией в байтах 0x01, // bNumInterfaces: в конфигурации всего один интерфейс 0x01, // bConfigurationValue: индекс данной конфигурации 0x00, // iConfiguration: индекс строки, которая описывает эту конфигурацию 0xE0, // bmAttributes: признак того, что устройство будет питаться от шины USB 0x32, // MaxPower 100 mA: и ему хватит 100 мА /************** Дескриптор интерфейса ****************/ 0x09, // bLength: размер дескриптора интерфейса USB_INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType: тип дескриптора — интерфейс 0x00, // bInterfaceNumber: порядковый номер интерфейса — 0 0x00, // bAlternateSetting: признак альтернативного интерфейса, у нас не используется 0x02, // bNumEndpoints — количество эндпоинтов.
const uint8_t RHID_ReportDescriptor[RHID_SIZ_REPORT_DESC] =
{
0x06, 0x00, 0xff, // USAGE_PAGE (Generic Desktop)
0x09, 0x01, // USAGE (Vendor Usage 1)
0xa1, 0x01, // COLLECTION (Application)
0x85, 0x01, // REPORT_ID (1)
0x09, 0x01, // USAGE (Vendor Usage 1)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x01, // REPORT_COUNT (1)
0xb1, 0x82, // FEATURE (Data,Var,Abs,Vol)
0x85, 0x01, // REPORT_ID (1)
0x09, 0x01, // USAGE (Vendor Usage 1)
0x91, 0x82, // OUTPUT (Data,Var,Abs,Vol)
0x85, 0x02, // REPORT_ID (2)
0x09, 0x02, // USAGE (Vendor Usage 2)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x01, // REPORT_COUNT (1)
0xb1, 0x82, // FEATURE (Data,Var,Abs,Vol)
0x85, 0x02, // REPORT_ID (2)
0x09, 0x02, // USAGE (Vendor Usage 2)
0x91, 0x82, // OUTPUT (Data,Var,Abs,Vol)
0x85, 0x03, // REPORT_ID (3)
0x09, 0x03, // USAGE (Vendor Usage 3)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
0x75, 0x08, // REPORT_SIZE (8)
0x95, RPT3_COUNT, // REPORT_COUNT (N)
0xb1, 0x82, // FEATURE (Data,Var,Abs,Vol)
0x85, 0x03, // REPORT_ID (3)
0x09, 0x03, // USAGE (Vendor Usage 3)
0x91, 0x82, // OUTPUT (Data,Var,Abs,Vol)
0x85, 0x04, // REPORT_ID (4)
0x09, 0x04, // USAGE (Vendor Usage 4)
0x75, 0x08, // REPORT_SIZE (8)
0x95, RPT4_COUNT, // REPORT_COUNT (N)
0x81, 0x82, // INPUT (Data,Var,Abs,Vol)
0xc0 // END_COLLECTION
}
Описывает протокол обмена и функционал устройства.
RPT3_COUNT — размер OUTPUT буфера в байтах для передачи пакета в МК
RPT4_COUNT — размер INPUT буфера в байтах для передачи пакета в ПК
Размер любого из этих буферов не должен превышать wMaxPacketSize. Меньше — можно.
Кстати, превратить Custom HID в другой HID девайс, например, клавиатуру или джойстик можно фактически только переписав ReportDescriptor и изменив класс и подкласс устройства в дескрипторе конфигурации.
Report
Хост (ПК) и девайс (МК) обмениваются пакетами данных заранее оговоренной структуры — report. Пакетов может быть весьма много, их можно предусмотреть на все случаи жизни — например пакет с данными о каких-то событиях в устройстве, пакет с данными, которые запрашивал ПК, пакет с командой для МК. Все, что угодно. Но структура всех пакетов должна быть описана в структуре RHID_ReportDescriptor.
Если вы не до конца разобрались в том, как формировать дескриптор репортов, то просто меняйте константы RPT3_COUNT и RPT4_COUNT, устанавливая нужный размер исходящих и входящих (с точки зрения ПК) пакетов. Остальные репорты можно просто не трогать, они не помешают. Не забывайте, что первым байтом должен быть ID репорта.
https://habrahabr.ru/post/208026/
Определение класса устройств для HID 1. 11 предназначено для дополнения спецификации USB и предоставления производителям HID информации, необходимой для создания USB-совместимых устройств. Он также указывает, как драйвер класса HID должен извлекать данные с USB-устройств. Основными и основными целями определения класса HID являются:
В документе Таблицы использования HID 1.4 определяются константы (использования), которые могут интерпретироваться приложением для определения цели и значения поля данных в отчете HID. Использование также используется для определения значения групп связанных элементов данных. Это достигается путем иерархического присвоения информации об использовании коллекциям.
Использование определяет цель коллекции и элементы, которые она содержит. Каждому элементу данных Input, Output, Feature и/или Collection в элементе Collection может быть назначена цель с собственным элементом Usage. Использование, назначенное коллекции, применяется к элементам в коллекции.
Документы с интегрированной таблицей использования
Документ HID Usage Tables 1.4 также включает все определения использования в виде файла JSON в виде приложения к PDF. PDF служит «единственным» источником правды.
Следующие запросы на пересмотр таблицы использования HID (HUTRR) были одобрены для реализации Комитетом HID рабочей группы USB-устройств (HID-WG). HUTRR присваивают идентификаторы и рекомендуемое значение новым использованиям, выделенным после публикации последних таблиц использования HID (в настоящее время версии 1.4). Все HUTRR будут включены в пересмотренный документ HUT в начале следующего года. Запросы на проверку интегрированной таблицы использования.
Примечание: Создание нового варианта использования не подразумевает поддержку этого варианта использования каким-либо поставщиком хоста USB HID.
Члены HID-WG могут запросить внесение изменений в таблицы использования HID (HUT), заполнив и отправив форму HUTRR ниже. Пожалуйста, обратите внимание на правила голосования и подачи заявок в конце документа.
HUTRRXXX-Template.docx28,06 КБ
HUTRRXXX-Template.txt2,15 КБ
Определение класса устройств для PID 1.0 предоставляет информацию для разработки устройств физического интерфейса. К таким устройствам относятся джойстики с обратной связью по усилию, рулевые колеса и т. д. Это позволяет разработчикам периферийных устройств и драйверов использовать общий набор дескрипторов отчетов HID, использования устройств и отчетов для описания характеристик устройств класса PID.
Waratah — это инструмент для составления дескрипторов HID. Он предлагает высокий уровень абстракции, устраняет распространенные ошибки (по задумке) и оптимизирует дескриптор для уменьшения размера байта. Он реализует спецификацию HID 1.11, поэтому разработчикам не нужно этого делать.
Автор Microsoft, выпущен под лицензией MIT OSS.
Microsoft.HidTools.HidSpecification — Справочник по константам, единицам измерения и общедоступным использованиям спецификации HID
Microsoft.HidTools.HidEngine — Механизм дескриптора отчетов HID. Основной корпус Waratah.
Устаревшие ссылки и инструменты ư chuột máy tính, bàn phím, звуковая карта… Vi điều khiển STM32 hỗ trợ giao thức HID Device giúp chung ta có thể lập trình tạo ra các sản phẩm giong như những thiết bị đó. Bài hôm nay minh sẽ nói đến USB HID Mouse, lam thế nào để nó có thể truyền nhận dữ liu với máy tính, hay cung tìm hiểu nhéu!
Bài 17 trong Serie Học lập trình STM32 từ A tới Z
Mục Lục
HID (viết tắt của Human Interface Device) là một tiêu chuẩn cho các thiết bị may tính được vận hanh bởi con người. Tiêu chuẩn này cho phép dễ dàng sử dụng các thiết bị này mà không cần bất kỳ phần mềm hoặc trình điều khiển bổ sung nao.
HID là một tiêu chuẩn được tạo ra nhằm đơn giản hóa qua trình cài đặt cac thiết bᩋ đầu vào thong qua tng ể cho từng thiết bị như chuột, bàn phím,… Một thiết bị tuân thủ HID bao gồm “ гои ду лью» có thể chứa tất cả cac hành động của thiết bị.
Ví dụ: Bàn phím có thể có một phím để điều chỉnh am lượng. Khi nhấn phím đó, «bộ mô tả HID» sẽ cho máy tính biết mục đích của hành động đó được lưu trữ trong các goi tin ở Ļđau và lụl ợc thực thi.
Thiet bị HID và Host (may chủ) giao tiếp với nhau qua kiểu Передача управления (до конечной точки 0). Sử dụng Ngắt tại chiều IN và tùy chọn ở chiều Out. Đặc tả của lớp HID cho phép chung có thể truyền dữ liệu ở cả tốc dộ низкая скорость, полная скорость và высокая скорость.
Trước khi máy chủ có thể nói chuyện với thiết bị, nó cần biết cách sử dụng hoặc ứng dụng của thiẬnàt bị? Dữ liệu của nó được tổ chức như thế nào? và Dữ liệu thực sự đo lường điều gì?
Lấy ví dụ: Nếu thiết bị của bạn la một con chuột máy tính, cac nút bấm và tọa độ sẽ niu khiển Pointer me trìn. Sự kiện нажмите hoặc правой кнопкой мыши sẽ лам ги, прокрутите sẽ лам ги. Để tất cả cac sự kiện đó được sảy ra, trình điều khiển lớp HID phải biết rõ:
Tất cả cac thông tin này sẽ được mô tả trong phần Дескриптор отчета. Khi trình điều khiển phân tích cú pháp của Report Descriptor nó sẽ hiểu được khi thiết bị chuột máy tính truyền dữ liệu lênà, ữữnlià ộc ứng dụng nào của máy tính. (Tương tự bạn phân luồng dữ liệu UART vậy).
Khi một thiết bị HID được kết nối, Host sẽ tạo ra 1 Request GET_DESCRIPTOR, sau khi hoàn tất qua trình. Chuột может tính và может tính sẽ giao tiep với nhau mà ko cần thêm водитель gì cả.
Bộ Дескриптор отчета t bị USB HID устройства Truyền hoặc nhận. Mỗi mục bắt đầu bằng tiền tố là 1 Byte quy định vai trò của mục và độ dài dữ liệu của nó.
Mỗi mục чиа лам 3 loại thẻ chính:
Mỗi loại thẻ bao gồm một số loại chính như:
Với Основной предмет:
Với Global Item:
Với Local Item:
Mỗi thẻ mục sẽ được phân loại tương ứng với 1 mã từ 0–255 (1 байт).
Cấu trúc của Дескриптор отчета như sau:
Lấy ví dụ về đỏ cấu hình 3 nút nhấn của chuột, phần khoanh xanh cấu hình tọa độ của чут.
Phần Usage Page và Usage xác định kiểu thiết bị đó là Mouse và thuộc may tính để bàn (Generic Desktop).
Cac bạn có thể tham khảo link này để phân tích 1 RD: https://www.crifan.com/files/doc/docbook/usb_hid/release/webhelp/hid_report_example_analysis.html USB HID
Phần mềm gửi và nhận dữ liệu HID-терминал:
Ссылка для загрузки: HID-терминал
Инструменты giải mã дескриптор отчета.
http://eleccelerator.com/usbdescreqparser/
Để sử dụng kit stm32f103c8t6 Bluepill thành chuột may tính chung phant ta cần ệu truyền lên máy tính của 1 con chuột.
Cấu trúc dữ liệu truyền lên bao gồm:
Chung ta sẽ sử dụng Joystick đọc ADC 2 kenh X Y và nút nhấn trên nó sẽ tương ứng với phím Щелкните левой кнопкой мыши.
Mỗi khi có sử kiện nhấn nut hoặc di chuyển, chung ta sử gửi dữ liệu theo goi thong qua USB HID.
Trong bài này này mình sẽ sử dụng AgiDC Joystick đểụng thị trục X, Y. Và nút nhấn trên Джойстик biểu thị cho Left_Button трен чуут может быть.
Mở CubeMx, чип STM32f103C8T6, trong System Core
SYS chọn Debug Serial Wire: cho phép debug qua stlinkRCC chọn HSE: Thạch anh ngoạiGPIO chọn PA2 là nút nhấn Pull Up
Trong Tab Analog ta sẽ cẽu hình ADC1 để 0 đọc giá n 2 kenh In1 và In2. Bật chế độ сканирование và cont. Nhớ chọn Num of Con là 2 và chỉnh cac chanel về đúng 0 và 1Add DMA từ ADC về Memory, chế độ Circular và Width là Half Word
Thiet lập USB
Chộđchn USB Device (Full Speed) ọn HID trong Class của MiddlewareThiet lập Clock cho USB là 48Mhz (Bắt buộc)
Đặt tên bài học rồi Gen code như tất cả các bài trước
Sau đó extern biến chứa giá trị cài đặt của USB vào main
Khi chọn chế độ USB HID, CubeMX đã mặc định chọn thiet bị HID đó là chuột может быть. Chúng ta cùng phân tích Дескриптор отчета mà CubeMx đã cho sẵn nhé. Các bạn vào USBD_HID.c và tìm dòng code như sau:
Копировать đoạn dữ liệu và paste vào công cụ phân tích minh vừa mới nêu trên: http://eleccelerator.com/usbdescreqparser/
Kảph phât ph ан тик сэ нхо сау:
0x05, 0x01, / / Страница использования (общие элементы управления рабочего стола) 0x09, 0x02, // Использование (мышь) 0xA1, 0x01, // Коллекция (приложение) 0x09, 0x01, // Использование (указатель) 0xA1, 0x00, // Коллекция (физическая) 0x05, 0x09, // Страница использования (кнопка) 0x19, 0x01, // Минимум использования (0x01) 0x29, 0x03, // Максимальное использование (0x03) 0x15, 0x00, // Логический минимум (0) 0x25, 0x01, // Логический максимум (1) 0x95, 0x03, // Количество отчетов (3) 0x75, 0x01, // Размер отчета (1) 0x81, 0x02, // Ввод (данные, переменная, абс, без переноса, линейный, предпочтительное состояние, без нулевой позиции) 0x95, 0x01, // Количество отчетов (1) 0x75, 0x05, // Размер отчета (5) 0x81, 0x01, // Ввод (Const, Array, Abs, No Wrap, Linear, Preferred State, No Null Position) 0x05, 0x01, // Страница использования (общие элементы управления рабочего стола) 0x09, 0x30, // Использование (X) 0x09, 0x31, // Использование (Y) 0x09, 0x38, // Использование (Колесо) 0x15, 0x81, // Логический минимум (-127) 0x25, 0x7F, // Логический максимум (127) 0x75, 0x08, // Размер отчета (8) 0x95, 0x03, // Количество отчетов (3) 0x81, 0x06, // Ввод (данные, переменная, относительная, без переноса, линейный, предпочтительное состояние, без нулевой позиции) 0xC0, // Конец коллекции 0x09, 0x3C, // Использование (Пробуждение движением) 0x05, 0xFF, // страница использования (зарезервировано 0xFF) 0x09, 0x01, // Использование (0x01) 0x15, 0x00, // Логический минимум (0) 0x25, 0x01, // Логический максимум (1) 0x75, 0x01, // Размер отчета (1) 0x95, 0x02, // Количество отчетов (2) 0xB1, 0x22, // Функция (данные, переменная, абс, без переноса, линейная, без предпочтительного состояния, без нулевой позиции, энергонезависимая) 0x75, 0x06, // Размер отчета (6) 0x95, 0x01, // Количество отчетов (1) 0xB1, 0x01, // Функция (Const, Array, Abs, No Wrap, Linear, Preferred State, No Null Position, энергонезависимая) 0xC0, // Конец коллекции // 74 байта
Ta thấy rằng trình tự cac byte gửi như sau:
1 байт nút nhấn -> 3 байта X, Y, Whell -> 2 байта Wakeup -> 1 байт kết thúc
ốốốyốy byte chỉ cần đếm trong các oạn Количество отчетов theo thứ tự từ trên xuống dưới. Còn ý nghĩa của cac từ mình đã giải thích ben trên rồi nhé.
Vậy nên chúng ta sẽ tạo 1 mảng chứa giá trị của cac byte gửi lên với 1byte kết thúc là mặc định nênà ko cần th. Минь то монг mouse_report[5], và mảng lưu 2 giá trị ADC1 truyền qua DMA
Trước Main ta sẽlập trình như sau
Tạo một ham tên là map để chuyển đổi giá trì như 9, thị tị 6 tị tị 127
Tạo ham đọc giá trị nút nhấn, thực hiện chuyển đổi và ghi vào mảng mouse_report
Trước While cho bắt đầu chuyển đổi ADC DMA, Trong While ta đọc giá trị của mouse và gửi qua cổng USB HID
Kết nối và chạy thử USB HIDNhấn F7 để Build và F8 để nạp Code vào Kit.
Kết nối Джойстик vào Kit theo hướng dẫn:
5V —> 3.3V
GND —> GND
300-9003> 0005
VRY —> PA1
SW —> PA2
Каждый день Micro USB vào mạch và cắm đầu còn lại vào may tính. Mở Manager ra xem bạn sẽ thấy thêm 1 thiết bị Мышь
Mở Paint Sử dụng Джойстик điều khiển thử.
Ta thấy rằng chuột chạy qua nhanh, không thể kiem xoát và khi khong di chuyển chuột cung vẫn tự chạy. Lý do đó là điểm cân bằng của Joystick không giung lý thuyết đó la giá trị 2048.
Và chuột chạy qua nhanh do mạch sẽ gủi cac giá trị từ -127 đến 127 cực nhanh khi giu Джойстик, cac tọa độ này khiẙt chun chu нханх. Vậy làm ntn để hiệu chỉnh hai thứ đó
Rút dây cắm HID từ chuột ra, chạy chu debug.
Trong debug ta add giá trị ADC_Val vào Watch 1 và nhấn chạy chương trình. Chung ta thấy rằng: giá trị can bằng khac nhau dẫn tới chuột luôn luon di chuyển.
Sửa lại trong ham Get Action, như sau:
Sửa -127, 127 thành -10 và 10 sẽ giúp chuột di chuyển chậm hơn.
Nạp và chạy thử kết quả
STM32 USB HID điện thoi, геймпад một cách đơn giản nhất. Về cơ bản tất cả các device sử dụng USB HID đều làm việc giống nhau, sự khác nhau của chúng là cấu trúc gói tin truyền và đích đến sẽ được định nghĩa hết trong Report Descriptor.