1 /** 2 ************************************************************************** 3 * @file usbh_core.h 4 * @brief usb host 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 __USBH_CORE_H 27 #define __USBH_CORE_H 28 29 #ifdef __cplusplus 30 extern "C" { 31 #endif 32 33 #include "usb_std.h" 34 35 /** @addtogroup USBH_drivers_core 36 * @{ 37 */ 38 39 /** @defgroup USBH_core_exported_types 40 * @{ 41 */ 42 43 #ifdef USE_OTG_HOST_MODE 44 45 /** 46 * @brief usb channel flag 47 */ 48 typedef enum 49 { 50 HCH_IDLE, /*!< usb host channel idle */ 51 HCH_XFRC, /*!< usb host channel transfer completed */ 52 HCH_HALTED, /*!< usb host channel halted */ 53 HCH_NAK, /*!< usb host channel nak */ 54 HCH_NYET, /*!< usb host channel nyet */ 55 HCH_STALL, /*!< usb host channel stall */ 56 HCH_XACTERR, /*!< usb host channel transaction error */ 57 HCH_BBLERR, /*!< usb host channel babble error */ 58 HCH_DATATGLERR /*!< usb host channel data toggle error */ 59 } hch_sts_type; 60 61 /** 62 * @brief usb channel state 63 */ 64 typedef enum 65 { 66 URB_IDLE = 0, /*!< usb request idle state */ 67 URB_DONE, /*!< usb request done state */ 68 URB_NOTREADY, /*!< usb request not ready state */ 69 URB_NYET, /*!< usb request nyet stat e*/ 70 URB_ERROR, /*!< usb request error state */ 71 URB_STALL /*!< usb request stall state */ 72 } urb_sts_type; 73 74 /** 75 * @brief usb control channel flag 76 */ 77 typedef enum 78 { 79 CTRL_START = 0, /*!< usb control request start */ 80 CTRL_XFERC, /*!< usb control request completed */ 81 CTRL_HALTED, /*!< usb control request halted */ 82 CTRL_NAK, /*!< usb control request nak */ 83 CTRL_STALL, /*!< usb control request stall */ 84 CTRL_XACTERR, /*!< usb control request transaction error */ 85 CTRL_BBLERR, /*!< usb control request babble error */ 86 CTRL_DATATGLERR, /*!< usb control request data toggle error */ 87 CTRL_FAIL /*!< usb control request failed */ 88 } ctrl_sts_type; 89 90 /** 91 * @brief usb host control state machine 92 */ 93 typedef enum 94 { 95 CONTROL_IDLE, /*!< usb control state idle */ 96 CONTROL_SETUP, /*!< usb control state setup */ 97 CONTROL_SETUP_WAIT, /*!< usb control state setup wait */ 98 CONTROL_DATA_IN, /*!< usb control state data in */ 99 CONTROL_DATA_IN_WAIT, /*!< usb control state data in wait */ 100 CONTROL_DATA_OUT, /*!< usb control state data out */ 101 CONTROL_DATA_OUT_WAIT, /*!< usb control state data out wait */ 102 CONTROL_STATUS_IN, /*!< usb control state status in */ 103 CONTROL_STATUS_IN_WAIT, /*!< usb control state status in wait */ 104 CONTROL_STATUS_OUT, /*!< usb control state out */ 105 CONTROL_STATUS_OUT_WAIT, /*!< usb control state out wait */ 106 CONTROL_ERROR, /*!< usb control state error */ 107 CONTROL_STALL, /*!< usb control state stall */ 108 CONTROL_COMPLETE /*!< usb control state complete */ 109 } ctrl_ept0_sts_type; 110 111 /** 112 * @brief usb host enumration state machine 113 */ 114 typedef enum 115 { 116 ENUM_IDLE, /*!< usb host enumration state idle */ 117 ENUM_GET_MIN_DESC, /*!< usb host enumration state get descriptor 8 byte*/ 118 ENUM_GET_FULL_DESC, /*!< usb host enumration state get descriptor 18 byte*/ 119 ENUM_SET_ADDR, /*!< usb host enumration state set address */ 120 ENUM_GET_CFG, /*!< usb host enumration state get configuration */ 121 ENUM_GET_FULL_CFG, /*!< usb host enumration state get full configuration */ 122 ENUM_GET_MFC_STRING, /*!< usb host enumration state get manufacturer string */ 123 ENUM_GET_PRODUCT_STRING, /*!< usb host enumration state get product string */ 124 ENUM_GET_SERIALNUM_STRING, /*!< usb host enumration state get serial number string */ 125 ENUM_SET_CONFIG, /*!< usb host enumration state set config */ 126 ENUM_COMPLETE, /*!< usb host enumration state complete */ 127 } usbh_enum_sts_type; 128 129 /** 130 * @brief usb host global state machine 131 */ 132 typedef enum 133 { 134 USBH_IDLE, /*!< usb host global state idle */ 135 USBH_PORT_EN, /*!< usb host global state port enable */ 136 USBH_ATTACHED, /*!< usb host global state attached */ 137 USBH_DISCONNECT, /*!< usb host global state disconnect */ 138 USBH_DEV_SPEED, /*!< usb host global state device speed */ 139 USBH_ENUMERATION, /*!< usb host global state enumeration */ 140 USBH_CLASS_REQUEST, /*!< usb host global state class request */ 141 USBH_CLASS, /*!< usb host global state class */ 142 USBH_CTRL_XFER, /*!< usb host global state control transfer */ 143 USBH_USER_HANDLER, /*!< usb host global state user handler */ 144 USBH_SUSPEND, /*!< usb host global state suspend */ 145 USBH_SUSPENDED, /*!< usb host have in suspend mode */ 146 USBH_WAKEUP, /*!< usb host global state wakeup */ 147 USBH_UNSUPPORT, /*!< usb host global unsupport device */ 148 USBH_ERROR_STATE, /*!< usb host global state error */ 149 } usbh_gstate_type; 150 151 /** 152 * @brief usb host transfer state 153 */ 154 typedef enum 155 { 156 CMD_IDLE, /*!< usb host transfer state idle */ 157 CMD_SEND, /*!< usb host transfer state send */ 158 CMD_WAIT /*!< usb host transfer state wait */ 159 } cmd_sts_type; 160 161 /** 162 * @brief usb host channel malloc state 163 */ 164 #define HCH_OK 0x0000 /*!< usb channel malloc state ok */ 165 #define HCH_USED 0x8000 /*!< usb channel had used */ 166 #define HCH_ERROR 0xFFFF /*!< usb channel error */ 167 #define HCH_USED_MASK 0x7FFF /*!< usb channel use mask */ 168 169 /** 170 * @brief channel pid 171 */ 172 #define HCH_PID_DATA0 0 /*!< usb channel pid data 0 */ 173 #define HCH_PID_DATA2 1 /*!< usb channel pid data 2 */ 174 #define HCH_PID_DATA1 2 /*!< usb channel pid data 1 */ 175 #define HCH_PID_SETUP 3 /*!< usb channel pid setup */ 176 #define HCH_PID_MDATA 3 /*!< usb channel pid mdata */ 177 178 /** 179 * @brief channel data transfer direction 180 */ 181 #define USB_REQUEST_DIR_MASK 0x80 /*!< usb request direction mask */ 182 #define USB_DIR_H2D USB_REQ_DIR_HTD /*!< usb request direction host to device */ 183 #define USB_DIR_D2H USB_REQ_DIR_DTH /*!< usb request direction device to host */ 184 185 /** 186 * @brief request timeout 187 */ 188 #define DATA_STAGE_TIMEOUT 5000 /*!< usb data stage timeout */ 189 #define NODATA_STAGE_TIMEOUT 50 /*!< usb no-data stage timeout */ 190 191 /** 192 * @brief max interface and endpoint 193 */ 194 #define USBH_MAX_ERROR_COUNT 2 /*!< usb support maximum error */ 195 #define USBH_MAX_INTERFACE 5 /*!< usb support maximum interface */ 196 #define USBH_MAX_ENDPOINT 5 /*!< usb support maximum endpoint */ 197 198 /** 199 * @brief interface descriptor 200 */ 201 typedef struct 202 { 203 usb_interface_desc_type interface; /*!< usb device interface descriptor structure */ 204 usb_endpoint_desc_type endpoint[USBH_MAX_ENDPOINT]; /*!< usb device endpoint descriptor structure array */ 205 } usb_itf_desc_type; 206 207 /** 208 * @brief configure descriptor 209 */ 210 typedef struct 211 { 212 usb_configuration_desc_type cfg; /*!< usb device configuration descriptor structure */ 213 usb_itf_desc_type interface[USBH_MAX_INTERFACE]; /*!< usb device interface descriptor structure array*/ 214 } usb_cfg_desc_type; 215 216 /** 217 * @brief device descriptor 218 */ 219 typedef struct 220 { 221 uint8_t address; /*!< usb device address */ 222 uint8_t speed; /*!< usb device speed */ 223 usb_device_desc_type dev_desc; /*!< usb device descriptor */ 224 usb_cfg_desc_type cfg_desc; /*!< usb device configuration */ 225 } usbh_dev_desc_type; 226 227 /** 228 * @brief usb host control struct type 229 */ 230 typedef struct 231 { 232 uint8_t hch_in; /*!< in channel number */ 233 uint8_t hch_out; /*!< out channel number */ 234 uint8_t ept0_size; /*!< endpoint 0 size */ 235 uint8_t *buffer; /*!< endpoint 0 transfer buffer */ 236 usb_setup_type setup; /*!< control setup type */ 237 uint16_t len; /*!< transfer length */ 238 uint8_t err_cnt; /*!< error counter */ 239 uint32_t timer; /*!< transfer timer */ 240 ctrl_sts_type sts; /*!< control transfer status */ 241 ctrl_ept0_sts_type state; /*!< endpoint 0 state */ 242 } usbh_ctrl_type; 243 244 /** 245 * @brief host class handler type 246 */ 247 typedef struct 248 { 249 usb_sts_type (*init_handler)(void *uhost); /*!< usb host class init handler */ 250 usb_sts_type (*reset_handler)(void *uhost); /*!< usb host class reset handler */ 251 usb_sts_type (*request_handler)(void *uhost); /*!< usb host class request handler */ 252 usb_sts_type (*process_handler)(void *uhost); /*!< usb host class process handler */ 253 void *pdata; /*!< usb host class data */ 254 } usbh_class_handler_type; 255 256 /** 257 * @brief host user handler type 258 */ 259 typedef struct 260 { 261 usb_sts_type (*user_init)(void); /*!< usb host user init handler */ 262 usb_sts_type (*user_reset)(void); /*!< usb host user reset handler */ 263 usb_sts_type (*user_attached)(void); /*!< usb host user attached handler */ 264 usb_sts_type (*user_disconnect)(void); /*!< usb host user disconnect handler */ 265 usb_sts_type (*user_speed)(uint8_t speed); /*!< usb host user speed handler */ 266 usb_sts_type (*user_mfc_string)(void *); /*!< usb host user manufacturer string handler */ 267 usb_sts_type (*user_product_string)(void *); /*!< usb host user product string handler */ 268 usb_sts_type (*user_serial_string)(void *); /*!< usb host user serial handler */ 269 usb_sts_type (*user_enumeration_done)(void); /*!< usb host user enumeration done handler */ 270 usb_sts_type (*user_application)(void); /*!< usb host user application handler */ 271 usb_sts_type (*user_active_vbus)(void *uhost, confirm_state state); /*!< usb host user active vbus */ 272 usb_sts_type (*user_not_support)(void); /*!< usb host user not support handler */ 273 } usbh_user_handler_type; 274 275 /** 276 * @brief host host core handler type 277 */ 278 typedef struct 279 { 280 usb_reg_type *usb_reg; /*!< usb register pointer */ 281 282 uint8_t global_state; /*!< usb host global state machine */ 283 uint8_t enum_state; /*!< usb host enumeration state machine */ 284 uint8_t req_state; /*!< usb host request state machine */ 285 286 usbh_dev_desc_type dev; /*!< usb device descriptor */ 287 usbh_ctrl_type ctrl; /*!< usb host control transfer struct */ 288 289 usbh_class_handler_type *class_handler; /*!< usb host class handler pointer */ 290 usbh_user_handler_type *user_handler; /*!< usb host user handler pointer */ 291 292 usb_hch_type hch[USB_HOST_CHANNEL_NUM]; /*!< usb host channel array */ 293 uint8_t rx_buffer[USB_MAX_DATA_LENGTH]; /*!< usb host rx buffer */ 294 295 uint32_t conn_sts; /*!< connect status */ 296 uint32_t port_enable; /*!< port enable status */ 297 uint32_t timer; /*!< sof timer */ 298 uint32_t dma_en; /*!< usb dma enable */ 299 uint8_t speed; /*!< usb speed */ 300 301 uint32_t err_cnt[USB_HOST_CHANNEL_NUM]; /*!< error counter */ 302 uint32_t xfer_cnt[USB_HOST_CHANNEL_NUM]; /*!< xfer counter */ 303 hch_sts_type hch_state[USB_HOST_CHANNEL_NUM];/*!< channel state */ 304 urb_sts_type urb_state[USB_HOST_CHANNEL_NUM];/*!< usb request state */ 305 uint16_t channel[USB_HOST_CHANNEL_NUM]; /*!< channel array */ 306 307 void *pdata; 308 } usbh_core_type; 309 310 311 void usbh_free_channel(usbh_core_type *uhost, uint8_t index); 312 uint16_t usbh_get_free_channel(usbh_core_type *uhost); 313 usb_sts_type usbh_set_toggle(usbh_core_type *uhost, uint8_t hc_num, uint8_t toggle); 314 usb_sts_type usbh_in_out_request(usbh_core_type *uhost, uint8_t hc_num); 315 usb_sts_type usbh_interrupt_recv(usbh_core_type *uhost, uint8_t hc_num, 316 uint8_t *buffer, uint16_t length); 317 usb_sts_type usbh_interrupt_send(usbh_core_type *uhost, uint8_t hc_num, 318 uint8_t *buffer, uint16_t length); 319 usb_sts_type usbh_bulk_recv(usbh_core_type *uhost, uint8_t hc_num, 320 uint8_t *buffer, uint16_t length); 321 usb_sts_type usbh_bulk_send(usbh_core_type *uhost, uint8_t hc_num, 322 uint8_t *buffer, uint16_t length); 323 usb_sts_type usbh_isoc_send(usbh_core_type *uhost, uint8_t hc_num, 324 uint8_t *buffer, uint16_t length); 325 usb_sts_type usbh_isoc_recv(usbh_core_type *uhost, uint8_t hc_num, 326 uint8_t *buffer, uint16_t length); 327 usb_sts_type usbh_cfg_default_init(usbh_core_type *uhost); 328 void usbh_enter_suspend(usbh_core_type *uhost); 329 void usbh_resume(usbh_core_type *uhost); 330 331 uint16_t usbh_alloc_channel(usbh_core_type *uhost, uint8_t ept_addr); 332 urb_sts_type usbh_get_urb_status(usbh_core_type *uhost, uint8_t ch_num); 333 usb_sts_type usbh_ctrl_result_check(usbh_core_type *uhost, 334 ctrl_ept0_sts_type next_ctrl_state, 335 uint8_t next_enum_state); 336 uint8_t usbh_alloc_address(void); 337 void usbh_reset_port(usbh_core_type *uhost); 338 usb_sts_type usbh_loop_handler(usbh_core_type *uhost); 339 void usbh_ch_disable(usbh_core_type *uhost, uint8_t chn); 340 void usbh_hc_open(usbh_core_type *uhost, 341 uint8_t chn, 342 uint8_t ept_num, 343 uint8_t dev_address, 344 uint8_t type, 345 uint16_t maxpacket, 346 uint8_t speed); 347 void usbh_active_vbus(usbh_core_type *uhost, confirm_state state); 348 349 usb_sts_type usbh_core_init(usbh_core_type *uhost, 350 usb_reg_type *usb_reg, 351 uint8_t core_id); 352 353 hch_sts_type usbh_get_status(usbh_core_type *uhost, uint8_t ch_num); 354 355 #endif 356 357 358 /** 359 * @} 360 */ 361 362 /** 363 * @} 364 */ 365 366 #ifdef __cplusplus 367 } 368 #endif 369 370 #endif 371