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