iamnot 0 16 декабря, 2019 Опубликовано 16 декабря, 2019 · Жалоба Добрый день. Пытаюсь сделать устройство 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
asnoeuh 0 17 декабря, 2019 Опубликовано 17 декабря, 2019 · Жалоба у вас размер CUSTOM_HID_EPOUT_SIZE чему равен? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iamnot 0 19 декабря, 2019 Опубликовано 19 декабря, 2019 · Жалоба Уже разобрался, был неправильно указан размер буфера для конечной точки USBD_CUSTOMHID_OUTREPORT_BUF_SIZE. Он как раз был равен 8. и при передаче большего размера был эпик фэйл. CUSTOM_HID_EPOUT_SIZE Это было правильно, = 64 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться