8-900-374-94-44
[email protected]
Slide Image
МСню

Stm32 custom hid: STM Π£Ρ€ΠΎΠΊ 35. HAL. USB. Custom HID

USB HID интСрфСйс для STM32 Π² STM32IDE / Π‘Π²ΠΎΠΈΠΌΠΈ Ρ€ΡƒΠΊΠ°ΠΌΠΈ (DIY) / iXBT Live

Ряд ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ² STM32 ΠΈΠΌΠ΅ΡŽΡ‚ Π½Π° Π±ΠΎΡ€Ρ‚Ρƒ USB интСрфСйс для связи с ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°ΠΌΠΈ. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ всСго ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ прСдоставляСмый ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΉ ST Microelectronics Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ класса CDC (Communication Device Class ). Он позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° сторонС ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° UART Ρ‡Π΅Ρ€Π΅Π· USB ΠΈ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ установки Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ². Π‘ΠΎ стороны STM32 ΠΏΡ€ΠΈ этом трСбуСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Ρ‹Π²ΠΎΠ΄Π° Π΄Π°Π½Π½Ρ‹Ρ…, ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ дСлаСтся ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ. ΠŸΡ€ΠΈΡ‡Ρ‘ΠΌ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ³ΠΎ соСдинСния ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ практичСски любой, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠΉ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠΌ.

Однако ряд Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΎΠΊ, особСнно, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡˆΡŒ Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ компанию, Π³Π΄Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ HID Class (Human Interface Device), Π² случаС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½ΠΎΠ²ΠΎΠΉ вСрсии устройства трСбуСтся ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Ρ€Π°Π½Π΅Π΅ Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ интСрфСйс. Π§Ρ‚ΠΎ, собствСнно, ΠΈ ΡΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² ΠΎΡ‚ самой ST, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ΠΈ Π΄Π°ΡŽΡ‚ ΠΏΡ€ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ STM32 Cube MX ΠΈ IDE, ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, Π΄Π°Π»ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ минимальноС ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅, Π½ΠΎ Π½Π΅ раскрыли, Ρ‡Ρ‚ΠΎ ΠΈ ΠΊΠ°ΠΊ Π½Π°Π΄ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ. Π― ΠΊΠΎΠ³Π΄Π°-Ρ‚ΠΎ разбирался с USB, Π΄Π°ΠΆΠ΅ писал собствСнный Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€, Π½ΠΎ это Π±Ρ‹Π»ΠΎ Ρ‚Π°ΠΊ давно… ΠžΡΡ‚Π°Π»ΠΈΡΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ±Ρ‰ΠΈΠ΅ воспоминания. ΠŸΠΎΡΠ΅ΠΌΡƒ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΈΡΠΊΠ°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΡΡ‚Π°Ρ€Ρ‚ΠΎΠ²ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ.

ΠŸΠ΅Ρ€Π²ΠΎΠ΅ Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠ΅ Π±Ρ‹Π»ΠΎ Π²ΠΈΠ΄Π΅ΠΎΡ€ΠΎΠ»ΠΈΠΊΠΎΠΌ Π½Π° youtube Π² стилС HID Π·Π° 5 ΠΌΠΈΠ½ΡƒΡ‚ πŸ™‚ Автор Π΄Π°Ρ‘Ρ‚ доступ ΠΊ своСму ΠΊΠΎΠ΄Ρƒ Π½Π° GitHub. Всё, Ρ‚ΠΈΠΏΠ° ΠΊΡ€ΡƒΡ‚ΠΎ, красиво, просто вставляйтС ΠΊ сСбС ΠΈ всё Π±ΡƒΠ΄Π΅Ρ‚ чудСсно. Будя ΠΏΠΎ ΠΎΡ‚Π·Ρ‹Π²Π°ΠΌ ΠΏΠΎΠ΄ Ρ€ΠΎΠ»ΠΈΠΊΠΎΠΌ, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ этого Ρ…Π²Π°Ρ‚ΠΈΠ»ΠΎ.Β  Π˜Π·ΡƒΡ‡ΠΈΠ² исходники понял, Ρ‡Ρ‚ΠΎ минимального прозрСния Π½Π΅ наступило, Π΄Π° ΠΈ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΌΠ°Π» для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΠΎΡΡ‚Π°Π²Π»Π΅Π½Π½ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ.Β  Но закомство с этим ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠΌ Π±Ρ‹Π»ΠΎ явно ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ. РСшСниС вопроса с использованиСм ΠΊΡƒΠ±ΠΈΠΊΠ° (STM32Cube MX) ΠΌΠ½Π΅ Π»ΠΈΡ‡Π½ΠΎ ΠΈΠΌΠΏΠΎΠ½ΠΈΡ€ΡƒΠ΅Ρ‚ большС, Ρ‡Π΅ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ позволяСт ΠΎΡ‚Π²Π»Π΅Ρ‡ΡŒΡΡ ΠΎΡ‚ ряда Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΈ гСнСрация ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° всСгда происходит Π² ΠΎΠ΄Π½ΠΎΠΌ стилС. БоотвСтствСнно, ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ этого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΎ, Π½Π° ΠΊΠ°ΠΊΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ Π½Π°Π΄ΠΎ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Π³Π΄Π΅ ΠΈ Ρ‡Ρ‚ΠΎ Π½Π°Π΄ΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈΠ»ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для получСния ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠΌΠ΅Π½Π½ΠΎ для нашСй Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ срСды программирования.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ поиск оказался вСсьма ΡƒΠ΄Π°Ρ‡Π½Ρ‹ΠΌ. Π₯Π°Π±Ρ€ β€” извСстный сайт, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ³ΠΎ ΠΏΠΎ Ρ€Π°Π·Π½ΠΎΠΉ элСктронной Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ΅. Нашлась Ρ‚Π°ΠΌ ΠΈ ΡΡ‚Π°Ρ‚ΡŒΡ STM32 ΠΈ USB-HID β€” это просто. Π― Π½Π΅ являюсь постоянным ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ Π₯Π°Π±Ρ€Π° ΠΈ Π½Π΅ знаю Π°Π²Ρ‚ΠΎΡ€Π° этой ΡΡ‚Π°Ρ‚ΡŒΠΈ RaJa, Π½ΠΎ Π½Π° ΠΌΠΎΠΉ взгляд это ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠ°Ρ ΡΡ‚Π°Ρ‚ΡŒΡ, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰Π°Ρ основныС полоТСния Ρ€Π°Π±ΠΎΡ‚Ρ‹ HID интСрфСйся. Π‘Π΅Π· Π΅Ρ‘ прочтСния Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ дальшС здСсь бСссмыслСнно, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΄Π°Π»Π΅Π΅ Π±ΡƒΠ΄ΡƒΡ‚, Π² основном,Β  ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ для Π°Π΄Π°ΠΏΡ‚Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π° ΠΊ срСдС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ STM32IDE/STM32CubeMX + Atollic TrueStudio. (Π”Π°Π»Π΅Π΅ STM32IDE). Π”Π° ΠΈ ΡΡ‚ΠΎΠ»ΡŒ популярный Π² 2014 Π³ΠΎΠ΄Ρƒ ΠΈ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ ΠΎΡ‡Π΅Π½ΡŒ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ EmBlocks, ΡƒΠ²Ρ‹, ΡƒΠΌΠ΅Ρ€.

