Микроконтроллеры

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Микроконтроллеры » Всё остальное » USB HID создание report


USB HID создание report

Сообщений 1 страница 8 из 8

1

У кого то был опыт разработки своего HID репорта ?
Есть образцы с разных сайтов, читаю пока Агурова пытаясь врубится,что от чего зависит.
Например хочу создать две точки обмена. Одна IN , другая OUT . Как я понял в протоколе максимальный размер обмена 64 байта, указываем в точке обмена. 4 байта на каждую точку нормально было бы.

Пример репорта :

Код:
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, 0x01,                    //   REPORT_COUNT (1)
    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, 0x04,                    //   REPORT_COUNT (4)
    0x81, 0x82,                    //   INPUT (Data,Var,Abs,Vol)
    0xc0                           // END_COLLECTION
}


Также для примера свою клаву на столе обмен глянул:

http://s3.uploads.ru/t/dOFGE.png

2

Мне в свое время помог вот этот документик:
http://www.rennes.supelec.fr/ren/fi/ele … id1_11.pdf

Не знаю, поможет или нет это все, но вот на всякий случай:

Вам надо глядеть в сторону Custom HID

Там, если я правильно помню, надо сначала в дескрипторе девайса указать, сколько у вас устройств. Например у меня USBD_INTERFACE_NUM равен 2-ум (Клавиатура и Custom HID):

Код:
  {
    USB_DEV_CONFIG_DESC_SIZ,
    USB_CONFIGURATION_DESCRIPTOR_TYPE,
    LOBYTE( USB_DEV_CONFIG_DESC_SIZ + USB_HID_KBD_CONFIG_DESC_SIZ + USB_HID_CONFIG_DESC_SIZ ), // + USB_HID_MOUSE_CONFIG_DESC_SIZ
    HIBYTE( USB_DEV_CONFIG_DESC_SIZ + USB_HID_KBD_CONFIG_DESC_SIZ + USB_HID_CONFIG_DESC_SIZ ), // + USB_HID_MOUSE_CONFIG_DESC_SIZ
    USBD_INTERFACE_NUM,
    0x01, // Value to use as an argument to select this configuration
    0x04, // Index of String Descriptor describing this configuration
    0xE0, // D7 Reserved, set to 1. (USB 1.0 Bus Powered) D6 Self Powered D5 Remote Wakeup D4..0 Reserved, set to 0.
    0x32,
  },
  // Size 9

Потом уже на каждый девайс надо писать дескриптор интерфейса, дескриптор описания этого интерфейса и дескрипторы ендпоинтов. У меня первый девайс - клавиатура, там все стандартно, а второй девайс - Custom HID, который так выглядит:

Код:
  //  uint8_t USBD_HID_CfgDescCustHid[USB_HID_CONFIG_DESC_SIZ] =
  {

    // INTERFACE_DESCRIPTOR
    0x09,
    USB_INTERFACE_DESCRIPTOR_TYPE,
    0x01, // Number of Interface
    0x00, // Value used to select alternative setting
    0x02, // Number of Endpoints used for this interface
    0x03, // Class Code (Assigned by USB Org)
    0x00, // Subclass Code: 0 - No subclass
    0x00, // Protocol code. 0 - None
    0x06, // Index of String Descriptor Describing this interface

    // HID_DESCRIPTOR
    0x09,
    HID_DESCRIPTOR_TYPE,
    LOBYTE( 0x101 ), // HID Class Specification release number
    HIBYTE( 0x101 ), // HID Class Specification release number
    0x00, // Hardware target country
    0x01, // Number of HID class descriptors to follow
    HID_REPORT_DESC, // Report descriptor type
    CUSTOMHID_SIZ_REPORT_DESC,
    0x00,

    // IN Endpoint
    0x07,
    USB_ENDPOINT_DESCRIPTOR_TYPE,
    HID_CUST_IN_EP,
    0x03,
    HID_IN_BUFFER_SIZE,
    0x00,
    HID_IN_INTERVALL,

    // OUT Endpoint
    0x07,
    USB_ENDPOINT_DESCRIPTOR_TYPE,
    HID_CUST_OUT_EP,
    0x03,
    HID_OUT_BUFFER_SIZE,
    0x00,
    HID_OUT_INTERVALL,
    // Size = 32
  },


