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

fokin91

Участник
  • Постов

    24
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о fokin91

  • Звание
    Участник
    Участник

Посетители профиля

Блок последних пользователей отключён и не показывается другим пользователям.

  1. Вроде разобрался. Причина была банальная - в проекте с рабочим USB были не правильные настройки тактирования, из за этого CAN не запускался. Устранил эту причину - теперь кан работает, если его деинициализировать, работает усб. Сделаю, что бы инициализация в main была по внешнему пину, на который заведу питание с USB через диод. Так будет разная загрузка с и без USB. МDD - спасибо за помощь.
  2. да, есть 2 по отдельности работающих проекта. Есть какая нибудь информация как добавлять разные ветки? Получится ли так сделать с кубовскими проектами? Пока гугление не на тему Stm32 ветвление загрузки ничего не дало.
  3. да, это бы подошло, но я ни как не разберусь, где отключить инициализацию усб, что бы оставить только инициализацию кан. пробовал закомментировать MX_USB_DEVICE_Init(); но это не помогло. пока читаю гугл с целью разобраться как инициализируется USB. Буду рад подсказкам. пробовал USBD_Stop(&hUsbDeviceFS); USBD_DeInit(&hUsbDeviceFS); но это тоже не привело к нормально рабоче CAN
  4. Добрый день. Есть прибор, который работает по кану. Хочу добавить к нему возможность настройки по USB. На одном устройстве на f103 видел такой функционал. При подключении USB оно перезагружается, и работает по USB. При отключении USB перезагружается и рабоатет CAN. Попробовал реализовать такое же, но не получается. Собрал в CubeMX первый проект, который шлет сообщение в CAN - все работает. Собрал второй проект, который шлет в виртуальный ком порт сообщение - работает. Дальше пробую 2 этих проекта объединить, и не работает ничего. Если в теле main делать деинициализацию can HAL_CAN_Stop(&hcan); HAL_CAN_DeInit(&hcan); то устройство определяется по USB и в виртуальный ком порт приходят посылки от контроллера. Но запустить CAN ни как не получается. По идее нужно делать деинициализацю USB, но этого сделать не получается. пробовал за комментировать строку инициализации USB MX_USB_DEVICE_Init(); но сообщения по CAN все равно не посылаются. Как запустить деинициализацию USB ?
  5. Спасибо, передал 0м байтом 8, и нажалась клавиша WIN. Спасибо! click_report[0] = 8; // send button release USBD_HID_SendReport(&hUsbDeviceFS, click_report, CLICK_REPORT_SIZE); click_report[0] = 8; // send button release USBD_HID_SendReport(&hUsbDeviceFS, click_report, CLICK_REPORT_SIZE);
  6. спс за инфу. Так то я в списке кодов посмотрел, что указаны для левого и правого вина коды разные (0xe3 или 0xe7) и решил что на этом все.
  7. День добрый. STM32f105 + CubeMX + keil5. Создал проект с HID. Делал все по инструкции в бесконечном цикле крутится код click_report[2] = 7; // send button release USBD_HID_SendReport(&hUsbDeviceFS, click_report, CLICK_REPORT_SIZE); HAL_Delay(50); click_report[2] = 0; // send button release USBD_HID_SendReport(&hUsbDeviceFS, click_report, CLICK_REPORT_SIZE); HAL_Delay(200); Все получилось, клавиатура определилась, клавиша d начала передаваться, печатается она и в текстовом редакторе и в онлайн тесте клавиатуры. Дальше я захотел слать клавишу WIN с клавиатуры. Нашел список HID кодов, согласно которому клавиша WIN идет с кодом 0xe3 или 0xe7 меняю 7 на 0xe3, запускаю и ничего не происходит. Ни появляются нажатия на кнопку пуск, ни в онлайн тесте клавиатуры нет нажатия этой клавиши другие кнопки работают, ESC (0x29), работает адекватно, да и остальные клавиши, где то до 0x80 - все работает. Отсюда вопрос - я не правильно нашел код кнопки или есть еще какие то грабли? файлы проекта
  8. Спасибо, все заработало! проект CubeMx 5.0.1 + keil 5 https://yadi.sk/d/Lv2nNTvY7xQFwg
  9. да, спасибо, я просто еще не дошел до этого, как раз перечитываю Ваши сообщения.
  10. что то начинает получаться. Ошибку мне выкидывало, потому что у меня в настройках CubeMX было выставлено HID. Переставил на Custom HID, вставил репорт, указанный Вами выше. Устройство определилось. Пока еще не получилось ни послать символ, ни подвигать мышкой. Пока разбираюсь с этим еще непоняточка, если посмотреть в диспечере устройств свойства, то там показывает это пока не понял, насколько это критично
  11. пока изучаю пример с гитхаба, спасибо, полезно. С размерами массива игрался, и, если мы не влезаем в массив, то ошибку выкидывало другую. а строка означает конфигурацию // bConfigurationValue: индекс данной конфигурации
  12. а есть пример? что то пока не получилось запустить данный пример. после добавления 0x85, 0x01, // REPORT_ID (1) компилятор начинает жаловаться на строку 0x01, /*bConfigurationValue: Configuration value*/ из __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*/ 0x01, /*bInterfaceSubClass : 1=BOOT, 0=no boot*/ 0x02, /*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_MOUSE_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 */ } ;
  13. Пока удалось понять, что проблема в адресе конечной точки. У меня конечных точек 2 (в файле usbd_HID.h) #define HID_EPIN1_ADDR 0x81 #define HID_EPIN1_SIZE 0x04 #define HID_EPIN2_ADDR 0x82 #define HID_EPIN2_SIZE 0x04 EPIN1 - мышь, EPIN2 - клавиатура. В конфигурации выше работает мышь, но не работает клавиатура. Если поменять адреса местами, то работает клавиатура и не работает мышь. Почему то работает только адрес 0x81. Пробовал подставлять 0x80, 0x82, 0x84, - не работает. Странно
  14. спасибо, начал изучать и застопорился в одном месте. Удалось запустить 2 hid устройства, в системе определяются корректно. Но запустить их вместе не получается. Мышь работает нормально, если не вызывать в программе клавиатуру. Если клавиатуру вызвать, то и мышь перестает работать. правил USBB_HID.c (keil дает варнинг, что USBD_HID2_SendReport объявленно не явно) #include "usbd_hid.h" #include "usbd_desc.h" #include "usbd_ctlreq.h" /** @addtogroup STM32_USB_DEVICE_LIBRARY * @{ */ /** @defgroup USBD_HID * @brief usbd core module * @{ */ /** @defgroup USBD_HID_Private_TypesDefinitions * @{ */ /** * @} */ /** @defgroup USBD_HID_Private_Defines * @{ */ /** * @} */ /** @defgroup USBD_HID_Private_Macros * @{ */ /** * @} */ /** @defgroup USBD_HID_Private_FunctionPrototypes * @{ */ static uint8_t USBD_HID_Init (USBD_HandleTypeDef *pdev, uint8_t cfgidx); static uint8_t USBD_HID_DeInit (USBD_HandleTypeDef *pdev, uint8_t cfgidx); static uint8_t USBD_HID_Setup (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); static uint8_t *USBD_HID_GetCfgDesc (uint16_t *length); static uint8_t *USBD_HID_GetDeviceQualifierDesc (uint16_t *length); static uint8_t USBD_HID_DataIn (USBD_HandleTypeDef *pdev, uint8_t epnum); /** * @} */ /** @defgroup USBD_HID_Private_Variables * @{ */ USBD_ClassTypeDef USBD_HID = { USBD_HID_Init, USBD_HID_DeInit, USBD_HID_Setup, NULL, /*EP0_TxSent*/ NULL, /*EP0_RxReady*/ USBD_HID_DataIn, /*DataIn*/ NULL, /*DataOut*/ NULL, /*SOF */ NULL, NULL, USBD_HID_GetCfgDesc, USBD_HID_GetCfgDesc, USBD_HID_GetCfgDesc, USBD_HID_GetDeviceQualifierDesc, }; /* 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, 0x02, /*bNumInterfaces: 3 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*/ 0x01, /*bInterfaceSubClass : 1=BOOT, 0=no boot*/ 0x02, /*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_MOUSE_REPORT_SIZE,/*wItemLength: Total length of Report descriptor*/ 0x00, /******************** Descriptor of Mouse endpoint ********************/ /* 27 */ 0x07, /*bLength: Endpoint Descriptor size*/ USB_DESC_TYPE_ENDPOINT, /*bDescriptorType:*/ HID_EPIN1_ADDR, /*bEndpointAddress: Endpoint Address (IN)*/ 0x03, /*bmAttributes: Interrupt endpoint*/ HID_EPIN1_SIZE, /*wMaxPacketSize: 4 Byte max */ 0x00, HID_FS_BINTERVAL, /*bInterval: Polling Interval (10 ms)*/ /* 34 */ //тут заканчивается стандартный файл. Закончилось описание мыши /************** Descriptor of Joystick keybrd interface ****************/ /* 34 */ 0x09, /*bLength: Interface Descriptor size*/ USB_DESC_TYPE_INTERFACE,/*bDescriptorType: Interface descriptor type*/ 0x01, /*bInterfaceNumber: Number of Interface*/ 0x00, /*bAlternateSetting: Alternate setting*/ 0x01, /*bNumEndpoints*/ 0x03, /*bInterfaceClass: HID*/ 0x01, /*bInterfaceSubClass : 1=BOOT, 0=no boot*/ 0x01, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/ 0, /*iInterface: Index of string descriptor*/ /******************** Descriptor of Joystick keybrd HID ********************/ /* 43 */ 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_KEYBRD_REPORT_SIZE,/*wItemLength: Total length of Report descriptor*/ 0x00, /******************** Descriptor of keybrd endpoint ********************/ /* 52 */ 0x07, /*bLength: Endpoint Descriptor size*/ USB_DESC_TYPE_ENDPOINT, /*bDescriptorType:*/ HID_EPIN2_ADDR, /*bEndpointAddress: Endpoint Address (IN)*/ 0x03, /*bmAttributes: Interrupt endpoint*/ HID_EPIN2_SIZE, /*wMaxPacketSize: 4 Byte max */ 0x00, HID_FS_BINTERVAL, /*bInterval: Polling Interval (10 ms)*/ /* 59 */ // закончилось описание клавиатуры } ; /* USB HID device Configuration Descriptor */ __ALIGN_BEGIN static uint8_t USBD_HID1_Desc[USB_HID_DESC_SIZ] __ALIGN_END = { /* 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_MOUSE_REPORT_SIZE,/*wItemLength: Total length of Report descriptor*/ 0x00, }; __ALIGN_BEGIN static uint8_t USBD_HID2_Desc[USB_HID_DESC_SIZ] __ALIGN_END = { /* 43 */ 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_KEYBRD_REPORT_SIZE,/*wItemLength: Total length of Report descriptor*/ 0x00, }; /* USB Standard Device Descriptor */ __ALIGN_BEGIN static uint8_t USBD_HID_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = { USB_LEN_DEV_QUALIFIER_DESC, USB_DESC_TYPE_DEVICE_QUALIFIER, 0x00, 0x02, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, }; __ALIGN_BEGIN static uint8_t HID_MOUSE_Report[HID_MOUSE_REPORT_SIZE] __ALIGN_END = { 0x05, 0x01, 0x09, 0x02, 0xA1, 0x01, 0x09, 0x01, 0xA1, 0x00, 0x05, 0x09, 0x19, 0x01, 0x29, 0x03, 0x15, 0x00, 0x25, 0x01, 0x95, 0x03, 0x75, 0x01, 0x81, 0x02, 0x95, 0x01, 0x75, 0x05, 0x81, 0x01, 0x05, 0x01, 0x09, 0x30, 0x09, 0x31, 0x09, 0x38, 0x15, 0x81, 0x25, 0x7F, 0x75, 0x08, 0x95, 0x03, 0x81, 0x06, 0xC0, 0x09, 0x3c, 0x05, 0xff, 0x09, 0x01, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x02, 0xb1, 0x22, 0x75, 0x06, 0x95, 0x01, 0xb1, 0x01, 0xc0 }; __ALIGN_BEGIN static uint8_t HID_KEYBRD_Report[HID_KEYBRD_REPORT_SIZE] __ALIGN_END = { 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x06, // USAGE (Keyboard) 0xa1, 0x01, // COLLECTION (Application) 0x05, 0x07, // USAGE_PAGE (Keyboard) 0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl) 0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0x01, // LOGICAL_MAXIMUM (1) 0x75, 0x01, // REPORT_SIZE (1) 0x95, 0x08, // REPORT_COUNT (8) 0x81, 0x02, // INPUT (Data,Var,Abs) //1 byte 0x95, 0x01, // REPORT_COUNT (1) 0x75, 0x08, // REPORT_SIZE (8) 0x81, 0x03, // INPUT (Cnst,Var,Abs) //1 byte 0x95, 0x06, // REPORT_COUNT (6) 0x75, 0x08, // REPORT_SIZE (8) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0x65, // LOGICAL_MAXIMUM (101) 0x05, 0x07, // USAGE_PAGE (Keyboard) 0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated)) 0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application) 0x81, 0x00, // INPUT (Data,Ary,Abs) //6 bytes 0xc0 // END_COLLECTION /* 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x06, // USAGE (Keyboard) 0xa1, 0x01, // COLLECTION (Application) 0x05, 0x07, // USAGE_PAGE (Keyboard) 0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl) 0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0x01, // LOGICAL_MAXIMUM (1) 0x75, 0x01, // REPORT_SIZE (1) 0x95, 0x08, // REPORT_COUNT (8) 0x81, 0x02, // INPUT (Data,Var,Abs) 0x95, 0x01, // REPORT_COUNT (1) 0x75, 0x08, // REPORT_SIZE (8) 0x81, 0x03, // INPUT (Cnst,Var,Abs) 0x95, 0x05, // REPORT_COUNT (5) 0x75, 0x01, // REPORT_SIZE (1) 0x05, 0x08, // USAGE_PAGE (LEDs) 0x19, 0x01, // USAGE_MINIMUM (Num Lock) 0x29, 0x05, // USAGE_MAXIMUM (Kana) 0x91, 0x02, // OUTPUT (Data,Var,Abs) 0x95, 0x01, // REPORT_COUNT (1) 0x75, 0x03, // REPORT_SIZE (3) 0x91, 0x03, // OUTPUT (Cnst,Var,Abs) 0x95, 0x06, // REPORT_COUNT (6) 0x75, 0x08, // REPORT_SIZE (8) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0x65, // LOGICAL_MAXIMUM (101) 0x05, 0x07, // USAGE_PAGE (Keyboard) 0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated)) 0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application) 0x81, 0x00, // INPUT (Data,Ary,Abs) 0xc0 // END_COLLECTION */ }; /** * @} */ /** @defgroup USBD_HID_Private_Functions * @{ */ /** * @brief USBD_HID_Init * Initialize the HID interface * @param pdev: device instance * @param cfgidx: Configuration index * @retval status */ static uint8_t USBD_HID_Init (USBD_HandleTypeDef *pdev, uint8_t cfgidx) { uint8_t ret = 0; /* Open EP IN */ USBD_LL_OpenEP(pdev, HID_EPIN1_ADDR, USBD_EP_TYPE_INTR, HID_EPIN1_SIZE); USBD_LL_OpenEP(pdev, HID_EPIN2_ADDR, USBD_EP_TYPE_INTR, HID_EPIN2_SIZE); pdev->pClassData = USBD_malloc(sizeof (USBD_HID_HandleTypeDef)); if(pdev->pClassData == NULL) { ret = 1; } else { ((USBD_HID_HandleTypeDef *)pdev->pClassData)->state = HID_IDLE; } return ret; } /** * @brief USBD_HID_Init * DeInitialize the HID layer * @param pdev: device instance * @param cfgidx: Configuration index * @retval status */ static uint8_t USBD_HID_DeInit (USBD_HandleTypeDef *pdev, uint8_t cfgidx) { /* Close HID EPs */ USBD_LL_CloseEP(pdev, HID_EPIN1_ADDR); USBD_LL_CloseEP(pdev, HID_EPIN2_ADDR); /* FRee allocated memory */ if(pdev->pClassData != NULL) { USBD_free(pdev->pClassData); pdev->pClassData = NULL; } return USBD_OK; } /** * @brief USBD_HID_Setup * Handle the HID specific requests * @param pdev: instance * @param req: usb requests * @retval status */ static uint8_t USBD_HID_Setup (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { uint16_t len = 0; uint8_t *pbuf = NULL; USBD_HID_HandleTypeDef *hhid = (USBD_HID_HandleTypeDef*) pdev->pClassData; switch (req->bmRequest & USB_REQ_TYPE_MASK) { case USB_REQ_TYPE_CLASS : switch (req->bRequest) { case HID_REQ_SET_PROTOCOL: hhid->Protocol = (uint8_t)(req->wValue); break; case HID_REQ_GET_PROTOCOL: USBD_CtlSendData (pdev, (uint8_t *)&hhid->Protocol, 1); break; case HID_REQ_SET_IDLE: hhid->IdleState = (uint8_t)(req->wValue >> 8); break; case HID_REQ_GET_IDLE: USBD_CtlSendData (pdev, (uint8_t *)&hhid->IdleState, 1); break; default: USBD_CtlError (pdev, req); return USBD_FAIL; } break; case USB_REQ_TYPE_STANDARD: switch (req->bRequest) { case USB_REQ_GET_DESCRIPTOR: if( req->wValue >> 8 == HID_REPORT_DESC) { switch(req->wIndex) { case 0x00: { len = MIN(HID_MOUSE_REPORT_SIZE , req->wLength); pbuf = HID_MOUSE_Report; break; } case 0x01: { len = MIN(HID_KEYBRD_REPORT_SIZE , req->wLength); pbuf = HID_KEYBRD_Report; break; } } } else if( req->wValue >> 8 == HID_DESCRIPTOR_TYPE) { switch (req->wIndex) { case 0x00: { pbuf = USBD_HID1_Desc; len = MIN(USB_HID_DESC_SIZ , req->wLength); break; } case 0x01: { pbuf = USBD_HID2_Desc; len = MIN(USB_HID_DESC_SIZ , req->wLength); break; } } } USBD_CtlSendData (pdev, pbuf, len); break; case USB_REQ_GET_INTERFACE : USBD_CtlSendData (pdev, (uint8_t *)&hhid->AltSetting, 1); break; case USB_REQ_SET_INTERFACE : hhid->AltSetting = (uint8_t)(req->wValue); break; } } return USBD_OK; } /** * @brief USBD_HID_SendReport * Send HID Report * @param pdev: device instance * @param buff: pointer to report * @retval status */ uint8_t USBD_HID_SendReport (USBD_HandleTypeDef *pdev, uint8_t *report, uint16_t len) { USBD_HID_HandleTypeDef *hhid = (USBD_HID_HandleTypeDef*)pdev->pClassData; if (pdev->dev_state == USBD_STATE_CONFIGURED ) { if(hhid->state == HID_IDLE) { hhid->state = HID_BUSY; USBD_LL_Transmit (pdev, HID_EPIN1_ADDR, report, len); } } return USBD_OK; } uint8_t USBD_HID2_SendReport (USBD_HandleTypeDef *pdev, uint8_t *report, uint16_t len) { USBD_HID_HandleTypeDef *hhid = (USBD_HID_HandleTypeDef*)pdev->pClassData; if (pdev->dev_state == USBD_STATE_CONFIGURED ) { if(hhid->state == HID_IDLE) { hhid->state = HID_BUSY; USBD_LL_Transmit (pdev, HID_EPIN2_ADDR, report, len); } } return USBD_OK; } /** * @brief USBD_HID_GetPollingInterval * return polling interval from endpoint descriptor * @param pdev: device instance * @retval polling interval */ uint32_t USBD_HID_GetPollingInterval (USBD_HandleTypeDef *pdev) { uint32_t polling_interval = 0; /* HIGH-speed endpoints */ if(pdev->dev_speed == USBD_SPEED_HIGH) { /* Sets the data transfer polling interval for high speed transfers. Values between 1..16 are allowed. Values correspond to interval of 2 ^ (bInterval-1). This option (8 ms, corresponds to HID_HS_BINTERVAL */ polling_interval = (((1 <<(HID_HS_BINTERVAL - 1)))/8); } else /* LOW and FULL-speed endpoints */ { /* Sets the data transfer polling interval for low and full speed transfers */ polling_interval = HID_FS_BINTERVAL; } return ((uint32_t)(polling_interval)); } /** * @brief USBD_HID_GetCfgDesc * return configuration descriptor * @param speed : current device speed * @param length : pointer data length * @retval pointer to descriptor buffer */ static uint8_t *USBD_HID_GetCfgDesc (uint16_t *length) { *length = sizeof (USBD_HID_CfgDesc); return USBD_HID_CfgDesc; } /** * @brief USBD_HID_DataIn * handle data IN Stage * @param pdev: device instance * @param epnum: endpoint index * @retval status */ static uint8_t USBD_HID_DataIn (USBD_HandleTypeDef *pdev, uint8_t epnum) { /* Ensure that the FIFO is empty before a new transfer, this condition could be caused by a new transfer before the end of the previous transfer */ ((USBD_HID_HandleTypeDef *)pdev->pClassData)->state = HID_IDLE; return USBD_OK; } /** * @brief DeviceQualifierDescriptor * return Device Qualifier descriptor * @param length : pointer data length * @retval pointer to descriptor buffer */ static uint8_t *USBD_HID_GetDeviceQualifierDesc (uint16_t *length) { *length = sizeof (USBD_HID_DeviceQualifierDesc); return USBD_HID_DeviceQualifierDesc; } /** * @} */ /** * @} */ /** * @} */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ USBD_HID.h /** ****************************************************************************** * @file usbd_hid.h * @author MCD Application Team * @version V2.4.1 * @date 19-June-2015 * @brief Header file for the usbd_hid_core.c file. ****************************************************************************** * @attention * * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2> * * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); * You may not use this file except in compliance with the License. * You may obtain a copy of the License at: * * http://www.st.com/software_license_agreement_liberty_v2 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ****************************************************************************** */ /* Define to prevent recursive inclusion -------------------------------------*/ #ifndef __USB_HID_H #define __USB_HID_H #ifdef __cplusplus extern "C" { #endif /* Includes ------------------------------------------------------------------*/ #include "usbd_ioreq.h" /** @addtogroup STM32_USB_DEVICE_LIBRARY * @{ */ /** @defgroup USBD_HID * @brief This file is the Header file for usbd_hid.c * @{ */ /** @defgroup USBD_HID_Exported_Defines * @{ */ #define HID_EPIN1_ADDR 0x81 #define HID_EPIN1_SIZE 0x04 #define HID_EPIN2_ADDR 0x82 #define HID_EPIN2_SIZE 0x04 //#define HID_EPIN3_ADDR 0x83 //#define HID_EPIN3_SIZE 0x08 //#define HID_EPIN4_ADDR 0x84 //#define HID_EPIN4_SIZE 0x0A #define USB_HID_CONFIG_DESC_SIZ 34 +9+9+7 //+9+9+7 +9+9+7 #define USB_HID_DESC_SIZ 9 #define HID_MOUSE_REPORT_SIZE 74 #define HID_KEYBRD_REPORT_SIZE 45 //63 //#define HID_JOYSTICK_REPORT_SIZE 77 //#define HID_DIGIT_REPORT_SIZE 182 //#define HID_GAMEPAD_REPORT_SIZE 63//+2 #define HID_DESCRIPTOR_TYPE 0x21 #define HID_REPORT_DESC 0x22 #define HID_HS_BINTERVAL 0x07 #define HID_FS_BINTERVAL 0x0A #define HID_POLLING_INTERVAL 0x0A #define HID_REQ_SET_PROTOCOL 0x0B #define HID_REQ_GET_PROTOCOL 0x03 #define HID_REQ_SET_IDLE 0x0A #define HID_REQ_GET_IDLE 0x02 #define HID_REQ_SET_REPORT 0x09 #define HID_REQ_GET_REPORT 0x01 /** * @} */ /** @defgroup USBD_CORE_Exported_TypesDefinitions * @{ */ typedef enum { HID_IDLE = 0, HID_BUSY, } HID_StateTypeDef; typedef struct { uint32_t Protocol; uint32_t IdleState; uint32_t AltSetting; HID_StateTypeDef state; } USBD_HID_HandleTypeDef; /** * @} */ /** @defgroup USBD_CORE_Exported_Macros * @{ */ /** * @} */ /** @defgroup USBD_CORE_Exported_Variables * @{ */ extern USBD_ClassTypeDef USBD_HID; #define USBD_HID_CLASS &USBD_HID /** * @} */ /** @defgroup USB_CORE_Exported_Functions * @{ */ uint8_t USBD_HID_SendReport (USBD_HandleTypeDef *pdev, uint8_t *report, uint16_t len); uint32_t USBD_HID_GetPollingInterval (USBD_HandleTypeDef *pdev); /** * @} */ #ifdef __cplusplus } #endif #endif /* __USB_HID_H */ /** * @} */ /** * @} */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ что то я пока запутался, почему не работает
  15. Добрый день. Делаю сейчас устройство, которое будет из CAN шины автомобиля вытаскивать данные для управления андроид мультимедиа. А именно данные, от штатного джойстика. Устройство сделал, код написал. Писал с помощью CubeMX 5 и keil 5. В настройках CubeMX выбирал HID устройство. Определяется как HID мышь, курсор на андроиде бегает. Теперь надо еще добавить туда нажатие кнопки назад. Для этого нужно эмулировать еще и клавиатуру (кнопки назад, домой). в файле usbd_hid.c есть уже готовые дескрипторы для клавиатуры и мыши, но за раз можно выбрать только что то одно /************** 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*/ 0x01, /*bInterfaceSubClass : 1=BOOT, 0=no boot*/ 0x02, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/ 0, /*iInterface: Index of string descriptor*/ Правильно я понимаю, что дальше, для эмуляции и клавиатуры и мыши надо будет уже делать Custom HID ? Или можно как то легче это реализовать?
×
×
  • Создать...