ΠŸΠ΅Ρ€Π²ΠΎΠ΅, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ β€” ΠΊΠ°ΠΊ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ вновь создаваСмоС устройство. ЛСт… Π΄Ρ†Π°Ρ‚ΡŒ Π½Π°Π·Π°Π΄ я использовал для этого Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΈ синтСзатор Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ° USB β€” ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅, Π½ΠΎ Π΄ΠΎΡ€ΠΎΠ³ΠΈΠ΅ ΠΈΠ³Ρ€ΡƒΡˆΠΊΠΈ πŸ™‚ БСйчас Ρƒ мСня Ρ‚Π°ΠΊΠΎΠΉ возмоТности Π½Π΅Ρ‚, Π΄Π° ΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΆΠ΅ Π±Ρ‹Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ простой ΠΏΡƒΡ‚ΡŒ. Π’Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅ для простого стандартного интСрфСйса Π±Π΅Π· написания собствСнного Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π°. Авторы ΠΎΠ±ΠΎΠΈΡ… рассмотрСнных Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² пошли самы простым для Π½ΠΈΡ… ΠΏΡƒΡ‚Ρ‘ΠΌ β€” написаниС простой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° извСстных ΠΈΠΌ языках. Но Π°Π²Ρ‚ΠΎΡ€ ΡΡ‚Π°Ρ‚ΡŒΠΈ Π½Π° Π₯Π°Π±Ρ€Π΅ сдСлал ΠΎΡ‡Π΅Π½ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ шаг β€” ΠΎΠ½ написал свой ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, совмСстимый с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ ST HID Demonstrator (ссылка Π΅ΡΡ‚ΡŒ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅ΠΉ ΠΏΠΎΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ нашим устройством, ΠΊΠ°ΠΊ графичСски, Ρ‚Π°ΠΊ ΠΈ ΠΏΠΎΡΠ»Π°Ρ‚ΡŒ свои Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΡˆΠ»ΠΎ ΠΎΡ‚ нашСго устройства. ЀактичСски ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈ Π² дальнСйшСм для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΌ ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π΅.

Π‘Π²ΠΎΡ‘ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ с ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ для HID я осущСствлял с ΠΏΠ»Π°Ρ‚ΠΎΠΉ STM32L476 Discovery. ΠŸΠ»Π°Ρ‚Π°, Π²ΠΎΠΎΠ±Ρ‰Π΅ говоря, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ любой, Π³Π΄Π΅ USB интСрфСйс ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° физичСски ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Ρ‘Π½ ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ Ρ€Π°Π·ΡŠΡ‘ΠΌΡƒ USB. Π•ΡΡ‚ΡŒ Ρƒ мСня ΠΈ Nucleo 32 с STM32L4, Π½ΠΎ Ρ‚Π°ΠΌ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·ΡŠΡ‘ΠΌ USB Ρ‚ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΈ для программирования/ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ, ΠΈ для связи с хостом, Ρ‡Ρ‚ΠΎ добавляСт ΠΈΠ½Ρ‚Ρ€ΠΈΠ³ΠΈ Π² интСрфСйс ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ источником Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… нСпоняток. Оно Π½Π°ΠΌ Π½Π°Π΄ΠΎ?

Π˜Ρ‚Π°ΠΊ, ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΠΈ дополнСния ΠΊ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΏΠΎ привязкС HID ΠΊ STM32IDE ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΠΏΠΎ Ρ‚Π΅ΠΌ ΠΆΠ΅ шагам, ΠΊΠ°ΠΊ ΠΈ Π² хабровской ΡΡ‚Π°Ρ‚ΡŒΠ΅.

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

Π’ STM32IDE структура всСх ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² задаётся ΠΏΡ€ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈΠ· срСды назначСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΠΈΠ½ΠΎΠ² ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΠΎ Ρ‚ΠΎΠΌ Π·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ Π½Π΅ Π½Π°Π΄ΠΎ. Π’ частности, Π² ΠΊΡƒΠ±ΠΈΠΊΠ΅ (Ρ‡Ρ‚ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ STM32Cube MX, Ρ‡Ρ‚ΠΎ Π² встроСнном Π² STM32IDE)Β  Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΡƒΠ΅ΠΌ USB, ΠΊΠ°ΠΊ Device, ΠΈ добавляСм Middleware USB Custom HID.

Рис.1 Π’Ρ‹Π±ΠΎΡ€ USB интСрфСйсаРис.2 Π’Ρ‹Π±ΠΎΡ€ ΠΈ пСрвичная настройка MiddlewareНадо Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ нСсмотря Π½Π° установку Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π±ΡƒΡ„Π΅Ρ€Π° Π² 64 Π±Π°ΠΉΡ‚Π°, эта Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π° Π½Π΅ вносится ΠΏΠΎ #define. Π’ΠΈΠ΄ΠΈΠΌΠΎ Π±Π°Π³ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ вСрсии ΠΊΡƒΠ±ΠΈΠΊΠ°. Π”Π°Π»Π΅Π΅ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ, Π³Π΄Π΅ Π½Π°Π΄ΠΎ ΠΏΠΎΡ„ΠΈΠΊΡΠΈΡ‚ΡŒ. Π£ΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Ρ€Π΅Π·ΠΌΠ΅Ρ€ дСскриптора Ρ€Π°Π²Π½Ρ‹ΠΉ 79 β€” это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ стартового ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

Π—Π°Ρ…ΠΎΠ΄ΠΈΠΌ Π² Clock Configuration. Π’ΠΏΠΎΠ»Π½Π΅ вСроятно, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с систСмными частотами, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠ°Ρ€ΠΊΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΌΠ°Π»ΠΈΠ½ΠΎΠ²Ρ‹ΠΌ Ρ†Π²Π΅Ρ‚ΠΎΠΌ.

Рис. 3 Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΏΠΎ установкС частот

Если Ρ‚Π°ΠΊ, Π½Π°ΠΆΠΈΠΌΠ°Π΅ΠΌ Resolve Clock Issues ΠΈ, скорСС всСго, всё Π±ΡƒΠ΄Π΅Ρ‚ настроСно Π½Π° ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ частоты. Π“Π»Π°Π²Π½ΠΎΠ΅ β€” USB Clock Π±ΡƒΠ΄Π΅Ρ‚ выставлСн Π½Π° 48 ΠœΠ“Ρ†. Надо Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² сСмСйствС STM32L4 Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π° 48ΠœΠ“Ρ† ΠΈΠΌΠ΅Π΅Ρ‚ автоподстройку ΠΏΠΎ SOF (Start Of Frame), Ρ‡Ρ‚ΠΎ позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ USB устройства Π±Π΅Π· внСшнСго ΠΊΠ²Π°Ρ€Ρ†Π°/Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°. Если, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΈΠ·Π°ΠΉΠ½ допускаСт использованиС Π½Π΅ΠΊΠ²Π°Ρ€Ρ†ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ². Для Π΄Ρ€ΡƒΠ³ΠΈΡ… сСмСйств Π½Π΅ провСрял, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ для ΠΌΠΎΠ΅Π³ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π±Ρ‹Π» Π²Ρ‹Π±Ρ€Π°Π½ ΠΈΠΌΠ΅Π½Π½ΠΎ L4. Волько Π½Π°Π΄ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ использовании USB Π΅ΡΡ‚ΡŒ нСкоторая минимальная частота Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°. Π― Π΄Π΅Π»Π°Π» ΠΏΡ€ΠΈΠΊΠΈΠ΄ΠΊΡƒ для Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Π³Π΄Π΅ Π½Π°Π΄ΠΎ ΠΎΠ±Ρ‰Π°Ρ‚ΡŒΡΡ с хостом ΠΈ ΠΏΡ€ΠΈ этом ΠΏΠΎΡ‚Ρ€Π΅Π±Π»ΡΡ‚ΡŒ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ Ρ‚ΠΎΠΊΠ°. Π—Π°Π΄Π°Ρ‡ΠΈ простыС, Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ большой скорости ΠΈ я Ρ…ΠΎΡ‚Π΅Π» Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ МК Π½Π° 8ΠœΠ“Ρ†. Оказалось, Ρ‡Ρ‚ΠΎ мСньшС 14ΠœΠ“Ρ† ΠΏΡ€ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ USB ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π½Π΅ ΠΌΠΎΠ³Ρƒ, RCC Π½Π΅ позволяСт. ΠŸΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΊΡ€ΡƒΠ³Π»ΠΎΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ 16ΠœΠ“Ρ†.

БобствСнно, настройка Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠΉ части USB ΠΈ Π²Ρ‹Π±ΠΎΡ€ Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΡ… Π·Π° Π±Π°Π·ΠΎΠ²ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ этого интСрфСйса Π½Π° Π½Π° этом Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½Ρ‹.Β  Вся ΠΎΡΡ‚Π°Π»ΡŒΠ½Π°Ρ пСрифСрия, находящаяся Π½Π° Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ ΠΏΠ»Π°Ρ‚Π΅ настраиваСтся автоматичСски ΠΏΡ€ΠΈ Π΅Ρ‘ Π²Ρ‹Π±ΠΎΡ€Π΅ Π½Π° стартС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. БохраняСм, Π³Π΅Π½Π΅Ρ€ΠΈΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ Β«ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽΒ» Π² сравнСнии с описанным Π½Π° Π₯Π°Π±Ρ€Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ.

Π­Ρ‚ΠΎ ΡΡ‚Ρ€Π°ΡˆΠ½ΠΎΠ΅ слово Descriptor

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹Π΅ массивы Π΄Π°Π½Π½Ρ‹Ρ… для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ хосту, с Ρ‡Π΅ΠΌ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Π΅Π»ΠΎ. Для интСрСса ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ дСскрипторы устройства ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.Β  БСйчас ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌΠΈ, ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈΡΡŒ, Π½ΠΎ Π² дальнСйшСм ΠΎΠ½ΠΈ навСрняка ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ рСдактирования. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, Π½Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π³Π΅Π½Π΅Ρ€ΠΈΡ‚ΡŒΡΡ ΠΏΠΎ Ρ‚Π΅ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ, Ρ‡Ρ‚ΠΎ ставятся Π² ΠΊΡƒΠ±ΠΈΠΊΠ΅. Π§Ρ‚ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Ρ€Π°Π΄ΠΎΠ²Π°Ρ‚ΡŒ. А Π²ΠΎΡ‚ Report Descriptor стоит ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡ΡˆΠ΅ β€” это фактичСски основноС, Ρ‡Ρ‚ΠΎ придётся Π² дальнСйшСм ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Ρ€ΡƒΡ‡ΠΊΠ°ΠΌΠΈ. НС знаю, ΠΎΡ‚ΠΊΡƒΠ΄Π° RaJa взял Π΅Π³ΠΎ дСскрипторы, Π² Π½Π°ΡˆΡ‘ΠΌ случаС ΠΎΠ½ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΊΡƒΠ±ΠΈΠΊΠΎΠΌ ΠΈ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ„Π°ΠΉΠ»Π°Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°:

ДСскриптор ΠΎΡ‚ RajaДСскриптор ΠΎΡ‚ STΠ€Π°ΠΉΠ» Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅
RHID_DeviceDescriptorUSBD_FS_DeviceDescusbd_desc. c
RHID_ConfigDescriptorUSBD_CUSTOM_HID_CfgFSDescusbd_customhid.c
RHID_ReportDescriptorCUSTOM_HID_ReportDesc_FSusbd_custom_hid_if.c

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ для простоты сСйчас Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ST HID Demonstrator, Ρ‚ΠΎ Π½Π΅ мудрствуя Π»ΡƒΠΊΠ°Π²ΠΎ я просто скопировал содСрТимоС  RHID_ReportDescriptor Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ мСсто ΠΌΠΎΠ΅Π³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Волько подставил свои константы Π½Π° мСсто Π΄Π»ΠΈΠ½Ρ‹. Надо ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½Π°Π΄ΠΎ Ρ‚ΠΎΡ‡Π½ΠΎ ΠΏΠΎΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ количСство Π±Π°ΠΉΡ‚ΠΎΠ² Π² этом дСскрипторС (Π² этом ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ 79) ΠΈ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ стоит Π² Class Parameters. НС большС ΠΈ Π½Π΅ мСньшС. Π˜Π½Π°Ρ‡Π΅ хост Π½Π΅ ΠΎΠΏΠΎΠ·Π½Π°Π΅Ρ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½ΠΎΠ΅ устройство. ΠŸΡ€ΠΎΠ²Π΅Ρ€Π΅Π½ΠΎ πŸ™‚

Π”Π°Π»Π΅Π΅ Π·Π°Ρ…ΠΎΠ΄ΠΈΠΌ Π² Ρ„Π°ΠΉΠ» usbd_customhid.hΒ  ΠΈ мСняСм значСния CUSTOM_HID_EPIN_SIZE ΠΈ CUSTOM_HID_EPOUT_SIZE Π½Π° 0x40U. ЧСстно говоря, Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ напрягаСт Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ST Π½Π΅ Π΄Π°Ρ‘Ρ‚ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ² смСнС значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ 2 Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ Π΄Π°Π»Π΅Π΅ Π² ΠΊΠΎΠ΄Π΅ с использованиСм этих констант стоит ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ, Ρ‡Ρ‚ΠΎ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ 2Ρ… Π±Π°ΠΉΡ‚. Но,Β  с Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны,Β  это Π±Ρ‹Π»ΠΎ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π½ΠΎ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠΌ описании ΠΈ, Π²ΠΎΠΎΠ±Ρ‰Π΅ говоря, установка Ρ‚Π°ΠΊΠΎΠ³ΠΎ значСния выглядит достаточно Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ. Π˜Π½Π°Ρ‡Π΅ Π² Ρ‡Ρ‘ΠΌ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ CustomHID ΠΎΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ? ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Ρ€Π΅Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈΠ· ΠΊΡƒΠ±ΠΈΠΊΠ°, Ρ‡Ρ‚ΠΎ Π½Π° этапС ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° происходит довольно часто, это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ сохраняСтся ΠΈ Π΅Π³ΠΎ Π½Π°Π΄ΠΎ Π²ΠΎΡΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Ρ€ΡƒΡ‡ΠΊΠ°ΠΌΠΈ. Для этого я сСбС Π² main Π²Ρ‹Π²Π΅Π» строку warning, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π·Π°Π±Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ эти константы. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ я ошибаюсь, ΠΈ Π² дальнСйшСм всё окаТСтся ΠΏΡ€ΠΎΡ‰Π΅. Но Π² Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ πŸ™‚

Π¦ΠΈΠΊΠ» ΠΎΠ±ΠΌΠ΅Π½Π° (пишСм/Ρ‡ΠΈΡ‚Π°Π΅ΠΌ)

Для Π²Ρ‹Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° хост всё достаточно Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ описанию Π½Π° Π₯Π°Π±Ρ€Π΅. Волько Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ΅: USBD_CUSTOM_HID_SendReport(). ВсС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ€Π΅ΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ ΠΈΠ· Ρ‚ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ подходят ΠΏΠΎ ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅.

А Π²ΠΎΡ‚ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ здСсь интСрСснСС, Ρ‡Π΅ΠΌ Π½Π° Π₯Π°Π±Ρ€Π΅.Β  И Π½Π° самом Π΄Π΅Π»Π΅ нСсколько ΠΏΡ€ΠΎΡ‰Π΅. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° принятого массива происходит Π² usbd_custom_hid_if.c / static int8_t CUSTOM_HID_OutEvent_FS(uint8_t event_idx, uint8_t state). Β 

Π’ этом тСстовом ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ я Π½Π΅ заморачивался с ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ слСдуя своСй ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ, просто ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π² Π·Π°Ρ€Π°Π½Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΉ массив ΠΈ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽ Ρ„Π»Π°Π³ готовности Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚ USB

Ну, Π° собствСнно «сбор Π΄Π°Π½Π½Ρ‹Ρ…Β» (Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ ΠΊΠ½ΠΎΠΏΠΎΠΊ дТойстика) ΠΈ рСакция Π½Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ ΠΎΡ‚ хоста Π΄Π°Π½Π½Ρ‹Π΅ Π² этом ΠΏΡ€ΠΎΡ‚ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ дСлаю Π²Π½ΡƒΡ‚Ρ€ΠΈ бСсконСчного Ρ†ΠΈΠΊΠ»Π° Π² main.c Всё просто πŸ™‚ Π’ этом ΠΏΡ€ΠΎΡ‚ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ Π½Π΅Ρ‚ раздСлСния Ρ€Π΅Π°ΠΊΡ†ΠΈΠΈ Π½Π° SET_FEATURE ΠΈ SET_REPORT,Β  с этим Π½Π°Π΄ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π΄Π°Π»Π΅Π΅, Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅. ΠšΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ, запускаСм, ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ ΠΊ хосту ΠΈ Ρ‚Π°ΠΌ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΡΠ²ΠΈΡ‚ΡŒΡΡ Π½ΠΎΠ²Ρ‹ΠΉ CustomHID ΠΎΡ‚ STMicroelectronics.

ЗвпускаСм Π½Π° хостС Β USB HID Demonstrator. На ΠΏΠ»Π°Ρ‚Π΅,Β  с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ я запускал этот ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΡ€Π³Π°Π½ΠΎΠ² для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Variable Inputs/Outputs, поэтому Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Graphic customization Π±Ρ‹Π»ΠΈ ΡƒΠ±Ρ€Π°Π½Ρ‹ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ назначСниями, оставлСно 5 ΠΊΠ½ΠΎΠΏΠΎΠΊ ΠΈ Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ ID, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅: 1, 2 для Output report (Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ для ST) ΠΈ 4 для Input Report (Π²Ρ‹Ρ…ΠΎΠ΄ ΠΎΡ‚ ST).

Рис. 4 Настройка дСмонстратора

МоСй Π·Π°Π΄Π°Ρ‡Π΅ΠΉ для этого ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π±Ρ‹Π»ΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠ°Ρ€ΠΎΠΉ свСтодиодов Π½Π° ΠΏΠ»Π°Ρ‚Π΅, Ρ‡Ρ‚ΠΎ стало Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ сразу, ΠΊΠ°ΠΊ эта ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ»Π° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΡƒΡŽ ΠΏΠ»Π°Ρ‚Ρƒ, ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Β«Π»Π°ΠΌΠΏΠΎΡ‡ΠΊΠΈΒ» этой ΠΏΠ»Π°Ρ‚Ρ‹ ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΊΠ½ΠΎΠΏΠΎΠΊ дТойстика Π½Π° ΠΏΠ»Π°Ρ‚Π΅, Π° Π²ΠΎΡ‚ здСсь сразу Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ. ΠŸΡ€ΠΈ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… настройках всС ΠΏΡΡ‚ΡŒ Π»Π°ΠΌΠΏΠΎΡ‡Π΅ΠΊ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ заТигались  ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ Π½Π° Ρ†Π΅Π½Ρ‚Ρ€ дТойстика. ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π½Π΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π»ΠΈΡΡŒ. ΠŸΡ€ΠΈ этом, Ссли ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π½Π° Input/Otput transfer, Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹Π΅ Π±Ρ‹Π»ΠΈ Π²ΠΏΠΎΠ»Π½Π΅ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹. Π’.Π΅. сам интСрфСйс Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½Π° хостС Π½Π΅ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ ΠΌΠΎΠΈΠΌ запросам. Π‘Π»Π°Π²Π° Π±ΠΎΠ³Ρƒ ST прСдоставляСтс исходники,Β  Π° Π² сосСднСм ΠΊΡƒΠ±ΠΈΠΊΠ΅ сидит программист нашСй Π³Ρ€ΡƒΠΏΠΏΡ‹, ΠΏΠΈΡˆΡƒΡ‰ΠΈΠΉ Π² Ρ‚ΠΎΠΌ числС ΠΈ софт для ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠ². Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, ΠΎΠ½ ΠΏΠΎΠ΄ΠΏΡ€Π°Π²ΠΈΠ» ΠΎΠ΄Π½Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ сгСнСрил ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. Всё стало Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π° ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΊΠ½ΠΎΠΏΠΊΡƒ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ свой report с ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ, Ρ‡Ρ‚ΠΎ исходно ΠΈ прСдусмотрСно. Π’ этом случаС Π±Ρ‹Π»ΠΎ Π±Ρ‹ достаточно ΠΏΠΎΡΡ‹Π»Π°Ρ‚ΡŒ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ Π±Π°ΠΉΡ‚Ρƒ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ, Π½ΠΎ ΠΌΠΎΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ прСдусматриваСт ΠΌΠ½ΠΎΠ³ΠΎΠ±Π°ΠΉΡ‚Π½Ρ‹ΠΉ ΠΎΡ‚Ρ‡Ρ‘Ρ‚. Β  Π˜ΡΡ…ΠΎΠ΄Π½ΠΈΠΊ ΠΏΠΎΠ΄ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΏΠΎΠ΄ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹ΠΉ исполняСмый Ρ„Π°ΠΉΠ» ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ ΠΏΠΎ ссылкС Π½ΠΈΠΆΠ΅.Β 

 На этом, ΠΏΠΎΠΆΠ°Π»ΡƒΠΉ, всё.Β  Если Ρƒ Вас Π΅ΡΡ‚ΡŒ такая ΠΆΠ΅ ΠΏΠ»Π°Ρ‚Π° 32L476GDISCOVERY, Ρ‚ΠΎ для Π½Π°Ρ‡Π°Π»Π° ΠΌΠΎΠΆΠ½ΠΎ просто ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ ΠΌΠΎΠΉ ΠΏΡ€ΠΎΡ‚ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ для Π½Π΅Π³ΠΎ дСмонстратор ΠΈ исходник ΠΈΠ·ΠΌΠ΅Π½Ρ‘Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎ этой ссылкС. Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ USB HID Demonstrator скачиваСтся с сайта STM, инсталлируСтся ΠΈ Π΅Π³ΠΎ исполняСмый Ρ„Π°ΠΉΠ» замСняСтся ΠΌΠΎΠΈΠΌ. Π˜ΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ Π² STM32IDE ΠΌΠΎΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΡƒΡŽ Π±Π°Π·Ρƒ для своих ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ². Если Ρƒ Вас другая ΠΏΠ»Π°Ρ‚Π°, Ρ‚ΠΎ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ «сбор ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈΒ» ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ свСтодиодов ΠΏΠΎΠ΄ свою ΠΏΠ»Π°Ρ‚Ρƒ.

Для дальнСйшСй Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΡ‡Ρ‚ΠΈΡ‚Π΅ ΡƒΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ ΡΡ‚Π°Ρ‚ΡŒΡŽ RaJa с Π₯Π°Π±Ρ€Π°. Она даст ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΈ ΠΊΠ°ΠΊ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ сдСлано для Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² с USB HID интСрфСйсом. А Π΅Ρ‰Ρ‘ Π»ΡƒΡ‡ΡˆΠ΅ Π½Π°Ρ‡Π°Ρ‚ΡŒ с Π½Π΅Ρ‘ πŸ™‚

И ΠΏΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€Π΅ класса устройства для Π’Π°ΡˆΠ΅Π³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π°Π΄ΠΎ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅: ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ опроса HID устройств β€” 1ms. И Ссли я ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ помню, это скорСС ΠΏΠΎΠΆΠ΅Π»Π°Π½ΠΈΠ΅ систСмС ΠΎΡ‚ внСшнСго устройства. Π’ стандартном HID устройствС Π·Π° ΠΎΠ΄ΠΈΠ½ ΠΊΠ°Π΄Ρ€ (frame) пСрСдаётся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²Π° Π±Π°ΠΉΡ‚Π°, Ρ‚.Π΅. ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΎΠ±ΠΌΠ΅Π½Π° Π½Π΅ Π±ΠΎΠ»Π΅Π΅ 2 ΠΊΠ±Π°ΠΉΡ‚/с. Π’ Custom HID Π½Π°Β 
Full Speed (12 ΠΌΠ±ΠΈΡ‚/с) ΠΎΠ±ΡŠΡ‘ΠΌ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚Ρ‡Ρ‘Ρ‚Π° (report) —Β  Π½Π΅ Π±ΠΎΠ»Π΅Π΅ 64 Π±Π°ΠΉΡ‚, Ρ‚.Π΅. ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΎΠ±ΠΌΠ΅Π½Π° с Π’Π°ΡˆΠΈΠΌ HID Π½Π΅ Π±ΠΎΠ»Π΅Π΅ 64 ΠΊΠ±Π°ΠΉΡ‚/с. Для High Speed (480 ΠΌΠ±ΠΈΡ‚/с) β€” ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΡ‘ΠΌ Π΄Π°Π½Π½Ρ‹Ρ… 512 Π±Π°ΠΉΡ‚ (512 ΠΊΠ±Π°ΠΉΡ‚/с). НС Π±ΡƒΠ΄ΡŒ Ρƒ мСня ограничСния совмСстимости с ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌ софтом, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌ Π² ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ, использовал хотя Π±Ρ‹ CDC.

Π£ мСня ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ статСй ΠΈ адаптация ΠΏΠΎΠ΄ ΠΌΠΎΠΈ Ρ…ΠΎΡ‚Π΅Π»ΠΊΠΈ заняло Ρ‚Ρ€ΠΈ дня. ОписаниС заняло большС πŸ™‚ НадСюсь, Ρ‡Ρ‚ΠΎ Ρƒ Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ этой ΡΡ‚Π°Ρ‚ΡŒΡ‘ΠΉ, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΉ процСсс Π·Π°ΠΉΠΌΡ‘Ρ‚ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ дня. ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅, ΡΠΏΡ€Π°ΡˆΠΈΠ²Π°ΠΉΡ‚Π΅. Π§Ρ‚ΠΎ смогу β€” ΠΎΡ‚Π²Π΅Ρ‡Ρƒ. Π§Ρ‚ΠΎ Π½Π΅ смогу, вмСстС ΠΏΠΎΠΈΡ‰Π΅ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ USB дСскрипторов для класса Custom HID.

Π”ΠΎΠ±Ρ€ΠΎΠ³ΠΎ дня всСм посСтитСлям ΠΈ читатСлям нашСго сайта! НаконСц-Ρ‚ΠΎ, послС Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π»Π΅Ρ‚Π½Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅Ρ€Ρ‹Π²Π°, возобновляСтся Ρ€Π°Π±ΠΎΡ‚Π° Π½Π°Π΄ Π½ΠΎΠ²Ρ‹ΠΌΠΈ ΡΡ‚Π°Ρ‚ΡŒΡΠΌΠΈ ) Π’Π΅ΠΌ накопилось ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ, Ρ‚Π΅ΠΌΡ‹ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Ρ€Π°Π·Π½Ρ‹Π΅, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π² блиТайшСС врСмя, надСюсь ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π½Π°ΠΉΠ΄Π΅Ρ‚ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ интСрСсноС для сСбя. И сСгодня ΠΌΡ‹ Π½Π°Ρ‡Π½Π΅ΠΌ ΠΎΠ±ΡΡƒΠΆΠ΄Π°Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ класса USB HID для Π½Π°ΡˆΠΈΡ… Π»ΡŽΠ±ΠΈΠΌΡ‹Ρ… ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ² STM32. ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π½Π°Ρ‡Π½Π΅ΠΌ? ΠŸΡ€ΠΎΡΡ‚ΠΎ я Ρ€Π΅ΡˆΠΈΠ», Ρ‡Ρ‚ΠΎ для ΠΎΠ΄Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ Ρ‚ΡƒΡ‚ Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎΠ²Π°Ρ‚ΠΎ всСго, поэтому ΠΈΡ… Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π²Π΅ ΠΈΠ»ΠΈ Ρ‚Ρ€ΠΈ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ.

Π˜Ρ‚Π°ΠΊ, ΠΏΠΎ старой Π΄ΠΎΠ±Ρ€ΠΎΠΉ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΈ разбСрСмся с инструмСнтариСм… Π― Π±ΡƒΠ΄Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΡƒΡŽ ΠΏΠ»Π°Ρ‚Ρƒ с ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠΌ STM32F103VET6, Π° для создания ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΌΡ‹ задСйствуСм Π½Π°Π±ΠΈΡ€Π°ΡŽΡ‰ΠΈΠΉ всС Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΠΏΠΎΠΏΡƒΠ»ΡΡ€Π½ΠΎΡΡ‚ΡŒ STM32CubeMx.

БобствСнно, запускаСм, создаСм Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ (Π½Π° этих ΡˆΠ°Π³Π°Ρ… я Π½Π΅ ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡΡŒ, всС ΡƒΠΆΠ΅ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π½ΠΎ Π² ΠΌΠΈΠ½ΠΈ-Ρ†ΠΈΠΊΠ»Π΅ статСй, посвящСнных этой Ρ‚Π΅ΠΌΠ΅ Π½Π° нашСм сайтС — ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² Ρ€ΡƒΠ±Ρ€ΠΈΠΊΠ΅ STM32CubeMx). Π’ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ понадобится для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ нСпосрСдствСнно сСгодняшнСй Π·Π°Π΄Π°Ρ‡ΠΈ, Π½ΠΈΡ‡Π΅Π³ΠΎ лишнСго:

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π½Π° ΠΌΠΎΠ΅ΠΉ ΠΏΠ»Π°Ρ‚Π΅ Π΅ΡΡ‚ΡŒ Π²ΠΎΡ‚ такая Ρ„ΠΈΡˆΠΊΠ°:

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ USB Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ ΠΌΠΎΠ³Π»ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΌΠ½Π΅ Π½Π°Π΄ΠΎ ΠΏΠΎΠ΄Π°Ρ‚ΡŒ Π½Π° PC13 напряТСниС Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ транзистор.

