Перейти к содержанию

USB HID Keyboard STM32F4


ukr823f

Рекомендуемые сообщения

Приветствую всех. Столкнулся с непонимаем   -как раьотает код.  Делаю имитацию медиа кнопок для управления громкостью, переключением треков в аудиоплеере, запуск аудиоплеера. На STM32F4 собрал простенький проект - просто изменяется громкость вверх и вниз. Сначала собран был просто проект стандартный как все делают в уроках - управление мышью, но потом правдами и неправдами откорректировал дескриптор репорта под мультимедийные кнопки в файле usb_hid.c а так же отредактировал дескриптор конфигцрации USBD_HID_CfgDesc.

/* USB HID device Configuration Descriptor */
__ALIGN_BEGIN static uint8_t USBD_HID_CfgDesc[USB_HID_CONFIG_DESC_SIZ]  __ALIGN_END =
{
  0x09, /* bLength: Configuration Descriptor size */
  USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */
  USB_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*/
  0xE0,         /*bmAttributes: bus powered and Support Remote Wake-up */
  0x32,         /*MaxPower 100 mA: this current is used for detecting Vbus*/
 
  /************** Descriptor of Joystick Mouse interface ****************/
  /* 09 */
  0x09,         /*bLength: Interface Descriptor size*/
  USB_DESC_TYPE_INTERFACE,/*bDescriptorType: Interface descriptor type*/
  0x00,         /*bInterfaceNumber: Number of Interface*/
  0x00,         /*bAlternateSetting: Alternate setting*/
  0x01,         /*bNumEndpoints*/
  0x03,         /*bInterfaceClass: HID*/
  0x00,         /*bInterfaceSubClass : 1=BOOT, 0=no boot*/
  0x01,         /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/
  0,            /*iInterface: Index of string descriptor*/
  /******************** Descriptor of Joystick Mouse HID ********************/
  /* 18 */
  0x09,         /*bLength: HID Descriptor size*/
  HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/
  0x11,         /*bcdHID: HID Class Spec release number*/
  0x01,
  0x00,         /*bCountryCode: Hardware target country*/
  0x01,         /*bNumDescriptors: Number of HID class descriptors to follow*/
  0x22,         /*bDescriptorType*/
  HID_CUSTOM_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/
  0x00,
  /******************** Descriptor of Mouse endpoint ********************/
  /* 27 */
  0x07,          /*bLength: Endpoint Descriptor size*/
  USB_DESC_TYPE_ENDPOINT, /*bDescriptorType:*/
 
  HID_EPIN_ADDR,     /*bEndpointAddress: Endpoint Address (IN)*/
  0x03,          /*bmAttributes: Interrupt endpoint*/
  HID_EPIN_SIZE, /*wMaxPacketSize: 4 Byte max */
  0x00,
  HID_FS_BINTERVAL,          /*bInterval: Polling Interval (10 ms)*/
  /* 34 */
} ;

__ALIGN_BEGIN static uint8_t HID_CUSTOM_ReportDesc[78]  __ALIGN_END = {
  // 78 bytes
	//------------------------------------------------------------------------------------------//
  0x05, 0x01,        // Usage Page (Generic Desktop Ctrls)
  0x09, 0x06,        // Usage (Keyboard)
  0xA1, 0x01,        // Collection (Application)
  0x85, 0x01,        //   Report ID (1)
  0x05, 0x07,        //   Usage Page (Kbrd/Keypad)
  0x75, 0x01,        //   Report Size (1)
  0x95, 0x08,        //   Report Count (8)
  0x19, 0xE0,        //   Usage Minimum (0xE0)
  0x29, 0xE7,        //   Usage Maximum (0xE7)
  0x15, 0x00,        //   Logical Minimum (0)
  0x25, 0x01,        //   Logical Maximum (1)
  0x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
  0x95, 0x03,        //   Report Count (3)
  0x75, 0x08,        //   Report Size (8)
  0x15, 0x00,        //   Logical Minimum (0)
  0x25, 0x64,        //   Logical Maximum (100)
  0x05, 0x07,        //   Usage Page (Kbrd/Keypad)
  0x19, 0x00,        //   Usage Minimum (0x00)
  0x29, 0x65,        //   Usage Maximum (0x65)
  0x81, 0x00,        //   Input (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
  0xC0,              // End Collection
	//------------------------------------------------------------------------------------------//
  0x05, 0x0C,        // Usage Page (Consumer)
  0x09, 0x01,        // Usage (Consumer Control)
  0xA1, 0x01,        // Collection (Application)
  0x85, 0x02,        //   Report ID (2)
  0x05, 0x0C,        //   Usage Page (Consumer)
  0x15, 0x00,        //   Logical Minimum (0)
  0x25, 0x01,        //   Logical Maximum (1)
  0x75, 0x01,        //   Report Size (1)
  0x95, 0x08,        //   Report Count (8)
  0x09, 0xB5,        //   Usage (Scan Next Track)
  0x09, 0xB6,        //   Usage (Scan Previous Track)
  0x09, 0xB7,        //   Usage (Stop)
  0x09, 0xB8,        //   Usage (Eject)
  0x09, 0xCD,        //   Usage (Play/Pause)
  0x09, 0xE2,        //   Usage (Mute)
  0x09, 0xE9,        //   Usage (Volume Increment)
  0x09, 0xEA,        //   Usage (Volume Decrement)
  0x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
  0xC0,              // End Collection
	//------------------------------------------------------------------------------------------//
};

