From 8283bb1c80cecd47566b5248c745485e1a1e35db Mon Sep 17 00:00:00 2001 From: sakumisu <1203593632@qq.com> Date: Sun, 31 Jul 2022 20:27:24 +0800 Subject: [PATCH] merge class rx setup functions into one --- class/cdc/usbd_cdc.c | 10 +- class/cdc/usbd_cdc.h | 3 - class/hid/usbd_hid.c | 8 - class/hid/usbd_hid.h | 3 - core/usbd_core.c | 1 + core/usbd_core.h | 1 + demo/cdc_acm_hid_msc_template.c | 2 +- demo/cdc_acm_msc_template.c | 2 +- demo/cdc_acm_multi_template.c | 2 +- demo/cdc_acm_template.c | 2 +- demo/hid_custom_inout_template.c | 235 +++++++++++++++ demo/hid_custom_keyboard_template.c | 449 ---------------------------- 12 files changed, 242 insertions(+), 476 deletions(-) create mode 100644 demo/hid_custom_inout_template.c delete mode 100644 demo/hid_custom_keyboard_template.c diff --git a/class/cdc/usbd_cdc.c b/class/cdc/usbd_cdc.c index c6defc37..b542b1c9 100644 --- a/class/cdc/usbd_cdc.c +++ b/class/cdc/usbd_cdc.c @@ -152,10 +152,6 @@ static void cdc_notify_handler(uint8_t event, void *arg) usbd_cdc_acm_reset(); #endif break; - case USBD_EVENT_CONFIGURED: - usbd_cdc_acm_setup(); - break; - default: break; } @@ -209,8 +205,4 @@ __WEAK void usbd_cdc_acm_set_dtr(uint8_t intf, bool dtr) __WEAK void usbd_cdc_acm_set_rts(uint8_t intf, bool rts) { -} - -__WEAK void usbd_cdc_acm_setup(void) -{ -} +} \ No newline at end of file diff --git a/class/cdc/usbd_cdc.h b/class/cdc/usbd_cdc.h index 88e975f1..4ad68691 100644 --- a/class/cdc/usbd_cdc.h +++ b/class/cdc/usbd_cdc.h @@ -37,9 +37,6 @@ void usbd_cdc_acm_set_line_coding(uint8_t intf, uint32_t baudrate, uint8_t datab void usbd_cdc_acm_set_dtr(uint8_t intf, bool dtr); void usbd_cdc_acm_set_rts(uint8_t intf, bool rts); -/* Setup cdc acm first rx transfer */ -void usbd_cdc_acm_setup(void); - #ifdef __cplusplus } #endif diff --git a/class/hid/usbd_hid.c b/class/hid/usbd_hid.c index b0544e77..9aa909a8 100644 --- a/class/hid/usbd_hid.c +++ b/class/hid/usbd_hid.c @@ -175,10 +175,6 @@ static void hid_notify_handler(uint8_t event, void *arg) case USBD_EVENT_RESET: usbd_hid_reset(); break; - case USBD_EVENT_CONFIGURED: - usbd_hid_setup(); - break; - default: break; } @@ -261,8 +257,4 @@ __WEAK void usbh_hid_set_idle(uint8_t intf, uint8_t report_id, uint8_t duration) __WEAK void usbh_hid_set_protocol(uint8_t intf, uint8_t protocol) { -} - -__WEAK void usbd_hid_setup(void) -{ } \ No newline at end of file diff --git a/class/hid/usbd_hid.h b/class/hid/usbd_hid.h index 0f89c0b5..aa30d75c 100644 --- a/class/hid/usbd_hid.h +++ b/class/hid/usbd_hid.h @@ -44,9 +44,6 @@ void usbh_hid_set_report(uint8_t intf, uint8_t report_id, uint8_t report_type, u void usbh_hid_set_idle(uint8_t intf, uint8_t report_id, uint8_t duration); void usbh_hid_set_protocol(uint8_t intf, uint8_t protocol); -/* Setup hid first rx transfer */ -void usbd_hid_setup(void); - #ifdef __cplusplus } #endif diff --git a/core/usbd_core.c b/core/usbd_core.c index b0864cc8..16794f55 100644 --- a/core/usbd_core.c +++ b/core/usbd_core.c @@ -505,6 +505,7 @@ static bool usbd_std_device_req_handler(struct usb_setup_packet *setup, uint8_t usbd_core_cfg.configuration = value; usbd_core_cfg.configured = true; usbd_class_event_notify_handler(USBD_EVENT_CONFIGURED, NULL); + usbd_configure_done_callback(); } break; diff --git a/core/usbd_core.h b/core/usbd_core.h index e516405a..1243c663 100644 --- a/core/usbd_core.h +++ b/core/usbd_core.h @@ -138,6 +138,7 @@ void usbd_class_register(usbd_class_t *devclass); void usbd_class_add_interface(usbd_class_t *devclass, usbd_interface_t *intf); void usbd_interface_add_endpoint(usbd_interface_t *intf, usbd_endpoint_t *ep); bool usb_device_is_configured(void); +void usbd_configure_done_callback(void); int usbd_initialize(void); #ifdef __cplusplus diff --git a/demo/cdc_acm_hid_msc_template.c b/demo/cdc_acm_hid_msc_template.c index 8d87d99d..4784b665 100644 --- a/demo/cdc_acm_hid_msc_template.c +++ b/demo/cdc_acm_hid_msc_template.c @@ -273,7 +273,7 @@ volatile bool ep_tx_busy_flag = false; #define CDC_MAX_MPS 64 #endif -void usbd_cdc_acm_setup(void) +void usbd_configure_done_callback(void) { /* setup first out ep read transfer */ usbd_ep_start_read(CDC_OUT_EP, read_buffer, 2048); diff --git a/demo/cdc_acm_msc_template.c b/demo/cdc_acm_msc_template.c index 33ce1d8e..3e6b1a5d 100644 --- a/demo/cdc_acm_msc_template.c +++ b/demo/cdc_acm_msc_template.c @@ -116,7 +116,7 @@ volatile bool ep_tx_busy_flag = false; #define CDC_MAX_MPS 64 #endif -void usbd_cdc_acm_setup(void) +void usbd_configure_done_callback(void) { /* setup first out ep read transfer */ usbd_ep_start_read(CDC_OUT_EP, read_buffer, 2048); diff --git a/demo/cdc_acm_multi_template.c b/demo/cdc_acm_multi_template.c index d2525f94..eb5d5c53 100644 --- a/demo/cdc_acm_multi_template.c +++ b/demo/cdc_acm_multi_template.c @@ -126,7 +126,7 @@ volatile bool ep_tx_busy_flag = false; #define CDC_MAX_MPS 64 #endif -void usbd_cdc_acm_setup(void) +void usbd_configure_done_callback(void) { /* setup first out ep read transfer */ usbd_ep_start_read(CDC_OUT_EP, read_buffer, 2048); diff --git a/demo/cdc_acm_template.c b/demo/cdc_acm_template.c index 5b01f655..5eb5b67e 100644 --- a/demo/cdc_acm_template.c +++ b/demo/cdc_acm_template.c @@ -111,7 +111,7 @@ volatile bool ep_tx_busy_flag = false; #define CDC_MAX_MPS 64 #endif -void usbd_cdc_acm_setup(void) +void usbd_configure_done_callback(void) { /* setup first out ep read transfer */ usbd_ep_start_read(CDC_OUT_EP, read_buffer, 2048); diff --git a/demo/hid_custom_inout_template.c b/demo/hid_custom_inout_template.c new file mode 100644 index 00000000..5dca2b61 --- /dev/null +++ b/demo/hid_custom_inout_template.c @@ -0,0 +1,235 @@ +#include "usbd_core.h" +#include "usbd_hid.h" + +#define HID_STATE_IDLE 0 +#define HID_STATE_BUSY 1 + +/*!< hidraw in endpoint */ +#define HIDRAW_IN_EP 0x81 +#define HIDRAW_IN_SIZE 64 +#define HIDRAW_IN_INTERVAL 10 + +/*!< hidraw out endpoint */ +#define HIDRAW_OUT_EP 0x02 +#define HIDRAW_OUT_EP_SIZE 64 +#define HIDRAW_OUT_EP_INTERVAL 10 + +#define USBD_VID 0xffff +#define USBD_PID 0xffff +#define USBD_MAX_POWER 100 +#define USBD_LANGID_STRING 1033 + +/*!< hid state ! Data can be sent only when state is idle */ +static uint8_t custom_state = HID_STATE_IDLE; + +/*!< config descriptor size */ +#define USB_HID_CONFIG_DESC_SIZ (9 + 9 + 9 + 7 + 7) + +/*!< custom hid report descriptor size */ +#define HID_CUSTOM_REPORT_DESC_SIZE 34 + +/*!< global descriptor */ +static const uint8_t hid_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0002, 0x01), + USB_CONFIG_DESCRIPTOR_INIT(USB_HID_CONFIG_DESC_SIZ, 0x01, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + /************** Descriptor of Custom interface *****************/ + 0x09, /* bLength: Interface Descriptor size */ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType: Interface descriptor type */ + 0x00, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints */ + 0x03, /* bInterfaceClass: HID */ + 0x01, /* bInterfaceSubClass : 1=BOOT, 0=no boot */ + 0x00, /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */ + 0, /* iInterface: Index of string descriptor */ + /******************** Descriptor of Custom HID ********************/ + 0x09, /* bLength: HID Descriptor size */ + HID_DESCRIPTOR_TYPE_HID, /* 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_CUSTOM_REPORT_DESC_SIZE, /* wItemLength: Total length of Report descriptor */ + 0x00, + /******************** Descriptor of Custom in endpoint ********************/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType: */ + HIDRAW_IN_EP, /* bEndpointAddress: Endpoint Address (IN) */ + 0x03, /* bmAttributes: Interrupt endpoint */ + WBVAL(HIDRAW_IN_SIZE), /* wMaxPacketSize: 4 Byte max */ + HIDRAW_IN_INTERVAL, /* bInterval: Polling Interval */ + /******************** Descriptor of Custom out endpoint ********************/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType: */ + HIDRAW_OUT_EP, /* bEndpointAddress: Endpoint Address (IN) */ + 0x03, /* bmAttributes: Interrupt endpoint */ + WBVAL(HIDRAW_OUT_EP_SIZE), /* wMaxPacketSize: 4 Byte max */ + HIDRAW_OUT_EP_INTERVAL, /* bInterval: Polling Interval */ + /* 73 */ + /////////////////////////////////////// + /// string0 descriptor + /////////////////////////////////////// + USB_LANGID_INIT(USBD_LANGID_STRING), + /////////////////////////////////////// + /// string1 descriptor + /////////////////////////////////////// + 0x14, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + /////////////////////////////////////// + /// string2 descriptor + /////////////////////////////////////// + 0x26, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + ' ', 0x00, /* wcChar9 */ + 'H', 0x00, /* wcChar10 */ + 'I', 0x00, /* wcChar11 */ + 'D', 0x00, /* wcChar12 */ + ' ', 0x00, /* wcChar13 */ + 'D', 0x00, /* wcChar14 */ + 'E', 0x00, /* wcChar15 */ + 'M', 0x00, /* wcChar16 */ + 'O', 0x00, /* wcChar17 */ + /////////////////////////////////////// + /// string3 descriptor + /////////////////////////////////////// + 0x16, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + '2', 0x00, /* wcChar0 */ + '0', 0x00, /* wcChar1 */ + '2', 0x00, /* wcChar2 */ + '2', 0x00, /* wcChar3 */ + '1', 0x00, /* wcChar4 */ + '2', 0x00, /* wcChar5 */ + '3', 0x00, /* wcChar6 */ + '4', 0x00, /* wcChar7 */ + '5', 0x00, /* wcChar8 */ + '6', 0x00, /* wcChar9 */ +#ifdef CONFIG_USB_HS + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x01, + 0x00, +#endif + 0x00 +}; + +/*!< custom hid report descriptor */ +static const uint8_t hid_custom_report_desc[HID_CUSTOM_REPORT_DESC_SIZE] = { + /* USER CODE BEGIN 0 */ + 0x06, 0x00, 0xff, // USAGE_PAGE (Vendor Defined Page 1) + 0x09, 0x01, // USAGE (Vendor Usage 1) + 0xa1, 0x01, // COLLECTION (Application) + 0x09, 0x01, // USAGE (Vendor Usage 1) + 0x15, 0x00, // LOGICAL_MINIMUM (0) + 0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255) + 0x95, 0x40, // REPORT_COUNT (64) + 0x75, 0x08, // REPORT_SIZE (8) + 0x81, 0x02, // INPUT (Data,Var,Abs) + /* <___________________________________________________> */ + 0x09, 0x01, // USAGE (Vendor Usage 1) + 0x15, 0x00, // LOGICAL_MINIMUM (0) + 0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255) + 0x95, 0x40, // REPORT_COUNT (64) + 0x75, 0x08, // REPORT_SIZE (8) + 0x91, 0x02, // OUTPUT (Data,Var,Abs) + /* USER CODE END 0 */ + 0xC0 /* END_COLLECTION */ +}; + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t read_buffer[2048]; + +void usbd_configure_done_callback(void) +{ + /* setup first out ep read transfer */ + usbd_ep_start_read(HIDRAW_OUT_EP, read_buffer, 64); +} + +/*!< class */ +static usbd_class_t hid_class; + +/*!< interface one */ +static usbd_interface_t hid_intf_1; + +static void usbd_hid_custom_in_callback(uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual in len:%d\r\n", nbytes); + if (custom_state == HID_STATE_BUSY) { + /*!< update the state */ + custom_state = HID_STATE_IDLE; + } +} + +static void usbd_hid_custom_out_callback(uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual out len:%d\r\n", nbytes); + usbd_ep_start_read(HIDRAW_OUT_EP, read_buffer, 64); +} + +static usbd_endpoint_t custom_in_ep = { + .ep_cb = usbd_hid_custom_in_callback, + .ep_addr = HIDRAW_IN_EP +}; + +static usbd_endpoint_t custom_out_ep = { + .ep_cb = usbd_hid_custom_out_callback, + .ep_addr = HIDRAW_OUT_EP +}; + +/* function ------------------------------------------------------------------*/ +/** + * @brief hid custom init + * @pre none + * @param[in] none + * @retval none + */ +void hid_custom_keyboard_init(void) +{ + usbd_desc_register(hid_descriptor); + /*!< add interface ! the first interface */ + usbd_hid_add_interface(&hid_class, &hid_intf_1); + /*!< interface0 add endpoint ! the first endpoint */ + usbd_interface_add_endpoint(&hid_intf_1, &custom_in_ep); + /*!< interface0 add endpoint ! the second endpoint */ + usbd_interface_add_endpoint(&hid_intf_1, &custom_out_ep); + /*!< register report descriptor interface 0 */ + usbd_hid_report_descriptor_register(0, hid_custom_report_desc, HID_CUSTOM_REPORT_DESC_SIZE); + + usbd_initialize(); +} + +void hid_custom_test(void) +{ + uint8_t sendbuffer[64] = { 0x00, 0x00, HID_KEY_A, 0x00, 0x00, 0x00, 0x00, 0x00 }; + custom_state = HID_STATE_BUSY; + usbd_ep_start_write(HIDRAW_IN_EP, sendbuffer, 8); + while (custom_state == HID_STATE_BUSY) { + } +} \ No newline at end of file diff --git a/demo/hid_custom_keyboard_template.c b/demo/hid_custom_keyboard_template.c deleted file mode 100644 index fca6f15b..00000000 --- a/demo/hid_custom_keyboard_template.c +++ /dev/null @@ -1,449 +0,0 @@ -#include "usbd_core.h" -#include "usbd_hid.h" - -#define HID_STATE_IDLE 0 -#define HID_STATE_BUSY 1 - -/*!< keyboard in endpoint */ -#define KBD_IN_EP 0x81 /*!< address */ -#define KBD_IN_EP_SIZE 8 /*!< max packet length */ -#define KBD_IN_EP_INTERVAL 10 /*!< polling time */ - -/*!< keyboard out endpoint */ -#define KBD_OUT_EP 0x01 /*!< address */ -#define KBD_OUT_EP_SIZE 1 /*!< max packet length */ -#define KBD_OUT_EP_INTERVAL 10 /*!< polling time */ - -/*!< hidraw in endpoint */ -#define HIDRAW_IN_EP 0x82 -#define HIDRAW_IN_SIZE 64 -#define HIDRAW_IN_INTERVAL 10 - -/*!< hidraw out endpoint */ -#define HIDRAW_OUT_EP 0x02 -#define HIDRAW_OUT_EP_SIZE 64 -#define HIDRAW_OUT_EP_INTERVAL 10 - -#define USBD_VID 0xffff -#define USBD_PID 0xffff -#define USBD_MAX_POWER 100 -#define USBD_LANGID_STRING 1033 - -/*!< hid state ! Data can be sent only when state is idle */ -uint8_t keyboard_state = HID_STATE_IDLE; -uint8_t custom_state = HID_STATE_IDLE; - -/*!< config descriptor size */ -#define USB_HID_CONFIG_DESC_SIZ 73 - -/*!< report descriptor size */ -#define HID_KEYBOARD_REPORT_DESC_SIZE 63 - -/*!< custom hid report descriptor size */ -#define HID_CUSTOM_REPORT_DESC_SIZE 34 - -/*!< global descriptor */ -static const uint8_t hid_descriptor[] = { - USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0002, 0x01), - USB_CONFIG_DESCRIPTOR_INIT(USB_HID_CONFIG_DESC_SIZ, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), - /************** Descriptor of Keyboard interface ****************/ - /* 09 */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType: Interface descriptor type */ - 0x00, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x02, /* 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 Keyboard HID ********************/ - /* 18 */ - 0x09, /* bLength: HID Descriptor size */ - HID_DESCRIPTOR_TYPE_HID, /* 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_KEYBOARD_REPORT_DESC_SIZE, /* wItemLength: Total length of Report descriptor */ - 0x00, - /******************** Descriptor of Keyboard in endpoint ********************/ - /* 27 */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType: */ - KBD_IN_EP, /* bEndpointAddress: Endpoint Address (IN) */ - 0x03, /* bmAttributes: Interrupt endpoint */ - KBD_IN_EP_SIZE, /* wMaxPacketSize: 4 Byte max */ - 0x00, - KBD_IN_EP_INTERVAL, /* bInterval: Polling Interval */ - /******************** Descriptor of Keyboard out endpoint ********************/ - /* 34 */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType: */ - KBD_OUT_EP, /* bEndpointAddress: Endpoint Address (IN) */ - 0x03, /* bmAttributes: Interrupt endpoint */ - KBD_OUT_EP_SIZE, /* wMaxPacketSize: 4 Byte max */ - 0x00, - KBD_OUT_EP_INTERVAL, /* bInterval: Polling Interval */ - /************** Descriptor of Custom interface *****************/ - /* 41 */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType: Interface descriptor type */ - 0x01, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x02, /* bNumEndpoints */ - 0x03, /* bInterfaceClass: HID */ - 0x01, /* bInterfaceSubClass : 1=BOOT, 0=no boot */ - 0x00, /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */ - 0, /* iInterface: Index of string descriptor */ - /******************** Descriptor of Custom HID ********************/ - /* 50 */ - 0x09, /* bLength: HID Descriptor size */ - HID_DESCRIPTOR_TYPE_HID, /* 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_CUSTOM_REPORT_DESC_SIZE, /* wItemLength: Total length of Report descriptor */ - 0x00, - /******************** Descriptor of Custom in endpoint ********************/ - /* 59 */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType: */ - HIDRAW_IN_EP, /* bEndpointAddress: Endpoint Address (IN) */ - 0x03, /* bmAttributes: Interrupt endpoint */ - HIDRAW_IN_SIZE, /* wMaxPacketSize: 4 Byte max */ - 0x00, - HIDRAW_IN_INTERVAL, /* bInterval: Polling Interval */ - /******************** Descriptor of Custom out endpoint ********************/ - /* 66 */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType: */ - HIDRAW_OUT_EP, /* bEndpointAddress: Endpoint Address (IN) */ - 0x03, /* bmAttributes: Interrupt endpoint */ - HIDRAW_OUT_EP_SIZE, /* wMaxPacketSize: 4 Byte max */ - 0x00, - HIDRAW_OUT_EP_INTERVAL, /* bInterval: Polling Interval */ - /* 73 */ - /////////////////////////////////////// - /// string0 descriptor - /////////////////////////////////////// - USB_LANGID_INIT(USBD_LANGID_STRING), - /////////////////////////////////////// - /// string1 descriptor - /////////////////////////////////////// - 0x14, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - /////////////////////////////////////// - /// string2 descriptor - /////////////////////////////////////// - 0x26, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - ' ', 0x00, /* wcChar9 */ - 'H', 0x00, /* wcChar10 */ - 'I', 0x00, /* wcChar11 */ - 'D', 0x00, /* wcChar12 */ - ' ', 0x00, /* wcChar13 */ - 'D', 0x00, /* wcChar14 */ - 'E', 0x00, /* wcChar15 */ - 'M', 0x00, /* wcChar16 */ - 'O', 0x00, /* wcChar17 */ - /////////////////////////////////////// - /// string3 descriptor - /////////////////////////////////////// - 0x16, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - '2', 0x00, /* wcChar0 */ - '0', 0x00, /* wcChar1 */ - '2', 0x00, /* wcChar2 */ - '2', 0x00, /* wcChar3 */ - '1', 0x00, /* wcChar4 */ - '2', 0x00, /* wcChar5 */ - '3', 0x00, /* wcChar6 */ - '4', 0x00, /* wcChar7 */ - '5', 0x00, /* wcChar8 */ - '6', 0x00, /* wcChar9 */ -#ifdef CONFIG_USB_HS - /////////////////////////////////////// - /// device qualifier descriptor - /////////////////////////////////////// - 0x0a, - USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x01, - 0x00, -#endif - 0x00 -}; - -/*!< hid keyboard report descriptor */ -static const uint8_t hid_keyboard_report_desc[HID_KEYBOARD_REPORT_DESC_SIZE] = { - 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, 0xFF, // LOGICAL_MAXIMUM (255) - 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 -}; - -/*!< custom hid report descriptor */ -static const uint8_t hid_custom_report_desc[HID_CUSTOM_REPORT_DESC_SIZE] = { - /* USER CODE BEGIN 0 */ - 0x06, 0x00, 0xff, // USAGE_PAGE (Vendor Defined Page 1) - 0x09, 0x01, // USAGE (Vendor Usage 1) - 0xa1, 0x01, // COLLECTION (Application) - 0x09, 0x01, // USAGE (Vendor Usage 1) - 0x15, 0x00, // LOGICAL_MINIMUM (0) - 0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255) - 0x95, 0x40, // REPORT_COUNT (64) - 0x75, 0x08, // REPORT_SIZE (8) - 0x81, 0x02, // INPUT (Data,Var,Abs) - /* <___________________________________________________> */ - 0x09, 0x01, // USAGE (Vendor Usage 1) - 0x15, 0x00, // LOGICAL_MINIMUM (0) - 0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255) - 0x95, 0x40, // REPORT_COUNT (64) - 0x75, 0x08, // REPORT_SIZE (8) - 0x91, 0x02, // OUTPUT (Data,Var,Abs) - /* USER CODE END 0 */ - 0xC0 /* END_COLLECTION */ -}; - -/*!< class */ -static usbd_class_t hid_class; - -/*!< interface one */ -static usbd_interface_t hid_intf_1; - -/*!< interface two */ -static usbd_interface_t hid_intf_2; - -/* function ------------------------------------------------------------------*/ -static void usbd_hid_kbd_in_callback(uint8_t ep) -{ - /*!< endpoint call back */ - /*!< transfer successfully */ - if (keyboard_state == HID_STATE_BUSY) { - /*!< update the state */ - keyboard_state = HID_STATE_IDLE; - } -} - -static void usbd_hid_kbd_out_callback(uint8_t ep) -{ - /*!< here you can write the LED processing from the host */ - enum hid_kbd_led led_state; - /*!< read the led data from host send */ - usbd_ep_read(ep, &led_state, KBD_OUT_EP_SIZE, NULL); - /*!< diy */ - if (led_state & HID_KBD_LED_NUM_LOCK) { - /*!< num lock */ - /*!< do what you like */ - } else { - } - if (led_state & HID_KBD_LED_CAPS_LOCK) { - /*!< caps lock */ - } else { - } - - if (led_state & HID_KBD_LED_SCROLL_LOCK) { - /*!< scroll lock */ - /*!< do what you like */ - } else { - } - if (led_state & HID_KBD_LED_COMPOSE) { - /*!< compose led */ - /*!< do what you like */ - } else { - } - if (led_state & HID_KBD_LED_KANA) { - /*!< kana led */ - /*!< do what you like */ - } else { - } -} - -static void usbd_hid_custom_in_callback(uint8_t ep) -{ - /*!< endpoint call back */ - /*!< transfer successfully */ - if (custom_state == HID_STATE_BUSY) { - /*!< update the state */ - custom_state = HID_STATE_IDLE; - } -} - -static void usbd_hid_custom_out_callback(uint8_t ep) -{ - /*!< read the data from host send */ - uint8_t custom_data[HIDRAW_OUT_EP_SIZE]; - usbd_ep_read(HIDRAW_OUT_EP, custom_data, HIDRAW_OUT_EP_SIZE, NULL); - - /*!< you can use the data do some thing you like */ -} - -/*!< endpoint call back */ -static usbd_endpoint_t keyboard_in_ep = { - .ep_cb = usbd_hid_kbd_in_callback, - .ep_addr = 0x81 -}; - -static usbd_endpoint_t keyboard_out_ep = { - .ep_cb = usbd_hid_kbd_out_callback, - .ep_addr = 0x01 -}; - -static usbd_endpoint_t custom_in_ep = { - .ep_cb = usbd_hid_custom_in_callback, - .ep_addr = 0x82 -}; - -static usbd_endpoint_t custom_out_ep = { - .ep_cb = usbd_hid_custom_out_callback, - .ep_addr = 0x02 -}; - -/* function ------------------------------------------------------------------*/ -/** - * @brief hid custom init - * @pre none - * @param[in] none - * @retval none - */ -void hid_custom_keyboard_init(void) -{ - usbd_desc_register(hid_descriptor); - /*!< add interface ! the first interface */ - usbd_hid_add_interface(&hid_class, &hid_intf_1); - /*!< interface0 add endpoint ! the first endpoint */ - usbd_interface_add_endpoint(&hid_intf_1, &keyboard_in_ep); - /*!< interface0 add endpoint ! the second endpoint */ - usbd_interface_add_endpoint(&hid_intf_1, &keyboard_out_ep); - /*!< add interface the ! second interface */ - usbd_hid_add_interface(&hid_class, &hid_intf_2); - /*!< interface1 add endpoint ! the first endpoint */ - usbd_interface_add_endpoint(&hid_intf_2, &custom_in_ep); - /*!< interface1 add endpoint ! the second endpoint */ - usbd_interface_add_endpoint(&hid_intf_2, &custom_out_ep); - /*!< register report descriptor interface 0 */ - usbd_hid_report_descriptor_register(0, hid_keyboard_report_desc, HID_KEYBOARD_REPORT_DESC_SIZE); - /*!< register report descriptor interface 1 */ - usbd_hid_report_descriptor_register(1, hid_custom_report_desc, HID_CUSTOM_REPORT_DESC_SIZE); - - usbd_initialize(); -} - -/** - * @brief device send report to host - * @pre none - * @param[in] ep endpoint address - * @param[in] data points to the data buffer waiting to be sent - * @param[in] len length of data to be sent - * @retval none - */ -void hid_keyboard_send_report(uint8_t ep, uint8_t *data, uint8_t len) -{ - if (usb_device_is_configured()) { - if (keyboard_state == HID_STATE_IDLE) { - /*!< updata the state */ - keyboard_state = HID_STATE_BUSY; - /*!< write buffer */ - usbd_ep_write(ep, data, len, NULL); - } - } -} - -/** - * @brief device send report to host - * @pre none - * @param[in] ep endpoint address - * @param[in] data points to the data buffer waiting to be sent - * @param[in] len length of data to be sent - * @retval none - */ -void hid_custom_send_report(uint8_t ep, uint8_t *data, uint8_t len) -{ - if (usb_device_is_configured()) { - if (custom_state == HID_STATE_IDLE) { - /*!< updata the state */ - custom_state = HID_STATE_BUSY; - /*!< write buffer */ - usbd_ep_write(ep, data, len, NULL); - } - } -} - -/** - * @brief hid custom test - * @pre none - * @param[in] none - * @retval none - */ -void hid_custom_test(void) -{ - /*!< keyboard test */ - uint8_t sendbuffer1[8] = { 0x00, 0x00, HID_KEY_A, 0x00, 0x00, 0x00, 0x00, 0x00 }; //A - hid_keyboard_send_report(KBD_IN_EP, sendbuffer1, KBD_IN_EP_SIZE); - /*!< delay 10ms */ - //HAL_Delay(10); - /*!< send button up */ - sendbuffer1[2] = 0; - hid_keyboard_send_report(KBD_IN_EP, sendbuffer1, KBD_IN_EP_SIZE); - /*!< delay 1000ms the custom test */ - //HAL_Delay(1000); - /*!< custom test */ - uint8_t sendbuffer2[64] = { 6 }; - hid_custom_send_report(HIDRAW_IN_EP, sendbuffer2, HIDRAW_IN_SIZE); - //HAL_Delay(1000); -} \ No newline at end of file