Π’ настройках тактирования Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ 48 ΠœΠ“Ρ† для Ρ€Π°Π±ΠΎΡ‚Ρ‹ USB. Π’ΡƒΡ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ слоТного, просто ΠΏΠΎΠ΄Π±ΠΈΡ€Π°Π΅ΠΌ Π½ΡƒΠΆΠ½Ρ‹Π΅ значСния ΡƒΠΌΠ½ΠΎΠΆΠΈΡ‚Π΅Π»Π΅ΠΉ ΠΈ Π΄Π΅Π»ΠΈΡ‚Π΅Π»Π΅ΠΉ частоты ΠΈ Π½Π΅ Π·Π°Π±Ρ‹Π²Π°Π΅ΠΌ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ внСшний ΠΊΠ²Π°Ρ€Ρ†, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΡƒΠΆΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΎΠΊΠ½Π΅:

ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΡƒ Configuration, Π½ΠΎ Ρ‚Π°ΠΌ всС оставляСм Π² ΠΏΠ΅Ρ€Π²ΠΎΠ·Π΄Π°Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅. Π Π°Π·Π²Π΅ Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΉΡ‚ΠΈ Π² настройки USB_Device ΠΈ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ значСния PID ΠΈ VID, ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π½Π°ΠΌ ΠΏΡ€ΠΈΠ³ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ впослСдствии для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»ΠΈ нашС устройство ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΠΎΡΡŒ ΠΊ ПК. Но Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ Π·Π°Π±Π΅Π³Π°Ρ‚ΡŒ Π²ΠΏΠ΅Ρ€Π΅Π΄, Π° просто Π·Π°ΠΏΠΎΠΌΠ½ΠΈΠΌ ΠΈΠ»ΠΈ запишСм эти значСния. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΠ½ΠΈ Ρ‚Π°ΠΊΠΈΠ΅:

  • PID — 22352 (0x5750)
  • VID — 1155 (0x483)

Π Π°Π±ΠΎΡ‚Ρƒ Π² CubeMx Π½Π° этом Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°Π΅ΠΌ, Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Π² IAR (Π½Ρƒ ΠΈΠ»ΠΈ Keil, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ своя IDE). ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΎΡˆΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π² ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€, Π½ΠΎ, ΠΊ соТалСнию, это Π½Π°ΠΌ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ даст — устройство опрСдСлится Π² систСмС, Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚, Π° Π² диспСтчСрС устройств ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ ΠΎΡˆΠΈΠ±ΠΊΡƒ — «Π‘Π±ΠΎΠΉ запроса дСскриптора устройства». И эта ситуация ΠΊΠ°ΠΊ Π½ΠΈ ΠΏΠ°Ρ€Π°Π΄ΠΎΠΊΡΠ°Π»ΡŒΠ½ΠΎ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Π° ΠΈ Π»ΠΎΠ³ΠΈΡ‡Π½Π°. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ дСскриптор для нашСго Custom HID устройства ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² наш сгСнСрированный ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. Π­Ρ‚ΠΈΠΌ ΠΌΡ‹ сСйчас ΠΈ займСмся.

ВсСго Π΅ΡΡ‚ΡŒ Ρ‚Ρ€ΠΈ USB дСскриптора, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‚ Π·Π° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ ПК:

  • дСскриптор устройства
  • дСскриптор ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ
  • дСскриптор Ρ€Π΅ΠΏΠΎΡ€Ρ‚Π°

ДСскриптор устройства описан Π² Ρ„Π°ΠΉΠ»Π΅ usbd_desc.c ΠΈ выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

/* USB Standard Device Descriptor */
__ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
{
	0x12,                       /*bLength */
	USB_DESC_TYPE_DEVICE,       /*bDescriptorType*/
	0x00,                       /*bcdUSB */
	0x02,
	0x00,                       /*bDeviceClass*/
	0x00,                       /*bDeviceSubClass*/
	0x00,                       /*bDeviceProtocol*/
	USB_MAX_EP0_SIZE,           /*bMaxPacketSize*/
	LOBYTE(USBD_VID),           /*idVendor*/
	HIBYTE(USBD_VID),           /*idVendor*/
	LOBYTE(USBD_PID_FS),         /*idVendor*/
	HIBYTE(USBD_PID_FS),         /*idVendor*/
	0x00,                        /*bcdDevice rel.
2.00*/ 0x02, USBD_IDX_MFC_STR, /*Index of manufacturer string*/ USBD_IDX_PRODUCT_STR, /*Index of product string*/ USBD_IDX_SERIAL_STR, /*Index of serial number string*/ USBD_MAX_NUM_CONFIGURATION /*bNumConfigurations*/ }; /* USB_DeviceDescriptor */

Π’ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅, здСсь всС снабТСно коммСнтариями, всС значСния стандартныС, Π½Ρƒ ΠΈ ΠΌΡ‹ собствСнно, здСсь Π½ΠΈΡ‡Π΅Π³ΠΎ Ρ‚Ρ€ΠΎΠ³Π°Ρ‚ΡŒ сСйчас Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ, Π° двинСмся дальшС. ДСскриптор ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΉΡ‚ΠΈ Π² Ρ„Π°ΠΉΠ»Π΅ usbd_customhid.c:

