1 /*******************************************************************************
2  * Copyright 2019-2020 Microchip FPGA Embedded Systems Solutions.
3  *
4  * SPDX-License-Identifier: MIT
5  *
6  * PolarFire SoC MSS USB Driver Stack
7  *      USB Core Interface Layer (USB-CIFL)
8  *          USBD-CIF driver
9  *
10  * USBD-CIF driver public API.
11  *
12  */
13 
14 #ifndef __MSS_USB_DEVICE_CIF_H_
15 #define __MSS_USB_DEVICE_CIF_H_
16 
17 #include "mss_usb_core_regs.h"
18 #include "mss_usb_common_reg_io.h"
19 #include "mss_usb_device_reg_io.h"
20 #include "mss_usb_common_cif.h"
21 
22 #ifdef __cplusplus
23 extern "C" {
24 #endif
25 
26 #ifdef MSS_USB_DEVICE_ENABLED
27 
28 /*******************************************************************************
29  Exported APIs from USBD-CIF
30  */
31 void
32 MSS_USBD_CIF_get_hwcore_info
33 (
34     mss_usb_core_info_t* hw_core
35 );
36 
37 /* DeviceInfo register related APIs */
38 
39 /*lint -e20 -e522 -e10 -e40 -e63 -e35 -e26 -e78*/
40 
MSS_USBD_CIF_set_dev_addr(uint8_t addr)41 static __INLINE void MSS_USBD_CIF_set_dev_addr(uint8_t addr)
42 {
43     USB->FADDR = addr;
44 }
45 
MSS_USBD_CIF_get_dev_addr(void)46 static __INLINE uint8_t MSS_USBD_CIF_get_dev_addr(void)
47 {
48     return(USB->FADDR);
49 }
50 
MSS_USBD_CIF_force_resume(void)51 static __INLINE void MSS_USBD_CIF_force_resume(void)
52 {
53     MSS_USBD_CIF_resume_gen();
54 }
55 
56 /*ISO INEP Will wait for SOF packet after TxPktRdy is set*/
MSS_USBD_CIF_set_isoupdate(void)57 static __INLINE void MSS_USBD_CIF_set_isoupdate(void)
58 {
59     USB->POWER |= POWER_REG_ISO_UPDATE_MASK;
60 }
61 
62 /*ISO INEP Will NOT wait for SOF packet after TxPktRdy is set*/
MSS_USBD_CIF_clr_isoupdate(void)63 static __INLINE void MSS_USBD_CIF_clr_isoupdate(void)
64 {
65     USB->POWER &= ~POWER_REG_ISO_UPDATE_MASK;
66 }
67 
MSS_USBD_CIF_rx_ep_clr_stall(mss_usb_ep_num_t ep_num)68 static __INLINE void MSS_USBD_CIF_rx_ep_clr_stall(mss_usb_ep_num_t ep_num)
69 {
70     MSS_USB_CIF_rx_ep_clr_send_stall_bit(ep_num);
71 
72     /*TODO: Confirm...this is required for clear feature command*/
73     MSS_USB_CIF_rx_ep_clr_data_tog(ep_num);
74 }
75 
76 
MSS_USBD_CIF_rx_ep_stall(mss_usb_ep_num_t ep_num)77 static __INLINE void MSS_USBD_CIF_rx_ep_stall(mss_usb_ep_num_t ep_num)
78 {
79     MSS_USB_CIF_rx_ep_set_send_stall_bit(ep_num);
80 }
81 
MSS_USBD_CIF_tx_ep_clr_stall(mss_usb_ep_num_t ep_num)82 static __INLINE void MSS_USBD_CIF_tx_ep_clr_stall(mss_usb_ep_num_t ep_num)
83 {
84     MSS_USB_CIF_tx_ep_clr_send_stall_bit(ep_num);
85 
86     /*
87     TODO: Confirm...this is required for clear feature command
88     Lakeview page:62
89     */
90     MSS_USB_CIF_tx_ep_clr_data_tog(ep_num);
91 }
92 
MSS_USBD_CIF_tx_ep_stall(mss_usb_ep_num_t ep_num)93 static __INLINE void MSS_USBD_CIF_tx_ep_stall(mss_usb_ep_num_t ep_num)
94 {
95     MSS_USB_CIF_tx_ep_set_send_stall_bit(ep_num);
96 }
97 
98 /*
99  Soft connect -- D+ and D- lines are connected to the bus Valid in Device
100  mode only.
101  */
102 
MSS_USBD_CIF_dev_connect(void)103 static __INLINE void MSS_USBD_CIF_dev_connect(void)
104 {
105     USB->POWER |= POWER_REG_SOFT_CONN_MASK;
106 }
107 
MSS_USBD_CIF_dev_disconnect(void)108 static __INLINE void MSS_USBD_CIF_dev_disconnect(void)
109 {
110     USB->POWER &= ~POWER_REG_SOFT_CONN_MASK;
111 }
112 
113 /*
114  In Device mode, only FS or HS are possible.
115  In Host mode, becomes valid after reset bit is cleared.
116  Remains valid till session ends
117 */
MSS_USBD_CIF_is_hs_mode(void)118 static __INLINE uint8_t MSS_USBD_CIF_is_hs_mode(void)
119 {
120     return(((USB->POWER & POWER_REG_HS_MODE_MASK) ?
121                                 MSS_USB_BOOLEAN_TRUE : MSS_USB_BOOLEAN_FALSE));
122 }
123 
MSS_USBD_CIF_cep_end_zdr(void)124 static __INLINE void MSS_USBD_CIF_cep_end_zdr(void)
125 {
126     USB->INDEXED_CSR.DEVICE_EP0.CSR0 = (CSR0L_DEV_SERVICED_RX_PKT_RDY_MASK |
127                                         CSR0L_DEV_DATA_END_MASK);
128 }
129 
MSS_USBD_CIF_cep_clr_rxpktrdy(void)130 static __INLINE void MSS_USBD_CIF_cep_clr_rxpktrdy(void)
131 {
132     /*Setting SERVICED_RX_PKT_RDY clears RxPktRdy bit*/
133     USB->INDEXED_CSR.DEVICE_EP0.CSR0 = CSR0L_DEV_SERVICED_RX_PKT_RDY_MASK;
134 }
135 
MSS_USBD_CIF_cep_stall(void)136 static __INLINE void MSS_USBD_CIF_cep_stall(void)
137 {
138     USB->INDEXED_CSR.DEVICE_EP0.CSR0 = (CSR0L_DEV_SEND_STALL_MASK |
139                                          CSR0L_DEV_SERVICED_RX_PKT_RDY_MASK);
140 }
141 /*write Data Req, host writing on device (USB OUT) */
MSS_USBD_CIF_cep_end_wdr(void)142 static __INLINE void MSS_USBD_CIF_cep_end_wdr(void)
143 {
144     USB->INDEXED_CSR.DEVICE_EP0.CSR0 = (CSR0L_DEV_SERVICED_RX_PKT_RDY_MASK |
145                                         CSR0L_DEV_DATA_END_MASK);
146 }
147 
148 /*Read Data Req, host reading from device (USB IN)*/
149 /*Taken care by MSS_USBD_CIF_cep_write_pkt
150 TODO: Check with Different Optimization levels*/
MSS_USBD_CIF_cep_end_rdr(void)151 static __INLINE void MSS_USBD_CIF_cep_end_rdr(void)
152 {
153     USB->INDEXED_CSR.DEVICE_EP0.CSR0 = (CSR0L_DEV_TX_PKT_RDY_MASK |
154                                         CSR0L_DEV_DATA_END_MASK);
155 }
156 
MSS_USBD_CIF_reset_index_reg(void)157 static __INLINE void MSS_USBD_CIF_reset_index_reg(void)
158 {
159     USB->INDEX = 0u;
160 }
161 
162 /*lint -restore */
163 /***************************************************************************//**
164 
165 */
166 void
167 MSS_USBD_CIF_init
168 (
169     mss_usb_device_speed_t speed
170 );
171 
172 /***************************************************************************//**
173 
174 */
175 void
176 MSS_USBD_CIF_cep_configure
177 (
178     void
179 );
180 
181 /***************************************************************************//**
182 
183 */
184 void
185 MSS_USBD_CIF_cep_rx_prepare
186 (
187     mss_usb_ep_t* device_ep
188 );
189 
190 /***************************************************************************//**
191 
192 */
193 void
194 MSS_USBD_CIF_cep_read_pkt
195 (
196     mss_usb_ep_t* device_ep
197 );
198 
199 /***************************************************************************//**
200 
201 */
202 void
203 MSS_USBD_CIF_cep_write_pkt
204 (
205     mss_usb_ep_t* device_ep
206 );
207 
208 /***************************************************************************//**
209 
210 */
211 void
212 MSS_USBD_CIF_tx_ep_configure
213 (
214     mss_usb_ep_t* device_ep
215 );
216 
217 /***************************************************************************//**
218 
219 */
220 void
221 MSS_USBD_CIF_rx_ep_configure
222 (
223     mss_usb_ep_t* device_ep
224 );
225 
226 #endif  //MSS_USB_DEVICE_ENABLED
227 
228 #ifdef __cplusplus
229 }
230 #endif
231 
232 #endif  /* __MSS_USB_DEVICE_CIF_H_ */
233