в основной main файл добавил дефайны. и вот ВОПРОС 1- откуда взялись эти коды??? я перепроверил кучу описаний - с этими кодами ничего не совпадает. Но с ними то всё работает))) , Я пробовал банально 0x40 менять на 0x41 - и ничего не работало. Вот где описание  - откуда взялись эти коды и как они работают?

// USB media codes
#define USB_HID_SCAN_NEXT 0x01
#define USB_HID_SCAN_PREV 0x02
#define USB_HID_STOP      0x04
#define USB_HID_EJECT     0x08
#define USB_HID_PAUSE     0x10
#define USB_HID_MUTE      0x20
#define USB_HID_VOL_UP    0x40
#define USB_HID_VOL_DEC   0x80

Отправка репорта происходит вот этой функцией. Где  buffer[0]=2;  - Это я так понимаю ID репорта, то есть как раз вот оно - 0x85, 0x02,   //   Report ID (2)  в описание кастом репорта.
    

if(counter<255)     {
          counter++;
     }
     else     {
    counter=0;
     buffer[0]=2;
     buffer[1]=USB_HID_VOL_UP;
     USBD_HID_SendReport(&hUsbDeviceFS, buffer, sizeof(buffer)); //Отправка репорта  с кодом...
     }
     HAL_Delay(2);

Если я отправляю код который описан в библиотеках и репорте - то есть за Volume Increment отвечает - 0XE9
То получаю в анализаторе USB вот такие данные как будто нажаты одновременно все кнопки. А вот если 0x80 - то в анализаторе всё чётко и красиво - нажата кнопка Volume Decrement

Помогите пожалуйста разобраться в HID устройстве управления мультимедиа. Ну и сторонний вопрос - Это устройство в ANDROID будет точно так же как и в WINDOWS работать? то есть управлять громкостью, переключать треки, отключать звук и т.д или в ANDROID  нужно отправлять совсем другие коды???

 

 

2018-03-12_164405.jpg

2018-03-12_165238.jpg

Ссылка на комментарий
Поделиться на другие сайты

  • 2 года спустя...

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

12.03.2018 в 17:00, ukr823f сказал:

// USB media codes #define USB_HID_SCAN_NEXT 0x01 #define USB_HID_SCAN_PREV 0x02 #define USB_HID_STOP 0x04 #define USB_HID_EJECT 0x08 #define USB_HID_PAUSE 0x10 #define USB_HID_MUTE 0x20 #define USB_HID_VOL_UP 0x40 #define USB_HID_VOL_DEC 0x80

0x01 = b00000001
0x02 = b00000010
0x04 = b00000100
0x08 = b00001000
0x10 = b00010000
0x20 = b00100000
0x40 = b01000000
0x80 = b10000000
Если послать код 0x41, это будет означать, что вы одновременно передали две команды, а именно USB_HID_VOL_UP 0x40 и  USB_HID_SCAN_NEXT 0x01. 

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...