/* USB CUSTOM_HID device Configuration Descriptor */
__ALIGN_BEGIN static uint8_t USBD_CUSTOM_HID_CfgDesc[USB_CUSTOM_HID_CONFIG_DESC_SIZ] __ALIGN_END =
{
	0x09,                        /* bLength: Configuration Descriptor size */
	USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */
	USB_CUSTOM_HID_CONFIG_DESC_SIZ,
	/* wTotalLength: Bytes returned */
	0x00,
	0x01,                        /* bNumInterfaces: 1 interface */
	0x01,                        /* bConfigurationValue: Configuration value */
	0x00,                        /* iConfiguration: Index of string descriptor describing
	                                the configuration */
	0xC0,                        /* bmAttributes: bus powered */
	0x32,                        /* MaxPower 100 mA: this current is used for detecting Vbus */
	/************** Descriptor of CUSTOM HID interface ****************/
	/* 09 */
	0x09,                        /*bLength: Interface Descriptor size*/
	USB_DESC_TYPE_INTERFACE,     /*bDescriptorType: Interface descriptor type*/
	0x00,                        /*bInterfaceNumber: Number of Interface*/
	0x00,                        /*bAlternateSetting: Alternate setting*/
	0x02,                        /*bNumEndpoints*/
	0x03,                        /*bInterfaceClass: CUSTOM_HID*/
	0x00,                        /*bInterfaceSubClass : 1=BOOT, 0=no boot*/
	0x00,                        /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/
	0,                           /*iInterface: Index of string descriptor*/
	/******************** Descriptor of CUSTOM_HID *************************/
	/* 18 */
	0x09,                        /*bLength: CUSTOM_HID Descriptor size*/
	CUSTOM_HID_DESCRIPTOR_TYPE,  /*bDescriptorType: CUSTOM_HID*/
	0x11,                        /*bCUSTOM_HIDUSTOM_HID: CUSTOM_HID Class Spec release number*/
	0x01,
	0x00,                        /*bCountryCode: Hardware target country*/
	0x01,                        /*bNumDescriptors: Number of CUSTOM_HID class descriptors to follow*/
	0x22,                        /*bDescriptorType*/
	USBD_CUSTOM_HID_REPORT_DESC_SIZE, /*wItemLength: Total length of Report descriptor*/
	0x00,
	/******************** Descriptor of Custom HID endpoints ********************/
	/* 27 */
	0x07,                        /*bLength: Endpoint Descriptor size*/
	USB_DESC_TYPE_ENDPOINT,      /*bDescriptorType:*/
	CUSTOM_HID_EPIN_ADDR,        /*bEndpointAddress: Endpoint Address (IN)*/
	0x03,                        /*bmAttributes: Interrupt endpoint*/
	CUSTOM_HID_EPIN_SIZE,        /*wMaxPacketSize: 2 Byte max */
	0x00,
	0x20,                        /*bInterval: Polling Interval (20 ms)*/
	/* 34 */
	0x07,                        /* bLength: Endpoint Descriptor size */
	USB_DESC_TYPE_ENDPOINT,      /* bDescriptorType: */
	CUSTOM_HID_EPOUT_ADDR,       /*bEndpointAddress: Endpoint Address (OUT)*/
	0x03,                        /* bmAttributes: Interrupt endpoint */
	CUSTOM_HID_EPOUT_SIZE,       /* wMaxPacketSize: 2 Bytes max  */
	0x00,
	0x20,                        /* bInterval: Polling Interval (20 ms) */
	/* 41 */
};

Π’ ΠΎΠ±Ρ‰Π΅ΠΌ-Ρ‚ΠΎ, здСсь Ρ‚ΠΎΠΆΠ΅ ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€Ρ‹ ΠΈ программисты ST ΠΏΠΎΠ·Π°Π±ΠΎΡ‚ΠΈΠ»ΠΈΡΡŒ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π½ΡŒΠΊΠΎ всС ΠΏΡ€ΠΎΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, поэтому я Π½Π΅ Π±ΡƒΠ΄Ρƒ ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΠΎΠ»Π΅ (Ссли Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ вопросы ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, ΠΏΠΈΡˆΠΈΡ‚Π΅ Π² коммСнтариях, ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠΌΠΎΠ³Ρƒ).

ΠžΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ стоит ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° CUSTOM_HID_EPOUT_SIZE. Π’ Ρ„Π°ΠΉΠ»Π΅ usbd_customhid.h Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ:

define CUSTOM_HID_EPOUT_SIZE                                    0x02

Π­Ρ‚Π° константа опрСдСляСт ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ ΠΎΠ±ΠΌΠ΅Π½Π΅ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ с ПК. Π”Π°Π²Π°ΠΉΡ‚Π΅ поставим 4 Π±Π°ΠΉΡ‚Π°. Но Π½Π΅ Π·Π°Π±Ρ‹Π²Π°ΠΉΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΏΠΎ стандарту ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΠ°ΠΊΠ΅Ρ‚Π° составляСт 64 Π±Π°ΠΉΡ‚Π° (0x40).

Π‘ двумя ΠΈΠ· упомянутых USB дСскрипторов Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ настала ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅Π³ΠΎ. Он ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π² Ρ„Π°ΠΉΠ»Π΅ usbd_custom_hid_if.c:

__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END = { /* USER CODE BEGIN 0 */ 0x00, /* USER CODE END 0 */ 0xC0 /* END_COLLECTION */ };

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΎΠ½ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ пуст, поэтому нашС устройство ΠΈ Π½Π΅ смогло ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒΡΡ Π² систСмС ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΎ. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ Π΄Π°Π²Π°ΠΉΡ‚Π΅ разбСрСмся ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ дСскриптор Ρ€Π΅ΠΏΠΎΡ€Ρ‚Π°.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ Ρ€Π΅ΠΏΠΎΡ€Ρ‚?

ВсС Π΄Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ПК ΠΈ нашС устройство Π½Π΅ просто ΠΊΠΈΠ΄Π°ΡŽΡ‚ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Ρƒ Π±Π°ΠΉΡ‚Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, Π° ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΏΠ°ΠΊΠ΅Ρ‚Π°ΠΌΠΈ, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΌΠΈ Ρ‡Π΅Ρ‚ΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ структуру. Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ ΠΏΠ°ΠΊΠ΅Ρ‚Π° происходит ΠΏΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ Π±Π°ΠΉΡ‚Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставляСт ΠΈΠ· сСбя ID Ρ€Π΅ΠΏΠΎΡ€Ρ‚Π°. ΠŸΠ΅Ρ€Π΅Π΄ Π½Π°ΠΌΠΈ стоит Π·Π°Π΄Π°Ρ‡Π° ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ хосту, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅, ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‰ΠΈΠ΅ΡΡ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Π΄Π²Π° Ρ€Π΅ΠΏΠΎΡ€Ρ‚Π° — Π½Π° ΠΏΡ€ΠΈΠ΅ΠΌ ΠΈ Π½Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ. ΠŸΡƒΡΡ‚ΡŒ Π½Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ Ρƒ нас Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π΅ΠΏΠΎΡ€Ρ‚ с ID = 1, Π° Π½Π° ΠΏΡ€ΠΈΠ΅ΠΌ Ρ€Π΅ΠΏΠΎΡ€Ρ‚ с ID = 2:

__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
{
	/* USER CODE BEGIN 0 */ 
	0x06, 0x00, 0xff,            // USAGE_PAGE (Generic Desktop)
	0x09, 0x01,                  // USAGE (Vendor Usage 1)
	
	// System Parameters
	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, 4,                     // REPORT_COUNT (4)
	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)
	0x75, 0x08,                  // REPORT_SIZE (8)
	0x95, 4,                     // REPORT_COUNT (4)
	0x81, 0x82,                  // INPUT (Data,Var,Abs,Vol)
	/* USER CODE END 0 */
	0xC0 /* END_COLLECTION */
};

НС Π·Π°Π±Ρ‹Π²Π°Π΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ массива дСскриптора — USBD_CUSTOM_HID_REPORT_DESC_SIZE, Π° Π·Π°ΠΎΠ΄Π½ΠΎ ΠΈ USBD_CUSTOMHID_OUTREPORT_BUF_SIZE:

#define USBD_CUSTOMHID_OUTREPORT_BUF_SIZE                        4
#define USBD_CUSTOM_HID_REPORT_DESC_SIZE                         38

Ну ΠΈ Π² Ρ„Π°ΠΉΠ»Π΅ usbd_customhid. h Ρ‚Π°ΠΊΠΆΠ΅ устанавливаСм значСния, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π½Π°ΡˆΠ΅ΠΌΡƒ Ρ€Π΅ΠΆΠΈΠΌΡƒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΠ° (Π° ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌ ΠΏΠΎ 4 Π±Π°ΠΉΡ‚Π°):

#define CUSTOM_HID_EPIN_ADDR                                     0x81
#define CUSTOM_HID_EPIN_SIZE                                     4
#define CUSTOM_HID_EPOUT_ADDR                                    0x01
#define CUSTOM_HID_EPOUT_SIZE                                    4

И Π²ΠΎΡ‚ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΡƒΠΆΠ΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈ Π·Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ устройство Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒΡΡ Π² диспСтчСрС устройств:

БоотвСтствСнно, значСния PID ΠΈ VID Ρƒ этого устройства ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚Π΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Π·Π°Π΄Π°Π»ΠΈ Π² STM32CubeMx ΠΏΡ€ΠΈ создании ΠΈ настройкС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π½Π° сСгодня ΠΌΡ‹ Π½Π° этом Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°Π΅ΠΌ. Π‘Ρ€Π°Π·Ρƒ расскаТу, Ρ‡Π΅ΠΌ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒΡΡ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅. Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ части, посвящСнной USB Custom HID ΠΌΡ‹ разбСрСмся ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅, Π° Π² Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΉ части ΠΌΡ‹ напишСм ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΊΡƒ для ПК, которая собствСнно ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈ ΠΎΠ±ΠΌΠ΅Π½ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ с нашим устройством. Π”ΠΎ скорой встрСчи!

usb β€” Custom HID Gamepad Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² Windows, ΠΈΠΌΠ΅Π΅Ρ‚ нСсколько ΠΏΠ΅Ρ€Π΅Π²Π΅Ρ€Π½ΡƒΡ‚Ρ‹Ρ… ΠΊΠ½ΠΎΠΏΠΎΠΊ Π² Linux

Π― Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π» собствСнный Π³Π΅ΠΉΠΌΠΏΠ°Π΄, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ STM32. Он ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Π°Π½Π°Π»ΠΎΠ³ΠΎΠ²Ρ‹Π΅ оси ΠΈ 22 ΠΊΠ½ΠΎΠΏΠΊΠΈ. Π― написал для Π½Π΅Π³ΠΎ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ дСскриптор USB (это заняло нСсколько ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ).

Он Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ оТидалось, Π² Windows, Π½ΠΎ Π² Linux (Π² частности, Raspbian) послСдниС 5 ΠΊΠ½ΠΎΠΏΠΎΠΊ ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ (Β«Π²ΠΊΠ»Β» ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Β«Π²Ρ‹ΠΊΠ»Β» ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ)

Для ΠΌΠΎΠ΅Π³ΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° Π²Π°ΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π» Π½Π° ΠΎΠ±Π΅ΠΈΡ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ… (Mac Ρ‚ΠΎΠΆΠ΅, Π½ΠΎ Ρƒ мСня сСйчас Π½Π΅Ρ‚ Π΅Π³ΠΎ для тСстирования)

Π•ΡΡ‚ΡŒ ΠΈΠ΄Π΅ΠΈ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈ Ρ‡Ρ‚ΠΎ с этим Π΄Π΅Π»Π°Ρ‚ΡŒ?

Π’ΠΎΡ‚ Π²Ρ‹Π²ΠΎΠ΄ lsusb -v для этого устройства:

 Π¨ΠΈΠ½Π° 001 Устройство 003: ID 0483:5750 STMicroelectronics
