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