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

Репорт Custom HID device

Добрый день.

Пытаюсь сделать устройство USB HID на микроконтроллере STM32f042.
От устройства нужно следующее:
1. чтобы оно определялось в системе как HID устройство
2. чтобы было 2 конечные точки (1 прием, 1 отправка)
3. размеры пакетов должны быть по 64 байта.

Нашел примеры в интернете, но не могу заставить это все работать.

дескриптор устройства вот такой
 

 0x12,                       /*bLength */
  USB_DESC_TYPE_DEVICE,       /*bDescriptorType*/
  0x00, 0x02,                 /*bcdUSB */
  0x00,                       /*bDeviceClass*/
  0x00,                       /*bDeviceSubClass*/
  0x00,                       /*bDeviceProtocol*/
  USB_MAX_EP0_SIZE,           /*bMaxPacketSize*/
  LOBYTE(USBD_VID),           /*idVendor*/
  HIBYTE(USBD_VID),           /*idVendor*/
  LOBYTE(USBD_PID_FS),        /*idProduct*/
  HIBYTE(USBD_PID_FS),        /*idProduct*/
  0x00, 0x02,                 /*bcdDevice rel. 2.00*/
  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*/

Дескриптор конфигурации

 

0x09, /* bLength: Configuration Descriptor size */
  USB_DESC_TYPE_CONFIGURATION,    /* bDescriptorType: Configuration */
  USB_CUSTOM_HID_CONFIG_DESC_SIZ, 0x00, /* wTotalLength: Bytes returned */
  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*/
  0x01, 0x01,                       /*bCUSTOM_HIDUSTOM_HID: CUSTOM_HID Class Spec release number*/
  0x00,                             /*bCountryCode: Hardware target country*/
  0x01,                             /*bNumDescriptors: Number of CUSTOM_HID class descriptors to follow*/
  CUSTOM_HID_REPORT_DESC,           /*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,
  0xFA,                   /*bInterval: Polling Interval (250 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,
  0xFA,                   /* bInterval: Polling Interval (20 ms) */
  /* 41 */

Репорт такой

  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, 0x40 /*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, 0x40 /*RPT4_COUNT*/,     //   REPORT_COUNT (N)
  0x81, 0x82,                    //   INPUT (Data,Var,Abs,Vol)
  0xc0                           // END_COLLECTION

Само устройство при подключении определяется, драйверы для него ставятся.
Но при попытке посылки в него больше чем 8 байт непонятно что с ним становится, после этого уже и 8 байт в него не отправляются
Отправляю данные скриптом на Python используя usb.core

 

Поделиться сообщением


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

Уже разобрался, был неправильно указан размер буфера для конечной точки
USBD_CUSTOMHID_OUTREPORT_BUF_SIZE. Он как раз был равен 8. и при передаче большего размера был эпик фэйл.

CUSTOM_HID_EPOUT_SIZE

Это было правильно, = 64

Поделиться сообщением


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

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

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

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

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

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

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

×
×
  • Создать...