ДСскриптор устройства:
  Π±Π”Π»ΠΈΠ½Π° 18
  bDescriptorType 1
  bcdUSB 2. 00
  bDeviceClass 0
  bDeviceSubClass 0
  bDeviceProtocol 0
  bMaxPacketSize0 64
  idVendor 0x0483 STMicroelectronics
  idProduct 0x5750
  bcdDevice 2.00
  iManufacturer 1 STMicroelectronics
  ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ чСловСчСский интСрфСйс iProduct 2 STM32
  iSerial 3 74E79C303734
  bNumConfigurations 1
  ДСскриптор ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:
    bΠ”Π»ΠΈΠ½Π° 9
    bDescriptorType 2
    wTotalLength 0x0029
    bNumΠ˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡ‹ 1
    bConfigurationValue 1
    iΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ 0
    бматрибутСс 0xc0
      Автономный
    Максимальная ΠΌΠΎΡ‰Π½ΠΎΡΡ‚ΡŒ 100 мА
    ДСскриптор интСрфСйса:
      bΠ”Π»ΠΈΠ½Π° 9
      bDescriptorType 4
      bInterfaceNumber 0
      bAlternateSetting 0
      bNumEndpoints 2
      bInterfaceClass 3 Устройство ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса
      bInterfaceSubClass 0
      bInterfaceProtocol 0
      интСрфСйс 0
        ДСскриптор HID-устройства:
          bΠ”Π»ΠΈΠ½Π° 9бдСскриптортип 33
          bcdHID 1.11
          bCountryCode 0 НС поддСрТиваСтся
          bNumDescriptors 1
          bDescriptorType 34 ΠžΡ‚Ρ‡Π΅Ρ‚
          wDescriptorLength 53
          ДСскриптор ΠΎΡ‚Ρ‡Π΅Ρ‚Π°: (Π΄Π»ΠΈΠ½Π° 53)
            Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ (Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ): страница использования, Π΄Π°Π½Π½Ρ‹Π΅ = [0x01] 1
                            ΠžΠ±Ρ‰ΠΈΠ΅ элСмСнты управлСния Ρ€Π°Π±ΠΎΡ‡ΠΈΠΌ столом
            Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ (Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ): использованиС, Π΄Π°Π½Π½Ρ‹Π΅ = [0x05] 5
                            Π“Π΅ΠΉΠΌΠΏΠ°Π΄
            Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ (основной): коллСкция, Π΄Π°Π½Π½Ρ‹Π΅ = [0x01] 1
                            ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
            Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ (Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ): использованиС, Π΄Π°Π½Π½Ρ‹Π΅ = [0x01] 1
                            Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ
            Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ (основной): коллСкция, Π΄Π°Π½Π½Ρ‹Π΅ = [0x00] 0
                            ЀизичСский
            Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ (Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ): ИспользованиС, Π΄Π°Π½Π½Ρ‹Π΅ = [0x30] 48
                            НаправлСниС-X
            Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ (Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ): ИспользованиС, Π΄Π°Π½Π½Ρ‹Π΅ = [0x31] 49НаправлСниС-Y
            Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ (Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ): использованиС, Π΄Π°Π½Π½Ρ‹Π΅ = [0x32] 50
                            НаправлСниС-Z
            Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ (Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ): использованиС, Π΄Π°Π½Π½Ρ‹Π΅ = [0x33] 51
                            ΠŸΠΎΠ²Π΅Ρ€Π½ΡƒΡ‚ΡŒ-X
            Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ (Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ): логичСский ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ, Π΄Π°Π½Π½Ρ‹Π΅ = [0x00] 0
            Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ (Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ): логичСский максимум, Π΄Π°Π½Π½Ρ‹Π΅ = [0xff 0x0f] 4095
            Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ (Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ): Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΡ‚Ρ‡Π΅Ρ‚Π°, Π΄Π°Π½Π½Ρ‹Π΅ = [0x10] 16
            Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ (Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ): количСство ΠΎΡ‚Ρ‡Π΅Ρ‚ΠΎΠ², Π΄Π°Π½Π½Ρ‹Π΅ = [0x04] 4
            Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ (основной): Π²Π²ΠΎΠ΄, Π΄Π°Π½Π½Ρ‹Π΅ = [0x02] 2
                            ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ Π΄Π°Π½Π½Ρ‹Ρ… ΠΠ±ΡΠΎΠ»ΡŽΡ‚Π½Π°Ρ No_Wrap ЛинСйная
                            Preferred_State No_Null_Position Non_Volatile Π‘ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅
            Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ (основной): ΠΊΠΎΠ½Π΅Ρ† ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ, Π΄Π°Π½Π½Ρ‹Π΅ = Π½Π΅Ρ‚
            Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ (Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ): Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° использования, Π΄Π°Π½Π½Ρ‹Π΅ = [ 0x09] 9
                            Кнопки
            Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ (Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ): ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ использования, Π΄Π°Π½Π½Ρ‹Π΅ = [0x01] 1
                            Кнопка 1 (основная)
            Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ (Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ): максимальноС использованиС, Π΄Π°Π½Π½Ρ‹Π΅ = [0x16] 22
                            (Π½ΡƒΠ»Π΅Π²ΠΎΠΉ)
            Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ (Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ): логичСский ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ, Π΄Π°Π½Π½Ρ‹Π΅ = [0x00] 0
            Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ (Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ): логичСский максимум, Π΄Π°Π½Π½Ρ‹Π΅ = [0x01] 1
            Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ (Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ): Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΡ‚Ρ‡Π΅Ρ‚Π°, Π΄Π°Π½Π½Ρ‹Π΅ = [0x01] 1
            Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ (Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ): количСство ΠΎΡ‚Ρ‡Π΅Ρ‚ΠΎΠ², Π΄Π°Π½Π½Ρ‹Π΅ = [0x16] 22
            Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ (основной): Π²Π²ΠΎΠ΄, Π΄Π°Π½Π½Ρ‹Π΅ = [0x02] 2
                            ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ Π΄Π°Π½Π½Ρ‹Ρ… ΠΠ±ΡΠΎΠ»ΡŽΡ‚Π½Π°Ρ No_Wrap ЛинСйная
                            Preferred_State No_Null_Position Non_Volatile Π‘ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅
            Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ (Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ): Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΡ‚Ρ‡Π΅Ρ‚Π°, Π΄Π°Π½Π½Ρ‹Π΅ = [0x01] 1
            Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ (Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ): количСство ΠΎΡ‚Ρ‡Π΅Ρ‚ΠΎΠ², Π΄Π°Π½Π½Ρ‹Π΅ = [0x02] 2
            Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ (основной): Π²Π²ΠΎΠ΄, Π΄Π°Π½Π½Ρ‹Π΅ = [0x03] 3
                            ΠŸΠΎΡΡ‚ΠΎΡΠ½Π½Π°Ρ ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ ΠΠ±ΡΠΎΠ»ΡŽΡ‚Π½Π°Ρ No_Wrap ЛинСйная
                            Preferred_State No_Null_Position Non_Volatile Π‘ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅
            Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ (основной): ΠΊΠΎΠ½Π΅Ρ† ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ, Π΄Π°Π½Π½Ρ‹Π΅ = Π½Π΅Ρ‚
      ДСскриптор ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ:
        bΠ”Π»ΠΈΠ½Π° 7
        bDescriptorType 5
        bEndpointAddress 0x81 EP 1 IN
        bmАтрибуты 3
          ΠŸΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅ ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ
          Π’ΠΈΠΏ синхронизации НСт
          Π”Π°Π½Π½Ρ‹Π΅ ΠΎ Ρ‚ΠΈΠΏΠ΅ использования
        wMaxPacketSize 0x0002 1x 2 Π±Π°ΠΉΡ‚Π°
        Π±Π˜Π½Ρ‚Π΅Ρ€Π²Π°Π» 10
      ДСскриптор ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ:
        bΠ”Π»ΠΈΠ½Π° 7
        bDescriptorType 5
        bEndpointAddress 0x01 EP 1 OUT
        bmАтрибуты 3
          ΠŸΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅ ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ
          Π’ΠΈΠΏ синхронизации НСт
          Π”Π°Π½Π½Ρ‹Π΅ ΠΎ Ρ‚ΠΈΠΏΠ΅ использования
        wMaxPacketSize 0x0002 1x 2 Π±Π°ΠΉΡ‚Π°
        Π±Π˜Π½Ρ‚Π΅Ρ€Π²Π°Π» 10
Бтатус устройства: 0x0001
  Автономный
 

Π― Ρ‚Π°ΠΊΠΆΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ», Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ дТойстика отличаСтся (ΠΎΠΏΡΡ‚ΡŒ ΠΆΠ΅, ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ Π² Windows ΠΈ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ Π² Linux. )

Π― Ρ‡ΠΈΡ‚Π°Π» Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² Linux Π΅ΡΡ‚ΡŒ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ ядра, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ с этими значСниями? jstest-gtk позволяСт ΠΌΠ½Π΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ аспСкты осСй (ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, ΠΌΠ΅Ρ€Ρ‚Π²Ρ‹Π΅ Π·ΠΎΠ½Ρ‹, ΠΈΠ½Π²Π΅Ρ€ΡΠΈΡŽ), ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ, это подсказка?

ΠžΠ±Ρ‰Π°Ρ связь с классом USB HID Device β€” ravikiranb.com

Класс USB HID Device (HID) ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ самый простой способ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ USB-связь ΠΌΠ΅ΠΆΠ΄Ρƒ встроСнным устройством ΠΈ хост-ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ Π±Π΅Π· написания ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ² устройств. Однако ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ пространства, Ссли устройство Π½Π΅ ΠΏΠΎΠ΄ΠΏΠ°Π΄Π°Π΅Ρ‚ Π½ΠΈ ΠΏΠΎΠ΄ ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ использования Π² классС HID.

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΈΠ΄Ρ‚ΠΈ дальшС, прСдполагаСтся, Ρ‡Ρ‚ΠΎ Ρƒ вас Π΅ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ практичСскиС знания спСцификации USB 2.0 [1] , Π²Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ экспСртом Π² USB-ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°Ρ…, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния, поставляСмыС поставщиками ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ², всСх ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… частСй Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ USB. Если Π²Ρ‹ Π½ΠΈΠΊΠΎΠ³Π΄Π° Ρ€Π°Π½ΡŒΡˆΠ΅ Π½Π΅ Ρ‡ΠΈΡ‚Π°Π»ΠΈ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ USB, Ρ‚ΠΎ я посовСтовал Π±Ρ‹ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ USB Π² Π΄Π²ΡƒΡ… словах [2] ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΠΎΠ³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒΡΡ Π² фактичСскиС стандартныС Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹.

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, класс