А потом самое интересное - определение формата Репорта для этого кастомного ХИДа:

Код:
__ALIGN_BEGIN static uint8_t CustomHID_ReportDescriptorCustHid[CUSTOMHID_SIZ_REPORT_DESC] __ALIGN_END =
{
  0x06, 0xFF, 0xFF,           //USAGE_PAGE (Vendor Defined Page 1) 06 00 FF
  0x09, 0x01,                 //USAGE (Vendor Usage 1) 09 01
  0xA1, 0x01,                 //COLLECTION (Application) A1 01

  0x85, 0x01,                   // REPORT_ID (1) 85 01
  0x09, 0x01,                   // USAGE (Vendor Usage 1) 09 01
  0x15, 0x00,                   // LOGICAL_MINIMUM (0) 15 00
  0x26, 0xFF, 0x00,             // LOGICAL_MAXIMUM (255) 26 FF 00
  0x75, 0x08,                   // REPORT_SIZE (8) 75 08
  0x95, HID_OUT_BUFFER_SIZE,    // REPORT_COUNT (64) 95 40
  0x91, 0x82,                   // OUTPUT (Data,Var,Abs,Vol) 91 82

  0x85, 0x02,                   // REPORT_ID (2) 85 02
  0x09, 0x02,                   // USAGE (Vendor Usage 1) 09 02
  0x15, 0x00,                   // LOGICAL_MINIMUM (0) 15 00
  0x26, 0xFF, 0x00,             // LOGICAL_MAXIMUM (255) 26 FF 00
  0x75, 0x08,                   // REPORT_SIZE (8) 75 08
  0x95, HID_IN_BUFFER_SIZE,     // REPORT_COUNT (64) 95 40
  0x81, 0x82,                   // INPUT (Data,Var,Abs,Vol) 81 82

  0xC0                        //END_COLLECTION C0
  // End (Length = 50 - 12)

};

Тут можно/нужно определить, какое количество байт в каком виде идет. Без этого, вроде как не работало у меня, если слалось что-то, не соответствующее этому формату, то девайс полностью отваливался в системе. (если я правильно помню).
Размер репорта стоит в описалове Интерфейса выше (CUSTOMHID_SIZ_REPORT_DESC)

Ну и в добавок, для винды можно использовать тулзу от мелкомягких MS Message Analyzer, он по крайней мере дает понять, чего там происходит на стадии инициализации и регистрации девайса в системе.

Отредактировано MasterAlexei (2018-10-29 09:09:04)

3

CERGEI написал(а):

...Например хочу создать две точки обмена....читаю пока Агурова...

стр.168 - 169, потом на 151 и внимательно до 169.

4

Спасибо за документ, пришла мысль сделать два интерфейса в usb. 1 это передавать данные по HID, 2 это загрузка прошивки в контроллер по usb.
MasterAlexei вы пользуетесь драйвером usb от stm ?  https://www.st.com/content/ccc/resource … 158241.pdf

5

Я пытался. Честно :)
Правда как я понял, тот HID от ST, что был у меня, да и почти все примеры от них, рассчитаны только на прием данных микроконтроллером. А вот в обратную сторону (к ПК) в тех примерах не было, и пришлось переделывать... Причем конкретно так переделывать, потому как в тех примерах от ST там все архитектурные "слои" в одну кучу свалены были. Но сильно я там не сортировал это все дело, так как уже ближе к середине душевное равновесие мое было сильно пошатанно этим "студенческим" кодом, и добившись более менее удовлетворительного результата, я забил на это дело. Клава работает, данные шлются, и прекрасно.

6

Проблема с hid будет наверно в написании программы на пк, кое что проясняется с репортами в голове, попробую перелопатить от stm библиотеку. А то как вспомню hal и становится не по себе.

7

Проблема с hid будет наверно в написании программы на пк

Кстати - нет. На удивление на ПК все просто с HID.
Для винды и для линукса используем HidApi c http://github.com/signal11/hidapi
Там только при записи в определенный report надо в буфере данных первым байтом указывать номер репорта, во втором - количество байт, а потом только, с третьего байта уже сами данные начинаются.
При приеме - первым байтом идет количество данных, потом сами данные.
Так что все просто :)

8

Я питон люблю,надо поискать под него библиотеки. :blush:


Вы здесь » Микроконтроллеры » Всё остальное » USB HID создание report