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

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 пользователей онлайн

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

    • Наверное существуют, но как реализовать данный алгоритм для самодельной конструкции ?
    • Переменный и пульсирующий постоянный ток- не одно и то же.
    • Я не плавную регулировку тока. Я про увеличить ток заряда с 6 до 10 ампер, и всё. Подобрать ёмкости C14/C15 - по каким параметрам? Поменять ключи на более низкоомные - я хотел поставить например BUV48A или 2SC3320. Пойдут на замену 2SC2335 которые сейчас стоят? А вот этот самый "резистор обмоток связи R19" уже достал! На всех зарядках он набран из 8, бывает из 10 SMD резисторов под которыми выгорает текстолит. Падла греется до 150 градусов. В этом экземпляре, стыдно даже писать его название, Striver PW-150 всё по другому. Зарядка собрана этажеркой, да так криво и нелепо, что выглядит в 100 раз хуже многих самоделок. Так вот этот "резистор обмоток связи R19" тут стоит обычный на 1 или 2 Вт - кетайский, его хрен поймёшь. Я поставил керамический - цементный на 5 Вт - нагрев 75 градусов при 5 амперах. Что ж туда ставить то? 10-20 ваттные проволочные? А вот с делителем R4/R5/R6 я не согласен! Тут за пороги вкл-выкл циклов заряд - пауза отвечает другая часть микросхемы. В этом я уже убедился, регулировку порогов делаю подстроечным резистором на 2 ноге 393. В этих зарядках и схемах часто перепутаны компараторы. Ваше утверждение про 5, а точнее 6 ногу относиться к другим схемам и зарядкам.  Резистором R7 определяется разница между напряжением окончания и начала зарядки. А вот это ценная информация - никак не мог понять как сократить минимальный и максимальный порог заряда.
    • Вообщем буду моделировать цепи включения и авто выключения 
    • @Less Если между собой созванивать контактные площадки мест под конденсаторы, то в обе стороны, и созванивается на GND. В районе антенны блютуз подозрения сняты, там проходит жёлтая дорожка, это не КЗ Остаётся подозрение на конденсатор в районе диодов, они звенят в обе стороны 196, сниму и проверю позднее. Резистор звенящий в 003 не звенит на GND.
    • Да скорость в модуле я сразу переключил на 9600 при помощи терминала из компа.  
    • Для таких целей существуют фотоамперметры.  В основе  лампочка , световой поток которой при прохождении тока сложной формы фиксируется фотоэлементом. Затем неизвестный ток заменяется известным и добиваются тех же показаний фотоэлемента, но  уже при токе , измеренным обычным амперметром.
×
×
  • Создать...