Устройство класса HID ΠΈ хост Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ°Π½Π°Π»Π° управлСния (конСчная Ρ‚ΠΎΡ‡ΠΊΠ° 0), Канал Interrupt IN ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠ°Π½Π°Π» Interrupt OUT. Π‘ΠŸΠ Π―Π’ΠΠΠΠ«Π™ класс спСцификация [3] Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ ΠΊ устройствам с Π½ΠΈΠ·ΠΊΠΎΠΉ, ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΈ высокой ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π½Π° максимумС доступная пропускная ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ, Π½Π° ΠΏΠΎΠ»Π½ΠΎΠΉ скорости с максимальной ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… 64 Π±Π°ΠΉΡ‚Π°, ΠΊΠ°Π½Π°Π» прСрывания ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ 1216 Π±Π°ΠΉΡ‚ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° ΠΊΠ°Π΄Ρ€ [4] . ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠ°Π½Π°Π»Ρ‹ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΡƒΡŽ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΡƒ, Ρ‚Π°ΠΊΠΎΠ΅ частоС использованиС максимальной полосы пропускания Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π΄ΡƒΡˆΠΈΡ‚ΡŒ вСсь автобус, ΠΏΠΎ этой ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Π² спСцификации. Если трСбования ΠΊ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ Π΄Π°Π½Π½Ρ‹Ρ… устройства ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ встрСтился с двумя ΠΊΠ°Π½Π°Π»Π°ΠΌΠΈ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ классу HID.

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ хост смоТСт ΠΎΠ±Ρ‰Π°Ρ‚ΡŒΡΡ с устройством, Π΅ΠΌΡƒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π½Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΎΠ²ΠΎ использованиС ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ этого устройства? Как ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π΅Π³ΠΎ Π΄Π°Π½Π½Ρ‹Π΅? ΠΈ Π§Ρ‚ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ ΠΈΠ·ΠΌΠ΅Ρ€ΡΡŽΡ‚ Π΄Π°Π½Π½Ρ‹Π΅?

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ Π²Ρ‹ΡˆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ вопросы: Допустим, Ρƒ нас Π΅ΡΡ‚ΡŒ БистСма управлСния ΠΏΠΈΡ‚Π°Π½ΠΈΠ΅ΠΌ HID-устройство, ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π½Π° устройствС хост-ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΎΠΉΡ‚ΠΈ Π² спящий Ρ€Π΅ΠΆΠΈΠΌ. ВсС это Π±Π΅Π· написания ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° сторонС хоста.

Для возникновСния Π²Ρ‹ΡˆΠ΅ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… событий Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ класса HID Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π½Π°Ρ‚ΡŒ:

  1. ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠ΅ устройство HID управляСт состояниСм питания систСмы.
  2. На устройствС Π΅ΡΡ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΠ°, ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ хост Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π² спящий Ρ€Π΅ΠΆΠΈΠΌ.
  3. Если Π½Π° устройствС ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠ½ΠΎΠΏΠΎΠΊ управлСния ΠΏΠΈΡ‚Π°Π½ΠΈΠ΅ΠΌ, Ρ‚ΠΎ какая ΠΈΠ· Π½ΠΈΡ… ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для спящСго Ρ€Π΅ΠΆΠΈΠΌΠ°.

Вся эта информация описана Π² дСскрипторС ΠΎΡ‚Ρ‡Π΅Ρ‚Π° . Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ класса ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ дСскриптор ΠΎΡ‚Ρ‡Π΅Ρ‚Π°, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅, ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΠ΅ Π² ΠΊΠ°Π½Π°Π»Ρ‹ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ, ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈΡ… ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. ДСскриптор ΠΎΡ‚Ρ‡Π΅Ρ‚Π° Π½Π΅ возвращаСтся вмСстС с дСскриптором ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈ пСрСчислСнии, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΅Π³ΠΎ Π΄Π»ΠΈΠ½Π° Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² дСскриптор класса HID, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ хост Π·Π½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ это устройство ΠΈΠΌΠ΅Π΅Ρ‚ интСрфСйс HID, Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ класса HID Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ запрос GET_DESCRIPTOR Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ интСрфСйс, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΅Π³ΠΎ дСскриптор ΠΎΡ‚Ρ‡Π΅Ρ‚Π°.

ДСскриптор ΠΎΡ‚Ρ‡Π΅Ρ‚Π°

ДСскриптор ΠΎΡ‚Ρ‡Π΅Ρ‚Π° описываСтся ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ элСмСнтов, вмСстС эти элСмСнты ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ Π΄Π°Π½Π½Ρ‹Π΅ (Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ ΠΎΡ‚Ρ‡Π΅Ρ‚ΠΎΠΌ), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ ΠΏΠΎ ΠΊΠ°Π½Π°Π»Π°ΠΌ. Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ начинаСтся с 1-Π±Π°ΠΉΡ‚ΠΎΠ²ΠΎΠ³ΠΎ прСфикса, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ Ρ€ΠΎΠ»ΡŒ элСмСнта ΠΈ Π΅Π³ΠΎ Π΄Π»ΠΈΠ½Ρƒ. ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΌ ΠΈΠ»ΠΈ Π΄Π»ΠΈΠ½Π½Ρ‹ΠΌ. ΠšΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ элСмСнт ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ 0, 1, 2 ΠΈΠ»ΠΈ 4 Π±Π°ΠΉΡ‚Π° Π΄Π°Π½Π½Ρ‹Ρ…. Π”Π»ΠΈΠ½Π½Ρ‹ΠΉ элСмСнт ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ 255 Π±Π°ΠΉΡ‚ Π΄Π°Π½Π½Ρ‹Ρ…, Π΄Π»ΠΈΠ½Π½Ρ‹Π΅ элСмСнты Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² спСцификации класса HID.

ΠšΠΎΡ€ΠΎΡ‚ΠΊΠΈΠ΅ элСмСнты Π±Ρ‹Π²Π°ΡŽΡ‚ Ρ‚Ρ€Π΅Ρ… Ρ‚ΠΈΠΏΠΎΠ²: Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅, Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΈ ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ‚ΠΈΠΏ Π΄Π°Π»Π΅Π΅ дСлится Π½Π° Ρ‚Π΅Π³ΠΈ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ…:

  • ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ Ρ‚Π΅Π³ΠΈ элСмСнтов ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ фактичСскиС Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ ΠΏΠΎ ΠΊΠ°Π½Π°Π»Π°ΠΌ ΠΈ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ Ρ‚Π°ΠΊΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ…. Π”Ρ€ΡƒΠ³ΠΈΠ΅ Ρ‚Π΅Π³ΠΈ Ρ‚ΠΈΠΏΠΎΠ² элСмСнтов Global ΠΈ Local Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ большС свойств ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ, описанным Ρ‚Π΅Π³Π°ΠΌΠΈ Main item.
    • Π’Π΅Π³ элСмСнта Π²Π²ΠΎΠ΄Π° описываСт Π΄Π°Π½Π½Ρ‹Π΅, отправляСмыС ΠΏΠΎ ΠΊΠ°Π½Π°Π»Ρƒ Interrupt IN ΠΈΠ»ΠΈ ΠΊΠ°Π½Π°Π»Ρƒ управлСния, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, события наТатия ΠΊΠ½ΠΎΠΏΠΊΠΈ, Π΄Π°Π½Π½Ρ‹Π΅ Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠΎΠ², ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ поставщиком.
    • Π’Π΅Π³ элСмСнта Output описываСт Π΄Π°Π½Π½Ρ‹Π΅, отправляСмыС хостом ΠΏΠΎ ΠΊΠ°Π½Π°Π»Ρƒ Interrupt OUT ΠΈΠ»ΠΈ ΠΊΠ°Π½Π°Π» управлСния, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ состояния свСтодиода, ΠΏΡ€ΠΈΠ²ΠΎΠ΄Π½ΠΎΠΉ Π΄Π²ΠΈΠ³Π°Ρ‚Π΅Π»ΡŒ, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ поставщиком.
    • Π’Π΅Π³ элСмСнта Feature описываСт Π΄Π°Π½Π½Ρ‹Π΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ для настройки ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² устройства, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ частоты мигания свСтодиода, установка скорости двигатСля. Π”Π°Π½Π½Ρ‹Π΅ ΠΎΠ± ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ… ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ ΠΏΠΎ ΠΊΠ°Π½Π°Π»Ρƒ управлСния.
    • Collection ΠΈ End Collection Ρ‚Π΅Π³ элСмСнта: ВсС устройства класса HID Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ one Application collection, Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ класса направляСт Π΄Π°Π½Π½Ρ‹Π΅ этой ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ прилоТСниям. НапримСр, составноС устройство класса HID ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρƒ, ΠΌΡ‹ΡˆΡŒ ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ управлСния ΠΏΠΈΡ‚Π°Π½ΠΈΠ΅ΠΌ. Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΈΠΌ элСмСнты ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ описаны трСмя прилоТСниями. ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ.
  • Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ‚Π΅Π³ΠΈ элСмСнтов: Π­Ρ‚ΠΈ Ρ‚Π΅Π³ΠΈ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ свойства всСх Π’Π΅Π³ΠΈ основного элСмСнта, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΎΠ½ΠΈ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹.
    • Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° использования описываСт ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡŽ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня этого ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠžΠ±Ρ‰ΠΈΠ΅ элСмСнты управлСния Ρ€Π°Π±ΠΎΡ‡ΠΈΠΌ столом, ΠΈΠ³Ρ€ΠΎΠ²Ρ‹Π΅ элСмСнты управлСния, Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½.
    • ЛогичСский ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ минимальноС цСлочислСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ элСмСнта основных Π΄Π°Π½Π½Ρ‹Ρ….
    • ЛогичСский максимум максимальноС цСлочислСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ элСмСнта основных Π΄Π°Π½Π½Ρ‹Ρ….
    • Π Π°Π·ΠΌΠ΅Ρ€ ΠΎΡ‚Ρ‡Π΅Ρ‚Π° Π Π°Π·ΠΌΠ΅Ρ€ основного элСмСнта Π΄Π°Π½Π½Ρ‹Ρ… Π² Π±ΠΈΡ‚Π°Ρ….
    • ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΎΡ‚Ρ‡Π΅Ρ‚ΠΎΠ² Число Ρ‚Π°ΠΊΠΈΡ… основных элСмСнтов Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΎΡ‚Ρ‡Π΅Ρ‚Π΅.
  • Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ‚Π΅Π³ΠΎΠ² элСмСнтов: Π­Ρ‚ΠΈ Ρ‚Π΅Π³ΠΈ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ свойства Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π’Π΅Π³ основного элСмСнта, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π·Π° Π½ΠΈΠΌ.
    • Π’Π΅Π³ элСмСнта Usage Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ классифицируСт Usage Page Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ элСмСнт ярлык. Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ HID-устройства System Power Control: Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° использования β€” это ΠžΠ±Ρ‰ΠΈΠ΅ элСмСнты управлСния Ρ€Π°Π±ΠΎΡ‡ΠΈΠΌ столом , ΠΈ Π½Π° этой страницС ИспользованиС β€” это Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ систСмой.
      Usage Page table ΠΈ Usage Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ [5] Π’Π°Π±Π»ΠΈΡ†Ρ‹ использования HID

Π€Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π° Π² листингС 1 ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ дСскриптор ΠΎΡ‚Ρ‡Π΅Ρ‚Π° для систСмы Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ управлСния ΠΏΠΈΡ‚Π°Π½ΠΈΠ΅ΠΌ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² ΠΊΠ°Π½Π°Π»Π΅ Interrupt IN отобраТаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Π±Π°ΠΉΡ‚ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚Ρ‡Π΅Ρ‚Π°. ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ». Из ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π±ΠΈΡ‚-0 ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

