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)41static __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)46static __INLINE uint8_t MSS_USBD_CIF_get_dev_addr(void) 47 { 48 return(USB->FADDR); 49 } 50 MSS_USBD_CIF_force_resume(void)51static __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)57static __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)63static __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)68static __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)77static __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)82static __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)93static __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)103static __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)108static __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)118static __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)124static __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)130static __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)136static __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)142static __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)151static __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)157static __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