We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
Hi,
I work with STM32F4LP5 chip and Keil USB device stack.
I configure USB-HID with HID_REPORT_DESCRITOR to 63 and a specific descriptor as follow :
#define KBD_REPORT_DESC_SIZE 63Uconst uint8_t usbd_hid0_report_descriptor[KBD_REPORT_DESC_SIZE] ={0x05, 0x01, // Usage Page (Generic Desktop),0x09, 0x06, // Usage (Keyboard),0xA1, 0x01, // Collection (Application),0x75, 0x01, // Report Size (1),0x95, 0x08, // Report Count (8),0x05, 0x07, // Usage Page (Key Codes),0x19, 0xE0, // Usage Minimum (224),0x29, 0xE7, // Usage Maximum (231),0x15, 0x00, // Logical Minimum (0),0x25, 0x01, // Logical Maximum (1),0x81, 0x02, // Input (Data, Variable, Absolute),//;Modifier byte0x95, 0x01, // Report Count (1),0x75, 0x08, // Report Size (8),0x81, 0x03, // Input (Constant),//;Reserved byte0x95, 0x05, // Report Count (5),0x75, 0x01, // Report Size (1),0x05, 0x08, // Usage Page (LEDs),0x19, 0x01, // Usage Minimum (1),0x29, 0x05, // Usage Maximum (5),0x91, 0x02, // Output (Data, Variable, Absolute),//;LED report0x95, 0x01, // Report Count (1),0x75, 0x03, // Report Size (3),0x91, 0x03, // Output (Constant), ;LED report?// padding0x95, 0x06, //................// Report Count (6),0x75, 0x08, // Report Size (8),0x15, 0x00, // Logical Minimum (0),0x25, 0x68, // Logical Maximum(104),0x05, 0x07, // Usage Page (Key Codes),0x19, 0x00, // Usage Minimum (0),0x29, 0x68, // Usage Maximum (104),0x81, 0x00, // Input (Data, Array),0xc0 // End Collection};
In main, i do USB initialization layer :
USBD_Initialize (0); // USB Device 0 Initialization USBD_Connect (0); // USB Device 0 Connect
PC HOST view and is ok to mangage keyboard USB-HID : Ok
Then the first call to USBD_HID_GetReportTrigger() function works fine and send a correct 8 bytes flow to HOST (pc) :
USBD_HID_GetReportTrigger(0, 0, (uint8_t *)&keyBoardHIDsub, sizeof(keyBoardHIDsub) );
But STM32 won't send 8 bytes to release the key and send only one 0 byte over USB link and HOST repeat the key in loop.
The second call to USBD_HID_GetReportTrigger give 0x23 error : usbDriverBusy
Why ?
Regards,
G.Grange
Is source of USB_CM3.lib are available ?
Is a valid example using USBD stack for keyboard device is available ? (i just find mouse example)
G.Grange (ggrange@centralp.fr)
I had never heard of USB_CM3.lib before this post, but might this help?https://github.com/x893/CMSIS-DAP/tree/master/Firmware/STM32/USBStack
Thanks for samples, but i can't replace USB_CM3_L.lib by theses sources.
I finally find the bug, You can use HID management for keyboard if you generate a correct keyboard report profil. I define 'User Provided HID Report Descriptor" as follow :
// User Provided HID Report Descriptor// for standard keyboard (size of this descriptor is 63 bytes)// From www.microchip.com/.../m816038.aspxextern const uint8_t usbd_hid0_report_descriptor[];const uint8_t usbd_hid0_report_descriptor[63] = { HID_UsagePage(HID_USAGE_PAGE_GENERIC), // 0x05, 0x01, // Usage Page (Generic Desktop), HID_Usage(HID_USAGE_GENERIC_KEYBOARD), // 0x09, 0x06, // Usage (Keyboard), HID_Collection(HID_Application), // 0xA1, 0x01, // Collection (Application), HID_UsagePage(HID_USAGE_PAGE_KEYBOARD), // 0x05, 0x07, // Usage Page (Key Codes); HID_UsageMin(224), // 0x19, 0xE0, // Usage Minimum (224), HID_UsageMax(231), // 0x29, 0xE7, // Usage Maximum (231), HID_LogicalMin(0), // 0x15, 0x00, // Logical Minimum (0), HID_LogicalMax(1), // 0x25, 0x01, // Logical Maximum (1), HID_ReportSize(1), // 0x75, 0x01, // Report Size (1), HID_ReportCount(8), // 0x95, 0x08, // Report Count (8), HID_Input(HID_Variable), // 0x81, 0x02, // Input (Data, Variable, Absolute), ; Modifier byte HID_ReportCount(1), // 0x95, 0x01, // Report Count (1), HID_ReportSize(8), // 0x75, 0x08, // Report Size (8), HID_Input(HID_Constant), // 0x81, 0x01, // Input (Constant), ; Reserved byte HID_ReportCount(5), // 0x95, 0x05, // Report Count (5), HID_ReportSize(1), // 0x75, 0x01, // Report Size (1), HID_UsagePage(HID_USAGE_LED_DO_NOT_DISTURB), // 0x05, 0x08, // Usage Page (Page# for LEDs), HID_UsageMin(1), // 0x19, 0x01, // Usage Minimum (1), HID_UsageMax(5), // 0x29, 0x05, // Usage Maxmimum (5), HID_Output(2), // 0x91, 0x02, // Output (Data, Variable, Absolute), ; LED report HID_ReportCount(1), // 0x95, 0x01, // Report Count (1), HID_ReportSize(3), // 0x75, 0x03, // Report Size (3), HID_Output(HID_Constant), // 0x91, 0x01, // Output (Constant), ; LED report padding HID_ReportCount(6), // 0x95, 0x06, // Report Count (6), HID_ReportSize(8), // 0x75, 0x08, // Report Size (8), HID_LogicalMin(0), // 0x15, 0x00, // Logical Minimum (0), HID_LogicalMax(101),// 0x25, 0x65, // Logical Maximum (101), HID_UsagePage(HID_USAGE_PAGE_KEYBOARD), // 0x05, 0x07, // Usage Page (Key Codes), HID_UsageMin(0), // 0x19, 0x00, // Usage Minimum (0), HID_UsageMax(101), // 0x29, 0x65, // Usage Maximum (101), HID_Input(0), // 0x81, 0x00, // Input (Data, Array), ; Key arrays (6 bytes) HID_EndCollection, // End Collection};
This point is close.
Thanks for support,
This point is now close.
If you need to check a report descriptor, this site can be useful.
https://eleccelerator.com/usbdescreqparser/