Листинг-1: sys_ctrl_hid_report_desc.c

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
1920
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
 
 /* 1-Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹ΠΉ прСфикс элСмСнта
        Π‘ΠΈΡ‚Ρ‹:
        7654 | 32 | 10
        Π±Ρ‚Π΅Π³ | bΠ’ΠΈΠΏ | bΠ Π°Π·ΠΌΠ΅Ρ€
        
        bSize: Π΄Π»ΠΈΠ½Π° Π΄Π°Π½Π½Ρ‹Ρ… послС прСфикса
        0= 0 Π±Π°ΠΉΡ‚
        1= 1 Π±Π°ΠΉΡ‚
        2= ​​2 Π±Π°ΠΉΡ‚Π°
        3= 4 Π±Π°ΠΉΡ‚Π°
        
        bType: Π’ΠΈΠΏΡ‹ элСмСнтов
        0= Основной
        1= Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ
        2= ​​мСстный
        3= Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ
        
        bTag: см.  4-Π±ΠΈΡ‚Π½Ρ‹Π΅ ΡΡ‚Π°Ρ€ΡˆΠΈΠ΅ Π±ΠΈΡ‚Ρ‹ Π² макросах Π½ΠΈΠΆΠ΅.
*/
// ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ элСмСнты
#define HID_Input(x) 0x81,x
#define HID_Output(x) 0x91,Ρ…
#define HID_Feature(x) 0xB1,x
#define HID_Collection(x) 0xA1,x
# ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ HID_EndCollection 0xC0
// Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ элСмСнты
#define HID_UsagePage(x) 0x05,x
#define HID_LogicalMin(x) 0x15,x
#define HID_LogicalMax(x) 0x25,x
#define HID_ReportSize(x) 0x75,x
#define HID_ReportCount(x) 0x95,x
// Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ элСмСнты
#define HID_Usage(x) 0x09,x
const uint8_t HID_ReportDescriptor[] = {
// ΠšΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠΉ страницС Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ стола.
HID_UsagePage(HID_USAGE_PAGE_GENERIC),
// Π’Π΅Π³ локального элСмСнта Π΄Π°Π»Π΅Π΅ классифицируСт Π΅Π³ΠΎ ΠΊΠ°ΠΊ систСмный элСмСнт управлСния.
HID_Usage(HID_USAGE_GENERIC_SYSTEM_CTL),
HID_Collection (HID_Application),
HID_LogicalMin(0),
HID_LogicalMax(1),
// 1-Π±ΠΈΡ‚Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΡ‚Ρ‡Π΅Ρ‚Π° Sleep Control
HID_ReportSize(1),
HID_ReportCount(1),
// Π’Ρ…ΠΎΠ΄ Основной элСмСнт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ слСдуСт Π·Π° этим, относится ΠΊ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΡŽ спящим Ρ€Π΅ΠΆΠΈΠΌΠΎΠΌ, ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ 0 -> 1 ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΡƒΠ΅Ρ‚ спящий Ρ€Π΅ΠΆΠΈΠΌ. 
HID_Usage(HID_USAGE_GENERIC_SYSCTL_SLEEP),
// Кнопка Π²Π²ΠΎΠ΄Π° ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ состояниС 0,
HID_Input(HID_Data | HID_Variable | HID_Relative | HID_PreferredState),
// 7-Π±ΠΈΡ‚Π½ΠΎΠ΅ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ для выравнивания ΠΎΡ‚Ρ‡Π΅Ρ‚Π° ΠΏΠΎ Π³Ρ€Π°Π½ΠΈΡ†Π΅ Π±Π°ΠΉΡ‚Π°.
HID_ReportSize(7),
HID_ReportCount(1),
HID_Input(HID_Constant),
HID_EndCollection,
};
 

Π£Π½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Π°Ρ связь

БпСцификация класса HID позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ страницу использования, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ поставщиком. для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ собствСнного ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° с ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½Ρ‹ΠΌ дСскриптором ΠΎΡ‚Ρ‡Π΅Ρ‚Π°. Π”Ρ€Π°ΠΉΠ²Π΅Ρ€ класса HID ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π°Π±ΠΎΡ€ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ поставщиком, ΠΈ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ поставщика для управлСния устройством. Π’ΠΎΠ·ΡŒΠΌΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ARM Cortex CMSIS DAP [6] Π‘Π»ΠΎΠΊ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ°, Π΅Π³ΠΎ вСрсия ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ V1 Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ с классом HID ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ инструмСнт USB HID Report Descriptor Viewer [11] Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ Π΅Π³ΠΎ дСскриптор ΠΎΡ‚Ρ‡Π΅Ρ‚Π°, Π²ΠΎΡ‚ Π²Ρ‹Π²ΠΎΠ΄ срСдства просмотра ΠΈΠ· модуля ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° ULink2:

Usage Page(0xff00) // Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π°, опрСдСлСнная поставщиком. 
Usage(0x1) // ИспользованиС, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ поставщиком.
Collection(0x1) // ΠšΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.
  ЛогичСский ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ (0x0)
  ЛогичСский максимум (0xff)
  Π Π°Π·ΠΌΠ΅Ρ€ ΠΎΡ‚Ρ‡Π΅Ρ‚Π° (0x8) // ВсС Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π² Π±Π°ΠΉΡ‚Π°Ρ….
  Report Count(0x40) // ΠžΠ±Ρ‰ΠΈΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΡ‚Ρ‡Π΅Ρ‚Π° = 64 Π±Π°ΠΉΡ‚Π°.
  ИспользованиС (0x1)
  Input(0x2) // Π”Π°Π½Π½Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ.
  Report Count(0x40) // ΠžΠ±Ρ‰ΠΈΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΡ‚Ρ‡Π΅Ρ‚Π° = 64 Π±Π°ΠΉΡ‚Π°.
  ИспользованиС (0x1)
  Output(0x2) // Π”Π°Π½Π½Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ.
  Report Count(0x1) // ΠžΠ±Ρ‰ΠΈΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΡ‚Ρ‡Π΅Ρ‚Π° ΠΎ функциях = 1 Π±Π°ΠΉΡ‚.
  ИспользованиС (0x1)
  Feature(0x2) // Π”Π°Π½Π½Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ.
Π—Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ сбор
 

Если ΠΌΡ‹ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅ΠΌ ΠΈ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ устройства, ΠΈ хост-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Ρ‚ΠΎ Π½Π΅Ρ‚ нСобходимости Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ дСскриптор ΠΎΡ‚Ρ‡Π΅Ρ‚Π°. Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ описанный Π²Ρ‹ΡˆΠ΅ дСскриптор ΠΎΡ‚Ρ‡Π΅Ρ‚Π°, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ поставщиком. Π² качСствС ΠΎΠ±Ρ‰Π΅Π³ΠΎ шаблона ΠΈ создайтС Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΉΠΌΠ°Ρ‚ΡŒ событиС наТатия ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΈ свСтодиоды управлСния Π½Π°Π΄ БПРЯВАННЫМ. Π€Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π° Π² листингС 2 ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ дСскриптор ΠΎΡ‚Ρ‡Π΅Ρ‚Π°. использовано:

Листинг-2: led_ctrl_over_hid_report_desc.c

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2930
31
32
33
34
35
36
37
 
 #define HID_INPUT_REPORT_BYTES 1 /* Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΡ‚Ρ‡Π΅Ρ‚Π° Π² Π±Π°ΠΉΡ‚Π°Ρ… */
#define HID_OUTPUT_REPORT_BYTES 1 /* Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΡ‚Ρ‡Π΅Ρ‚Π° Π² Π±Π°ΠΉΡ‚Π°Ρ… */
#define HID_FEATURE_REPORT_BYTES 1 /* Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΡ‚Ρ‡Π΅Ρ‚Π° Π² Π±Π°ΠΉΡ‚Π°Ρ… */
/**
 * ДСскриптор ΠΎΡ‚Ρ‡Π΅Ρ‚Π° HID
 */
const uint8_t HID_ReportDescriptor[] = {
HID_UsagePageVendor (0x00),
HID_Usage(0x01),
HID_Collection (HID_Application),
HID_LogicalMin(0),
HID_LogicalMax(0xFF),
HID_ReportSize(8), // 8 Π±ΠΈΡ‚
HID_ReportCount (HID_INPUT_REPORT_BYTES),
HID_Usage(0x01),
// Π‘ΠΈΡ‚-0 1-Π±Π°ΠΉΡ‚ΠΎΠ²ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π° ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° событиС ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° ΠΊΠ½ΠΎΠΏΠΊΠΈ.
// 1 = 0 -> 1, ΠΊΠ½ΠΎΠΏΠΊΠ° Π½Π°ΠΆΠ°Ρ‚Π°
HID_Input(HID_Data | HID_Variable | HID_Absolute),

HID_ReportCount (HID_OUTPUT_REPORT_BYTES),
HID_Usage(0x01),
// Π±ΠΈΡ‚-0 управляСт ΠΏΠ»Π°Ρ‚ΠΎΠΉ LED5
// 1 = Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ свСтодиод
// 0 = Π²Ρ‹ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ свСтодиод
HID_Output(HID_Data | HID_Variable | HID_Absolute),

// Частота мигания свСтодиода, ΠΎΡ‚ 1 Π΄ΠΎ 20 ΠΌΠΈΠ³Π°Π½ΠΈΠΉ Π² сСкунду. 
HID_LogicalMin(1),
HID_LogicalMax(20),
// Частота мигания свСтодиода 4 Π½Π° ΠΏΠ»Π°Ρ‚Π΅ контролируСтся ΠΎΡ‚Ρ‡Π΅Ρ‚ΠΎΠΌ ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.
HID_ReportCount(HID_FEATURE_REPORT_BYTES),
HID_Usage(0x01),
HID_Feature(HID_Data | HID_Variable | HID_Absolute),
HID_EndCollection,
};
 

Для ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² я ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ ΠΌΠ°ΠΊΠ΅Ρ‚Π½ΡƒΡŽ ΠΏΠ»Π°Ρ‚Ρƒ NGX LPC4357 Xplorer++ [7] . LPC4357 [8] ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ основан Π½Π° ядрах ARM Cortex-M4/M0, ΠΎΠ½ Ρ‚Π°ΠΊΠΆΠ΅ поддСрТиваСтся Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° LPCOpen Software [9] , которая Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя стСк ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния USB.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ хост-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ для связи с USB-устройством, ΠΏΡ€ΠΎΡ‰Π΅ всСго ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ PyUSB [10] . Если Ρƒ вас Π΅ΡΡ‚ΡŒ указанная Π²Ρ‹ΡˆΠ΅ ΠΏΠ»Π°Ρ‚Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ· этих ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ протСстированы Π½Π° Ubuntu 16.04.

Π‘Π½ΠΈΠΌΠΎΠΊ экрана β€” Π₯ост-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ исходный ΠΊΠΎΠ΄

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΈ инструкции доступны Π² общСдоступном Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ GitHub: https://github.

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *