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 USE_OTG_DEVICE_MODE
44 
45 /**
46   * @brief usb device speed
47   */
48 #ifndef USB_HIGH_SPEED
49 #define USB_HIGH_SPEED                    0
50 #endif
51 
52 #ifndef USB_FULL_SPEED
53 #define USB_FULL_SPEED                    1
54 #endif
55 
56 /**
57   * @brief usb device event
58   */
59 typedef enum
60 {
61   USBD_NOP_EVENT,             /*!< usb device nop event */
62   USBD_RESET_EVENT,           /*!< usb device reset event */
63   USBD_SUSPEND_EVENT,         /*!< usb device suspend event */
64   USBD_WAKEUP_EVENT,          /*!< usb device wakeup event */
65   USBD_DISCONNECT_EVNET,      /*!< usb device disconnect event */
66   USBD_INISOINCOM_EVENT,      /*!< usb device inisoincom event */
67   USBD_OUTISOINCOM_EVENT,     /*!< usb device outisoincom event */
68   USBD_ERR_EVENT              /*!< usb device error event */
69 }usbd_event_type;
70 
71 /**
72   * @brief usb device descriptor struct
73   */
74 typedef struct
75 {
76   uint16_t length;                       /*!< descriptor length */
77   uint8_t *descriptor;                   /*!< descriptor string */
78 }usbd_desc_t;
79 
80 /**
81   * @brief usb device descriptor handler
82   */
83 typedef struct
84 {
85   usbd_desc_t *(*get_device_descriptor)(void);                       /*!< get device descriptor callback */
86   usbd_desc_t *(*get_device_qualifier)(void);                        /*!< get device qualifier callback */
87   usbd_desc_t *(*get_device_configuration)(void);                    /*!< get device configuration callback */
88   usbd_desc_t *(*get_device_other_speed)(void);                      /*!< get device other speed callback */
89   usbd_desc_t *(*get_device_lang_id)(void);                          /*!< get device lang id callback */
90   usbd_desc_t *(*get_device_manufacturer_string)(void);              /*!< get device manufacturer callback */
91   usbd_desc_t *(*get_device_product_string)(void);                   /*!< get device product callback */
92   usbd_desc_t *(*get_device_serial_string)(void);                    /*!< get device serial callback */
93   usbd_desc_t *(*get_device_interface_string)(void);                 /*!< get device interface string callback */
94   usbd_desc_t *(*get_device_config_string)(void);                    /*!< get device device config callback */
95   usbd_desc_t *(*get_hs_device_configuration)(void);                 /*!< get hs device configuration callback */
96 }usbd_desc_handler;
97 
98 /**
99   * @brief usb device class handler
100   */
101 typedef struct
102 {
103   usb_sts_type (*init_handler)(void *udev);                          /*!< usb class init handler */
104   usb_sts_type (*clear_handler)(void *udev);                         /*!< usb class clear handler */
105   usb_sts_type (*setup_handler)(void *udev, usb_setup_type *setup);  /*!< usb class setup handler */
106   usb_sts_type (*ept0_tx_handler)(void *udev);                       /*!< usb class endpoint 0 tx complete handler */
107   usb_sts_type (*ept0_rx_handler)(void *udev);                       /*!< usb class endpoint 0 rx complete handler */
108   usb_sts_type (*in_handler)(void *udev, uint8_t ept_num);           /*!< usb class in transfer complete handler */
109   usb_sts_type (*out_handler)(void *udev, uint8_t ept_num);          /*!< usb class out transfer complete handler */
110   usb_sts_type (*sof_handler)(void *udev);                           /*!< usb class sof handler */
111   usb_sts_type (*event_handler)(void *udev, usbd_event_type event);  /*!< usb class event handler */
112   void         *pdata;                                               /*!< usb class data pointer */
113 }usbd_class_handler;
114 
115 /**
116   * @brief usb device core struct type
117   */
118 typedef struct
119 {
120   usb_reg_type                           *usb_reg;                   /*!< usb register pointer */
121 
122   usbd_class_handler                     *class_handler;             /*!< usb device class handler pointer */
123   usbd_desc_handler                      *desc_handler;              /*!< usb device descriptor handler pointer */
124 
125   usb_ept_info                           ept_in[USB_EPT_MAX_NUM];    /*!< usb in endpoint infomation struct */
126   usb_ept_info                           ept_out[USB_EPT_MAX_NUM];   /*!< usb out endpoint infomation struct */
127 
128   usb_setup_type                         setup;                      /*!< usb setup type struct */
129   uint32_t                               setup_buffer[12];           /*!< usb setup request buffer */
130 
131   uint8_t                                ept0_sts;                   /*!< usb control endpoint 0 state */
132   uint8_t                                speed;                      /*!< usb speed */
133   uint16_t                               ept0_wlength;               /*!< usb endpoint 0 transfer length */
134 
135   usbd_conn_state                        conn_state;                 /*!< usb current connect state */
136   usbd_conn_state                        old_conn_state;             /*!< usb save the previous connect state */
137 
138   uint8_t                                device_addr;                /*!< device address */
139   uint8_t                                remote_wakup;               /*!< remote wakeup state */
140   uint8_t                                default_config;             /*!< usb default config state */
141   uint8_t                                dev_config;                 /*!< usb device config state */
142   uint32_t                               config_status;              /*!< usb configure status */
143   uint32_t                               dma_en;                     /*!< usb dma enable */
144   uint8_t                                test_mode;
145 
146   void                                   *pdata;
147 }usbd_core_type;
148 
149 void usbd_core_in_handler(usbd_core_type *udev, uint8_t ept_num);
150 void usbd_core_out_handler(usbd_core_type *udev, uint8_t ept_num);
151 void usbd_core_setup_handler(usbd_core_type *udev, uint8_t ept_num);
152 void usbd_ctrl_unsupport(usbd_core_type *udev);
153 void usbd_ept0_out_dma_set(usbd_core_type *udev);
154 void usbd_ctrl_send(usbd_core_type *udev, uint8_t *buffer, uint16_t len);
155 void usbd_ctrl_recv(usbd_core_type *udev, uint8_t *buffer, uint16_t len);
156 void usbd_ctrl_send_status(usbd_core_type *udev);
157 void usbd_ctrl_recv_status(usbd_core_type *udev);
158 void usbd_set_stall(usbd_core_type *udev, uint8_t ept_addr);
159 void usbd_clear_stall(usbd_core_type *udev, uint8_t ept_addr);
160 void usbd_ept_open(usbd_core_type *udev, uint8_t ept_addr, uint8_t ept_type, uint16_t maxpacket);
161 void usbd_ept_close(usbd_core_type *udev, uint8_t ept_addr);
162 void usbd_ept_send(usbd_core_type *udev, uint8_t ept_num, uint8_t *buffer, uint16_t len);
163 void usbd_ept_recv(usbd_core_type *udev, uint8_t ept_num, uint8_t *buffer, uint16_t len);
164 void usbd_connect(usbd_core_type *udev);
165 void usbd_disconnect(usbd_core_type *udev);
166 void usbd_set_device_addr(usbd_core_type *udev, uint8_t address);
167 uint32_t usbd_get_recv_len(usbd_core_type *udev, uint8_t ept_addr);
168 void usb_ept_defaut_init(usbd_core_type *udev);
169 usbd_conn_state usbd_connect_state_get(usbd_core_type *udev);
170 void usbd_remote_wakeup(usbd_core_type *udev);
171 void usbd_enter_suspend(usbd_core_type *udev);
172 void usbd_flush_tx_fifo(usbd_core_type *udev, uint8_t ept_num);
173 void usbd_fifo_alloc(usbd_core_type *udev);
174 usb_sts_type usbd_core_init(usbd_core_type *udev,
175                             usb_reg_type *usb_reg,
176                             uint8_t core_id);
177 #endif
178 
179 /**
180   * @}
181   */
182 
183 /**
184   * @}
185   */
186 
187 #ifdef __cplusplus
188 }
189 #endif
190 
191 #endif
192