1 /** 2 ************************************************************************** 3 * @file usbd_core.h 4 * @brief usb device core header file 5 ************************************************************************** 6 * Copyright notice & Disclaimer 7 * 8 * The software Board Support Package (BSP) that is made available to 9 * download from Artery official website is the copyrighted work of Artery. 10 * Artery authorizes customers to use, copy, and distribute the BSP 11 * software and its related documentation for the purpose of design and 12 * development in conjunction with Artery microcontrollers. Use of the 13 * software is governed by this copyright notice and the following disclaimer. 14 * 15 * THIS SOFTWARE IS PROVIDED ON "AS IS" BASIS WITHOUT WARRANTIES, 16 * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS, 17 * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR 18 * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS, 19 * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, 20 * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. 21 * 22 ************************************************************************** 23 */ 24 25 /* define to prevent recursive inclusion -------------------------------------*/ 26 #ifndef __USBD_CORE_H 27 #define __USBD_CORE_H 28 29 #ifdef __cplusplus 30 extern "C" { 31 #endif 32 33 #include "usb_std.h" 34 35 /** @addtogroup USBD_drivers_core 36 * @{ 37 */ 38 39 /** @defgroup USBD_core_exported_types 40 * @{ 41 */ 42 43 #ifdef BSP_USING_USBD 44 45 /** 46 * @brief usb device event 47 */ 48 typedef enum 49 { 50 USBD_NOP_EVENT, /*!< usb device event nop */ 51 USBD_RESET_EVENT, /*!< usb device event reset */ 52 USBD_SUSPEND_EVENT, /*!< usb device event suspend */ 53 USBD_WAKEUP_EVENT, /*!< usb device event wakeup */ 54 USBD_ERR_EVENT /*!< usb device event error */ 55 }usbd_event_type; 56 57 /** 58 * @brief usb device descriptor struct 59 */ 60 typedef struct 61 { 62 uint16_t length; /*!< descriptor length */ 63 uint8_t *descriptor; /*!< descriptor string */ 64 }usbd_desc_t; 65 66 /** 67 * @brief usb device descriptor handler 68 */ 69 typedef struct 70 { 71 usbd_desc_t *(*get_device_descriptor)(void); /*!< get device descriptor callback */ 72 usbd_desc_t *(*get_device_qualifier)(void); /*!< get device qualifier callback */ 73 usbd_desc_t *(*get_device_configuration)(void); /*!< get device configuration callback */ 74 usbd_desc_t *(*get_device_other_speed)(void); /*!< get device other speed callback */ 75 usbd_desc_t *(*get_device_lang_id)(void); /*!< get device lang id callback */ 76 usbd_desc_t *(*get_device_manufacturer_string)(void); /*!< get device manufacturer callback */ 77 usbd_desc_t *(*get_device_product_string)(void); /*!< get device product callback */ 78 usbd_desc_t *(*get_device_serial_string)(void); /*!< get device serial callback */ 79 usbd_desc_t *(*get_device_interface_string)(void); /*!< get device interface string callback */ 80 usbd_desc_t *(*get_device_config_string)(void); /*!< get device device config callback */ 81 }usbd_desc_handler; 82 83 /** 84 * @brief usb device class handler 85 */ 86 typedef struct 87 { 88 usb_sts_type (*init_handler)(void *udev); /*!< usb class init handler */ 89 usb_sts_type (*clear_handler)(void *udev); /*!< usb class clear handler */ 90 usb_sts_type (*setup_handler)(void *udev, usb_setup_type *setup); /*!< usb class setup handler */ 91 usb_sts_type (*ept0_tx_handler)(void *udev); /*!< usb class endpoint 0 tx complete handler */ 92 usb_sts_type (*ept0_rx_handler)(void *udev); /*!< usb class endpoint 0 rx complete handler */ 93 usb_sts_type (*in_handler)(void *udev, uint8_t ept_num); /*!< usb class in transfer complete handler */ 94 usb_sts_type (*out_handler)(void *udev, uint8_t ept_num); /*!< usb class out transfer complete handler */ 95 usb_sts_type (*sof_handler)(void *udev); /*!< usb class sof handler */ 96 usb_sts_type (*event_handler)(void *udev, usbd_event_type event); /*!< usb class event handler */ 97 void *pdata; /*!< usb class data pointer */ 98 }usbd_class_handler; 99 100 /** 101 * @brief usb device core struct type 102 */ 103 typedef struct 104 { 105 usb_reg_type *usb_reg; /*!< usb register pointer */ 106 107 usbd_class_handler *class_handler; /*!< usb device class handler pointer */ 108 usbd_desc_handler *desc_handler; /*!< usb device descriptor handler pointer */ 109 110 usb_ept_info ept_in[USB_EPT_MAX_NUM]; /*!< usb in endpoint infomation struct */ 111 usb_ept_info ept_out[USB_EPT_MAX_NUM]; /*!< usb out endpoint infomation struct */ 112 113 usb_setup_type setup; /*!< usb setup type struct */ 114 uint8_t setup_buffer[12]; /*!< usb setup request buffer */ 115 116 uint8_t ept0_sts; /*!< usb control endpoint 0 state */ 117 uint8_t speed; /*!< usb speed */ 118 uint16_t ept0_wlength; /*!< usb endpoint 0 transfer length */ 119 120 usbd_conn_state conn_state; /*!< usb current connect state */ 121 usbd_conn_state old_conn_state; /*!< usb save the previous connect state */ 122 123 uint8_t device_addr; /*!< device address */ 124 uint8_t remote_wakup; /*!< remote wakeup state */ 125 uint8_t default_config; /*!< usb default config state */ 126 uint8_t dev_config; /*!< usb device config state */ 127 uint16_t config_status; /*!< usb configure status */ 128 129 void *pdata; 130 }usbd_core_type; 131 132 /** 133 * @} 134 */ 135 136 /** @defgroup USBD_core_exported_functions 137 * @{ 138 */ 139 void usbd_core_in_handler(usbd_core_type *udev, uint8_t ept_num); 140 void usbd_core_out_handler(usbd_core_type *udev, uint8_t ept_num); 141 void usbd_core_setup_handler(usbd_core_type *udev, uint8_t ept_num); 142 void usbd_ctrl_unsupport(usbd_core_type *udev); 143 void usbd_ctrl_send(usbd_core_type *udev, uint8_t *buffer, uint16_t len); 144 void usbd_ctrl_recv(usbd_core_type *udev, uint8_t *buffer, uint16_t len); 145 void usbd_ctrl_send_status(usbd_core_type *udev); 146 void usbd_ctrl_recv_status(usbd_core_type *udev); 147 void usbd_set_stall(usbd_core_type *udev, uint8_t ept_addr); 148 void usbd_clear_stall(usbd_core_type *udev, uint8_t ept_addr); 149 void usbd_ept_open(usbd_core_type *udev, uint8_t ept_addr, uint8_t ept_type, uint16_t maxpacket); 150 void usbd_ept_close(usbd_core_type *udev, uint8_t ept_addr); 151 void usbd_ept_send(usbd_core_type *udev, uint8_t ept_num, uint8_t *buffer, uint16_t len); 152 void usbd_ept_recv(usbd_core_type *udev, uint8_t ept_num, uint8_t *buffer, uint16_t len); 153 void usbd_connect(usbd_core_type *udev); 154 void usbd_disconnect(usbd_core_type *udev); 155 void usbd_set_device_addr(usbd_core_type *udev, uint8_t address); 156 uint32_t usbd_get_recv_len(usbd_core_type *udev, uint8_t ept_addr); 157 usbd_conn_state usbd_connect_state_get(usbd_core_type *udev); 158 void usbd_ept_dbuffer_enable(usbd_core_type *udev, uint8_t ept_addr); 159 void usbd_ept_buf_auto_define(usb_ept_info *ept_info); 160 void usbd_ept_buf_custom_define( usbd_core_type *udev, uint8_t ept_addr, 161 uint32_t addr); 162 void usbd_ept_defaut_init(usbd_core_type *udev); 163 void usbd_remote_wakeup(usbd_core_type *udev); 164 void usbd_enter_suspend(usbd_core_type *udev); 165 void usbd_core_init(usbd_core_type *udev, 166 usb_reg_type *usb_reg, 167 uint8_t core_id); 168 169 #endif 170 171 /** 172 * @} 173 */ 174 175 /** 176 * @} 177 */ 178 179 #ifdef __cplusplus 180 } 181 #endif 182 183 #endif 184 185