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  *          USB-CIF.
9  *
10  * This file provides interfaces to perform register bit level
11  * I\O operations which are independent of USB Device/host mode.
12  *
13  */
14 
15 #ifndef __MSS_USB_COMMON_REG_IO_H_
16 #define __MSS_USB_COMMON_REG_IO_H_
17 
18 #include <stdint.h>
19 #include "mss_usb_common_cif.h"
20 #include "mss_usb_core_regs.h"
21 
22 #define __INLINE        inline
23 
24 #ifdef __cplusplus
25 extern "C" {
26 #endif
27 
28 /*-------------------------------------------------------------------------*//**
29 * Common function for DEVICE and HOST mode.
30 */
31 
32 /*-------------------------------------------------------------------------*//**
33   SOFT_RST register related APIs
34  */
35 static __INLINE void
MSS_USB_CIF_soft_reset(void)36 MSS_USB_CIF_soft_reset
37 (
38     void
39 )
40 {
41     volatile uint8_t soft_reset;
42 
43     USB->SOFT_RST = SOFT_RESET_REG_MASK;
44     do {
45         soft_reset = USB->SOFT_RST;
46     } while (soft_reset != 0x00u);
47 }
48 
49 /*-------------------------------------------------------------------------*//**
50   POWER register related APIs
51  */
52 static __INLINE void
MSS_USB_CIF_enable_hs_mode(void)53 MSS_USB_CIF_enable_hs_mode
54 (
55     void
56 )
57 {
58     USB->POWER |= POWER_REG_ENABLE_HS_MASK;
59 }
60 
61 static __INLINE void
MSS_USB_CIF_disable_hs_mode(void)62 MSS_USB_CIF_disable_hs_mode
63 (
64     void
65 )
66 {
67     USB->POWER &= ~POWER_REG_ENABLE_HS_MASK;
68 }
69 
70 /*-------------------------------------------------------------------------*//**
71   Read USB interrupt register to know which interrupt has occurred.
72  */
73 static __INLINE uint8_t
MSS_USB_CIF_read_irq_reg(void)74 MSS_USB_CIF_read_irq_reg
75 (
76     void
77 )
78 {
79     return (USB->USB_IRQ);
80 }
81 
82 /*-------------------------------------------------------------------------*//**
83   EP IRQ related APIs
84  */
85 /* TX IRQ related APIs */
86 static __INLINE uint16_t
MSS_USB_CIF_read_tx_ep_irq_reg(void)87 MSS_USB_CIF_read_tx_ep_irq_reg
88 (
89     void
90 )
91 {
92     return (USB->TX_IRQ);
93 }
94 
95 static __INLINE uint16_t
MSS_USB_CIF_read_rx_ep_irq_reg(void)96 MSS_USB_CIF_read_rx_ep_irq_reg
97 (
98     void
99 )
100 {
101     return (USB->RX_IRQ);
102 }
103 
104 static __INLINE void
MSS_USB_CIF_clr_usb_irq_reg(void)105 MSS_USB_CIF_clr_usb_irq_reg
106 (
107     void
108 )
109 {
110     USB->USB_IRQ = 0u;
111 }
112 
113 static __INLINE void
MSS_USB_CIF_tx_ep_enable_irq(mss_usb_ep_num_t ep_num)114 MSS_USB_CIF_tx_ep_enable_irq
115 (
116     mss_usb_ep_num_t ep_num
117 )
118 {
119     USB->TX_IRQ_ENABLE |= (uint16_t)(MSS_USB_WORD_BIT_0_MASK << (uint8_t)ep_num);
120 }
121 
122 
123 static __INLINE void
MSS_USB_CIF_tx_ep_disable_irq(mss_usb_ep_num_t ep_num)124 MSS_USB_CIF_tx_ep_disable_irq
125 (
126     mss_usb_ep_num_t ep_num
127 )
128 {
129     USB->TX_IRQ_ENABLE &= (uint16_t)(~(MSS_USB_WORD_BIT_0_MASK << (uint8_t)ep_num));
130 }
131 
132 static __INLINE void
MSS_USB_CIF_tx_ep_disable_irq_all(void)133 MSS_USB_CIF_tx_ep_disable_irq_all
134 (
135     void
136 )
137 {
138     /* Keep D0, CEP interrupt bit unaltered.*/
139     USB->TX_IRQ_ENABLE = (USB->TX_IRQ_ENABLE & TX_IRQ_ENABLE_REG_CEP_MASK);
140 }
141 
142 static __INLINE void
MSS_USB_CIF_rx_ep_enable_irq(mss_usb_ep_num_t ep_num)143 MSS_USB_CIF_rx_ep_enable_irq
144 (
145     mss_usb_ep_num_t ep_num
146 )
147 {
148     USB->RX_IRQ_ENABLE |= (uint16_t)(MSS_USB_WORD_BIT_0_MASK << (uint8_t)ep_num);
149 }
150 
151 static __INLINE void
MSS_USB_CIF_rx_ep_disable_irq(mss_usb_ep_num_t ep_num)152 MSS_USB_CIF_rx_ep_disable_irq
153 (
154     mss_usb_ep_num_t ep_num
155 )
156 {
157     USB->RX_IRQ_ENABLE &= (uint16_t)(~(MSS_USB_WORD_BIT_0_MASK << (uint8_t)ep_num));
158 }
159 
160 static __INLINE void
MSS_USB_CIF_rx_ep_disable_irq_all(void)161 MSS_USB_CIF_rx_ep_disable_irq_all
162 (
163     void
164 )
165 {
166     USB->RX_IRQ_ENABLE = 0u ;
167 }
168 
169 /*-------------------------------------------------------------------------*//**
170   FRAME register related APIs
171  */
172 static __INLINE uint16_t
MSS_USB_CIF_get_last_frame_nbr(void)173 MSS_USB_CIF_get_last_frame_nbr
174 (
175     void
176 )
177 {
178     return (USB->FRAME);
179 }
180 
181 /*-------------------------------------------------------------------------*//**
182   DEVCTL register related APIs
183  */
184 static __INLINE mss_usb_core_mode_t
MSS_USB_CIF_get_mode(void)185 MSS_USB_CIF_get_mode
186 (
187     void
188 )
189 {
190     return (((USB->DEV_CTRL & DEV_CTRL_HOST_MODE_MASK) ?
191                             MSS_USB_CORE_MODE_HOST : MSS_USB_CORE_MODE_DEVICE));
192 }
193 
194 static __INLINE mss_usb_vbus_level_t
MSS_USB_CIF_get_vbus_level(void)195 MSS_USB_CIF_get_vbus_level
196 (
197     void
198 )
199 {
200     uint8_t vbus;
201     mss_usb_vbus_level_t ret_val = VBUS_BLOW_SESSIONEND;
202 
203     vbus = (USB->DEV_CTRL & DEV_CTRL_VBUS_MASK);
204 
205     switch (vbus)
206     {
207         case VBUS_BELOW_SESSION_END:
208                 ret_val = VBUS_BLOW_SESSIONEND;
209                 break;
210         case VBUS_ABOVE_SESSION_END:
211                 ret_val = VBUS_ABV_SESSIONEND_BLOW_AVALID;
212                 break;
213         case VBUS_ABOVE_AVALID:
214                 ret_val = VBUS_ABV_AVALID_BLOW_VB_VALID;
215                 break;
216         case VBUS_ABOVE_VBUS_VALID:
217                 ret_val = VBUS_ABV_VB_VALID;
218                 break;
219         default:
220                 /* Empty */
221                 break;
222 
223     }
224     return ret_val;
225 }
226 
227 static __INLINE mss_usb_device_role_t
MSS_USB_CIF_get_role(void)228 MSS_USB_CIF_get_role
229 (
230     void
231 )
232 {
233     /* TODO:only valid when session bit is set */
234     return (((USB->DEV_CTRL & DEV_CTRL_B_DEVICE_MASK) ?
235                 MSS_USB_DEVICE_ROLE_DEVICE_B : MSS_USB_DEVICE_ROLE_DEVICE_A));
236 }
237 
238 static __INLINE uint8_t
MSS_USB_CIF_is_session_on(void)239 MSS_USB_CIF_is_session_on
240 (
241     void
242 )
243 {
244     /* TODO:only valid when session bit is set */
245     return (((USB->DEV_CTRL & DEV_CTRL_SESSION_MASK) ?
246                 MSS_USB_BOOLEAN_TRUE : MSS_USB_BOOLEAN_FALSE));
247 }
248 
MSS_USB_CIF_start_session(void)249 static __INLINE void MSS_USB_CIF_start_session(void)
250 {
251     USB->DEV_CTRL |= DEV_CTRL_SESSION_MASK;
252 }
MSS_USB_CIF_stop_session(void)253 static __INLINE void MSS_USB_CIF_stop_session(void)
254 {
255     USB->DEV_CTRL &= ~DEV_CTRL_SESSION_MASK;
256 }
257 
258 /*-------------------------------------------------------------------------*//**
259   INDEXED registers
260  */
261 
262 /*-------------------------------------------------------------------------*//**
263   CSR0L register related APIs
264  */
265 static __INLINE uint8_t
MSS_USB_CIF_cep_is_rxpktrdy(void)266 MSS_USB_CIF_cep_is_rxpktrdy
267 (
268     void
269 )
270 {
271     return (((USB->INDEXED_CSR.DEVICE_EP0.CSR0 & CSR0L_DEV_RX_PKT_RDY_MASK) ?
272                                 MSS_USB_BOOLEAN_TRUE : MSS_USB_BOOLEAN_FALSE));
273 }
274 
275 static __INLINE void
MSS_USB_CIF_cep_set_txpktrdy(void)276 MSS_USB_CIF_cep_set_txpktrdy
277 (
278     void
279 )
280 {
281     USB->INDEXED_CSR.DEVICE_EP0.CSR0 |= CSR0L_DEV_TX_PKT_RDY_MASK;
282 }
283 
284 static __INLINE void
MSS_USB_CIF_cep_clr_stall_sent(void)285 MSS_USB_CIF_cep_clr_stall_sent
286 (
287     void
288 )
289 {
290     USB->INDEXED_CSR.DEVICE_EP0.CSR0 &= ~CSR0L_DEV_STALL_SENT_MASK;
291 }
292 
293 static __INLINE uint8_t
MSS_USB_CIF_cep_is_stall_sent(void)294 MSS_USB_CIF_cep_is_stall_sent
295 (
296     void
297 )
298 {
299     return (((USB->INDEXED_CSR.DEVICE_EP0.CSR0 & CSR0L_DEV_STALL_SENT_MASK) ?
300                                 MSS_USB_BOOLEAN_TRUE : MSS_USB_BOOLEAN_FALSE));
301 }
302 
303 static __INLINE void
MSS_USB_CIF_cep_clr_setupend(void)304 MSS_USB_CIF_cep_clr_setupend
305 (
306     void
307 )
308 {
309     /* Setting SERVICED_SETUP_END bit clears SetupEnd bit */
310     USB->INDEXED_CSR.DEVICE_EP0.CSR0 |= CSR0L_DEV_SERVICED_SETUP_END_MASK;
311 }
312 static __INLINE uint8_t
MSS_USB_CIF_cep_is_setupend(void)313 MSS_USB_CIF_cep_is_setupend
314 (
315     void
316 )
317 {
318     return (((USB->INDEXED_CSR.DEVICE_EP0.CSR0 & CSR0L_DEV_SETUP_END_MASK) ?
319                                 MSS_USB_BOOLEAN_TRUE : MSS_USB_BOOLEAN_FALSE));
320 }
321 
322 static __INLINE void
MSS_USB_CIF_cep_reset_csr0_reg(void)323 MSS_USB_CIF_cep_reset_csr0_reg
324 (
325     void
326 )
327 {
328     /* load the reset value for the register */
329     USB->INDEXED_CSR.DEVICE_EP0.CSR0 = 0u;
330 }
331 
332 /*-------------------------------------------------------------------------*//**
333   CNTRH0 register related APIs
334  */
335 static __INLINE uint8_t
MSS_USB_CIF_cep_rx_byte_count(void)336 MSS_USB_CIF_cep_rx_byte_count
337 (
338     void
339 )
340 {
341     /* TODO:confirm CSR0.D0 bit before returning */
342     return (USB->INDEXED_CSR.DEVICE_EP0.COUNT0 & COUNT0_REG_MASK);
343 }
344 
345 /*-------------------------------------------------------------------------*//**
346   TXMAXP register related APIs
347  */
348 static __INLINE void
MSS_USB_CIF_tx_ep_set_max_pkt(mss_usb_ep_num_t ep_num,mss_usb_xfr_type_t xfr_type,uint16_t max_pkt_size,uint8_t num_usb_pkt)349 MSS_USB_CIF_tx_ep_set_max_pkt
350 (
351     mss_usb_ep_num_t ep_num,
352     mss_usb_xfr_type_t xfr_type,
353     uint16_t max_pkt_size,
354     uint8_t num_usb_pkt
355 )
356 {
357     /* TODO:make sure that there is no data in FIFO before writing into the maxP
358        reg
359      */
360     if ((ep_num > MSS_USB_CEP) && ((max_pkt_size % 8) == 0u) && (num_usb_pkt > 0u))
361     {
362         if((num_usb_pkt > 31u))
363         {
364             /* not allowed */
365         }
366         else
367         {
368             USB->ENDPOINT[ep_num].TX_MAX_P = 0u;
369             USB->ENDPOINT[ep_num].TX_MAX_P = num_usb_pkt - 1u;
370             USB->ENDPOINT[ep_num].TX_MAX_P <<= TX_MAX_P_REG_NUM_USB_PKT_SHIFT;
371             USB->ENDPOINT[ep_num].TX_MAX_P |= (max_pkt_size);
372         }
373     }
374 }
375 
376 /*-------------------------------------------------------------------------*//**
377   TXCSRL register related APIs
378  */
379 static __INLINE void
MSS_USB_CIF_tx_ep_set_txpktrdy(mss_usb_ep_num_t ep_num)380 MSS_USB_CIF_tx_ep_set_txpktrdy
381 (
382     mss_usb_ep_num_t ep_num
383 )
384 {
385     USB->ENDPOINT[ep_num].TX_CSR |= TxCSRL_REG_EPN_TX_PKT_RDY_MASK;
386 }
387 
388 static __INLINE uint8_t
MSS_USB_CIF_tx_ep_is_txpktrdy(mss_usb_ep_num_t ep_num)389 MSS_USB_CIF_tx_ep_is_txpktrdy
390 (
391     mss_usb_ep_num_t ep_num
392 )
393 {
394     return (((USB->ENDPOINT[ep_num].TX_CSR & TxCSRL_REG_EPN_TX_PKT_RDY_MASK) ?
395                                 MSS_USB_BOOLEAN_TRUE : MSS_USB_BOOLEAN_FALSE));
396 }
397 
398 static __INLINE void
MSS_USB_CIF_tx_ep_set_send_stall_bit(mss_usb_ep_num_t ep_num)399 MSS_USB_CIF_tx_ep_set_send_stall_bit
400 (
401     mss_usb_ep_num_t ep_num
402 )
403 {
404     USB->ENDPOINT[ep_num].TX_CSR |= TxCSRL_REG_EPN_SEND_STALL_MASK;
405 }
406 
407 static __INLINE void
MSS_USB_CIF_tx_ep_clr_send_stall_bit(mss_usb_ep_num_t ep_num)408 MSS_USB_CIF_tx_ep_clr_send_stall_bit
409 (
410     mss_usb_ep_num_t ep_num
411 )
412 {
413     USB->ENDPOINT[ep_num].TX_CSR &= ~TxCSRL_REG_EPN_SEND_STALL_MASK;
414 }
415 
416 static __INLINE void
MSS_USB_CIF_tx_ep_clr_stall_sent_bit(mss_usb_ep_num_t ep_num)417 MSS_USB_CIF_tx_ep_clr_stall_sent_bit
418 (
419     mss_usb_ep_num_t ep_num
420 )
421 {
422     USB->ENDPOINT[ep_num].TX_CSR &= ~TxCSRL_REG_EPN_STALL_SENT_MASK;
423 }
424 
425 static __INLINE uint8_t
MSS_USB_CIF_tx_ep_is_stall_sent_bit(mss_usb_ep_num_t ep_num)426 MSS_USB_CIF_tx_ep_is_stall_sent_bit
427 (
428     mss_usb_ep_num_t ep_num
429 )
430 {
431     return (uint8_t)(((USB->ENDPOINT[ep_num].TX_CSR & TxCSRL_REG_EPN_STALL_SENT_MASK) ?
432                                         MSS_USB_BOOLEAN_TRUE : MSS_USB_BOOLEAN_FALSE));
433 }
434 
435 static __INLINE void
MSS_USB_CIF_tx_ep_clr_data_tog(mss_usb_ep_num_t ep_num)436 MSS_USB_CIF_tx_ep_clr_data_tog
437 (
438     mss_usb_ep_num_t ep_num
439 )
440 {
441     USB->ENDPOINT[ep_num].TX_CSR |= TxCSRL_REG_EPN_CLR_DATA_TOG_MASK;
442 }
443 
444 static __INLINE uint8_t
MSS_USB_CIF_tx_ep_is_isoincomp(mss_usb_ep_num_t ep_num)445 MSS_USB_CIF_tx_ep_is_isoincomp
446 (
447     mss_usb_ep_num_t ep_num
448 )
449 {
450     return (((USB->ENDPOINT[ep_num].TX_CSR & TxCSRL_REG_EPN_ISO_INCOMP_TX_MASK) ?
451                                     MSS_USB_BOOLEAN_TRUE : MSS_USB_BOOLEAN_FALSE));
452 }
453 
454 /*-------------------------------------------------------------------------*//**
455   TXCSRH register related APIs
456  */
457 static __INLINE void
MSS_USB_CIF_tx_ep_set_dma_mode1(mss_usb_ep_num_t ep_num)458 MSS_USB_CIF_tx_ep_set_dma_mode1
459 (
460     mss_usb_ep_num_t ep_num
461 )
462 {
463     USB->ENDPOINT[ep_num].TX_CSR |= TxCSRH_REG_EPN_DMA_MODE_MASK;
464 }
465 
466 static __INLINE void
MSS_USB_CIF_tx_ep_set_dma_mode0(mss_usb_ep_num_t ep_num)467 MSS_USB_CIF_tx_ep_set_dma_mode0
468 (
469     mss_usb_ep_num_t ep_num
470 )
471 {
472     USB->ENDPOINT[ep_num].TX_CSR &= ~TxCSRH_REG_EPN_DMA_MODE_MASK;
473 }
474 
475 static __INLINE uint8_t
MSS_USB_CIF_tx_ep_get_dma_mode(mss_usb_ep_num_t ep_num)476 MSS_USB_CIF_tx_ep_get_dma_mode
477 (
478     mss_usb_ep_num_t ep_num
479 )
480 {
481     return (((USB->ENDPOINT[ep_num].TX_CSR & TxCSRH_REG_EPN_DMA_MODE_MASK) ?
482                                 MSS_USB_BOOLEAN_TRUE : MSS_USB_BOOLEAN_FALSE));
483 }
484 
485 static __INLINE void
MSS_USB_CIF_tx_ep_set_force_data_tog(mss_usb_ep_num_t ep_num)486 MSS_USB_CIF_tx_ep_set_force_data_tog
487 (
488     mss_usb_ep_num_t ep_num
489 )
490 {
491     USB->ENDPOINT[ep_num].TX_CSR |= TxCSRH_REG_EPN_FRC_DAT_TOG_MASK;
492 }
493 
494 static __INLINE void
MSS_USB_CIF_tx_ep_clr_force_data_tog(mss_usb_ep_num_t ep_num)495 MSS_USB_CIF_tx_ep_clr_force_data_tog
496 (
497     mss_usb_ep_num_t ep_num
498 )
499 {
500     USB->ENDPOINT[ep_num].TX_CSR &= ~TxCSRH_REG_EPN_FRC_DAT_TOG_MASK;
501 }
502 
503 static __INLINE void
MSS_USB_CIF_tx_ep_enable_dma(mss_usb_ep_num_t ep_num)504 MSS_USB_CIF_tx_ep_enable_dma
505 (
506     mss_usb_ep_num_t ep_num
507 )
508 {
509     USB->ENDPOINT[ep_num].TX_CSR |= TxCSRH_REG_EPN_ENABLE_DMA_MASK;
510 }
511 
512 static __INLINE void
MSS_USB_CIF_tx_ep_disable_dma(mss_usb_ep_num_t ep_num)513 MSS_USB_CIF_tx_ep_disable_dma
514 (
515     mss_usb_ep_num_t ep_num
516 )
517 {
518     USB->ENDPOINT[ep_num].TX_CSR &= ~TxCSRH_REG_EPN_ENABLE_DMA_MASK;
519 }
520 
521 static __INLINE uint8_t
MSS_USB_CIF_tx_ep_is_dma_enabled(mss_usb_ep_num_t ep_num)522 MSS_USB_CIF_tx_ep_is_dma_enabled
523 (
524     mss_usb_ep_num_t ep_num
525 )
526 {
527     return (((USB->ENDPOINT[ep_num].TX_CSR & TxCSRH_REG_EPN_ENABLE_DMA_MASK) ?
528                                 MSS_USB_BOOLEAN_TRUE : MSS_USB_BOOLEAN_FALSE));
529 }
530 
531 static __INLINE void
MSS_USB_CIF_tx_ep_set_tx_mode(mss_usb_ep_num_t ep_num)532 MSS_USB_CIF_tx_ep_set_tx_mode
533 (
534     mss_usb_ep_num_t ep_num
535 )
536 {
537     USB->ENDPOINT[ep_num].TX_CSR |= TxCSRH_REG_EPN_TXRX_MODE_MASK;
538 }
539 static __INLINE void
MSS_USB_CIF_tx_ep_set_rx_mode(mss_usb_ep_num_t ep_num)540 MSS_USB_CIF_tx_ep_set_rx_mode
541 (
542     mss_usb_ep_num_t ep_num
543 )
544 {
545     USB->ENDPOINT[ep_num].TX_CSR &= ~TxCSRH_REG_EPN_TXRX_MODE_MASK;
546 }
547 
548 static __INLINE void
MSS_USB_CIF_tx_ep_enable_iso(mss_usb_ep_num_t ep_num)549 MSS_USB_CIF_tx_ep_enable_iso
550 (
551     mss_usb_ep_num_t ep_num
552 )
553 {
554     USB->ENDPOINT[ep_num].TX_CSR |= TxCSRH_REG_EPN_ENABLE_ISO_MASK;
555 }
556 
557 static __INLINE void
MSS_USB_CIF_tx_ep_disable_iso(mss_usb_ep_num_t ep_num)558 MSS_USB_CIF_tx_ep_disable_iso
559 (
560     mss_usb_ep_num_t ep_num
561 )
562 {
563     USB->ENDPOINT[ep_num].TX_CSR &= ~TxCSRH_REG_EPN_ENABLE_ISO_MASK;
564 }
565 
566 static __INLINE void
MSS_USB_CIF_tx_ep_set_autoset(mss_usb_ep_num_t ep_num)567 MSS_USB_CIF_tx_ep_set_autoset
568 (
569     mss_usb_ep_num_t ep_num
570 )
571 {
572     USB->ENDPOINT[ep_num].TX_CSR |= TxCSRH_REG_EPN_ENABLE_AUTOSET_MASK;
573 }
574 static __INLINE void
MSS_USB_CIF_tx_ep_clr_autoset(mss_usb_ep_num_t ep_num)575 MSS_USB_CIF_tx_ep_clr_autoset
576 (
577     mss_usb_ep_num_t ep_num
578 )
579 {
580     USB->ENDPOINT[ep_num].TX_CSR &= ~TxCSRH_REG_EPN_ENABLE_AUTOSET_MASK;
581 }
582 
583 static __INLINE uint8_t
MSS_USB_CIF_tx_ep_is_autoset(mss_usb_ep_num_t ep_num)584 MSS_USB_CIF_tx_ep_is_autoset
585 (
586     mss_usb_ep_num_t ep_num
587 )
588 {
589     return (((USB->ENDPOINT[ep_num].TX_CSR & TxCSRH_REG_EPN_ENABLE_AUTOSET_MASK) ?
590                                     MSS_USB_BOOLEAN_TRUE : MSS_USB_BOOLEAN_FALSE));
591 }
592 
593 static __INLINE uint8_t
MSS_USB_CIF_tx_ep_is_underrun(mss_usb_ep_num_t ep_num)594 MSS_USB_CIF_tx_ep_is_underrun
595 (
596     mss_usb_ep_num_t ep_num
597 )
598 {
599    return (((USB->ENDPOINT[ep_num].TX_CSR & TxCSRL_REG_EPN_UNDERRUN_MASK) ?
600                                 MSS_USB_BOOLEAN_TRUE : MSS_USB_BOOLEAN_FALSE));
601 }
602 
603 static __INLINE void
MSS_USB_CIF_tx_ep_clr_underrun(mss_usb_ep_num_t ep_num)604 MSS_USB_CIF_tx_ep_clr_underrun
605 (
606     mss_usb_ep_num_t ep_num
607 )
608 {
609     USB->ENDPOINT[ep_num].TX_CSR &= ~TxCSRL_REG_EPN_UNDERRUN_MASK;
610 }
611 
612 static __INLINE void
MSS_USB_CIF_tx_ep_clr_csrreg(mss_usb_ep_num_t ep_num)613 MSS_USB_CIF_tx_ep_clr_csrreg
614 (
615     mss_usb_ep_num_t ep_num
616 )
617 {
618     USB->ENDPOINT[ep_num].TX_CSR = 0x0000U;
619 }
620 
621 /*-------------------------------------------------------------------------*//**
622   RXMAXP register related APIs
623  */
624 static __INLINE void
MSS_USB_CIF_rx_ep_set_max_pkt(mss_usb_ep_num_t ep_num,mss_usb_xfr_type_t xfr_type,uint16_t max_pkt_size,uint8_t num_usb_pkt)625 MSS_USB_CIF_rx_ep_set_max_pkt
626 (
627     mss_usb_ep_num_t ep_num,
628     mss_usb_xfr_type_t xfr_type,
629     uint16_t max_pkt_size,
630     uint8_t num_usb_pkt
631 )
632 {
633     /* TODO:make sure that there is no data in FIFO before writing into the
634        maxP reg
635      */
636     if ((ep_num > MSS_USB_CEP) && (max_pkt_size > 0u) && ((max_pkt_size % 8) == 0u))
637     {
638         if ((num_usb_pkt > 31u))
639         {
640             /*not allowed*/
641         }
642         else
643         {
644             USB->ENDPOINT[ep_num].RX_MAX_P = 0u;
645             USB->ENDPOINT[ep_num].RX_MAX_P = num_usb_pkt - 1u;
646             USB->ENDPOINT[ep_num].RX_MAX_P <<= RX_MAX_P_REG_NUM_USB_PKT_SHIFT;
647             USB->ENDPOINT[ep_num].RX_MAX_P |= (max_pkt_size);
648         }
649     }
650 }
651 
652 /*-------------------------------------------------------------------------*//**
653   RXCSRL register related APIs
654  */
655 static __INLINE uint8_t
MSS_USB_CIF_rx_ep_is_rxpktrdy(mss_usb_ep_num_t ep_num)656 MSS_USB_CIF_rx_ep_is_rxpktrdy
657 (
658     mss_usb_ep_num_t ep_num
659 )
660 {
661     return (((USB->ENDPOINT[ep_num].RX_CSR & RxCSRL_REG_EPN_RX_PKT_RDY_MASK) ?
662                                 MSS_USB_BOOLEAN_TRUE : MSS_USB_BOOLEAN_FALSE));
663 }
664 
665 static __INLINE void
MSS_USB_CIF_rx_ep_clr_rxpktrdy(mss_usb_ep_num_t ep_num)666 MSS_USB_CIF_rx_ep_clr_rxpktrdy
667 (
668     mss_usb_ep_num_t ep_num
669 )
670 {
671     USB->ENDPOINT[ep_num].RX_CSR &= ~RxCSRL_REG_EPN_RX_PKT_RDY_MASK;
672 }
673 
674 static __INLINE uint8_t
MSS_USB_CIF_rx_ep_is_overrun(mss_usb_ep_num_t ep_num)675 MSS_USB_CIF_rx_ep_is_overrun
676 (
677     mss_usb_ep_num_t ep_num
678 )
679 {
680     return (((USB->ENDPOINT[ep_num].RX_CSR & RxCSRL_REG_EPN_OVERRUN_MASK) ?
681                                 MSS_USB_BOOLEAN_TRUE : MSS_USB_BOOLEAN_FALSE));
682 }
683 
684 static __INLINE void
MSS_USB_CIF_rx_ep_clr_overrun(mss_usb_ep_num_t ep_num)685 MSS_USB_CIF_rx_ep_clr_overrun
686 (
687     mss_usb_ep_num_t ep_num
688 )
689 {
690     uint16_t reg_val = USB->ENDPOINT[ep_num].RX_CSR;
691 
692     reg_val &= ~RxCSRL_REG_EPN_OVERRUN_MASK;
693     reg_val |= RxCSRL_REG_EPN_RX_PKT_RDY_MASK;
694     USB->ENDPOINT[ep_num].RX_CSR = reg_val;
695 }
696 
697 static __INLINE uint8_t
MSS_USB_CIF_rx_ep_is_dataerr(mss_usb_ep_num_t ep_num)698 MSS_USB_CIF_rx_ep_is_dataerr
699 (
700     mss_usb_ep_num_t ep_num
701 )
702 {
703     return (((USB->ENDPOINT[ep_num].RX_CSR & RxCSRL_REG_EPN_DATA_ERR_MASK) ?
704                                 MSS_USB_BOOLEAN_TRUE : MSS_USB_BOOLEAN_FALSE));
705 }
706 
707 static __INLINE void
MSS_USB_CIF_rx_ep_set_send_stall_bit(mss_usb_ep_num_t ep_num)708 MSS_USB_CIF_rx_ep_set_send_stall_bit
709 (
710     mss_usb_ep_num_t ep_num
711 )
712 {
713     USB->ENDPOINT[ep_num].RX_CSR |= (RxCSRL_REG_EPN_SEND_STALL_MASK |
714                                                RxCSRL_REG_EPN_RX_PKT_RDY_MASK);
715 }
716 
717 static __INLINE void
MSS_USB_CIF_rx_ep_clr_send_stall_bit(mss_usb_ep_num_t ep_num)718 MSS_USB_CIF_rx_ep_clr_send_stall_bit
719 (
720     mss_usb_ep_num_t ep_num
721 )
722 {
723     uint16_t reg_val = USB->ENDPOINT[ep_num].RX_CSR;
724 
725     reg_val &= ~RxCSRL_REG_EPN_SEND_STALL_MASK;
726     reg_val |= RxCSRL_REG_EPN_RX_PKT_RDY_MASK;
727     USB->ENDPOINT[ep_num].RX_CSR = reg_val;
728 }
729 
730 static __INLINE uint8_t
MSS_USB_CIF_rx_ep_is_stall_sent_bit(mss_usb_ep_num_t ep_num)731 MSS_USB_CIF_rx_ep_is_stall_sent_bit
732 (
733     mss_usb_ep_num_t ep_num
734 )
735 {
736     return (((USB->ENDPOINT[ep_num].RX_CSR & RxCSRL_REG_EPN_STALL_SENT_MASK) ?
737                                 MSS_USB_BOOLEAN_TRUE : MSS_USB_BOOLEAN_FALSE));
738 }
739 
740 static __INLINE void
MSS_USB_CIF_rx_ep_clr_stall_sent_bit(mss_usb_ep_num_t ep_num)741 MSS_USB_CIF_rx_ep_clr_stall_sent_bit
742 (
743     mss_usb_ep_num_t ep_num
744 )
745 {
746     uint16_t reg_val = USB->ENDPOINT[ep_num].RX_CSR;
747 
748     reg_val &= ~RxCSRL_REG_EPN_STALL_SENT_MASK;
749     reg_val |= RxCSRL_REG_EPN_RX_PKT_RDY_MASK;
750     USB->ENDPOINT[ep_num].RX_CSR = reg_val;
751 }
752 
753 static __INLINE void
MSS_USB_CIF_rx_ep_clr_data_tog(mss_usb_ep_num_t ep_num)754 MSS_USB_CIF_rx_ep_clr_data_tog
755 (
756     mss_usb_ep_num_t ep_num
757 )
758 {
759     /* setting CLR_DAT_TOG bit clears USB Data toggle bit */
760     USB->ENDPOINT[ep_num].RX_CSR |= (RxCSRL_REG_EPN_CLR_DAT_TOG_MASK |
761                                                RxCSRL_REG_EPN_RX_PKT_RDY_MASK);
762 }
763 
764 /*-------------------------------------------------------------------------*//**
765   RXCSRH register related APIs
766  */
767 static __INLINE uint8_t
MSS_USB_CIF_rx_ep_is_isoincomp(mss_usb_ep_num_t ep_num)768 MSS_USB_CIF_rx_ep_is_isoincomp
769 (
770     mss_usb_ep_num_t ep_num
771 )
772 {
773     return (((USB->ENDPOINT[ep_num].RX_CSR & RxCSRL_REG_EPN_RX_ISO_INCOMP) ?
774                             MSS_USB_BOOLEAN_TRUE : MSS_USB_BOOLEAN_FALSE));
775 }
776 
777 static __INLINE mss_usb_dma_mode_t
MSS_USB_CIF_rx_ep_get_dma_mode(mss_usb_ep_num_t ep_num)778 MSS_USB_CIF_rx_ep_get_dma_mode
779 (
780     mss_usb_ep_num_t ep_num
781 )
782 {
783     return (((USB->ENDPOINT[ep_num].RX_CSR & RxCSRL_REG_EPN_DMA_MODE_MASK) ?
784                                     MSS_USB_DMA_MODE1 : MSS_USB_DMA_MODE0));
785 }
786 
787 static __INLINE void
MSS_USB_CIF_rx_ep_set_dma_mode1(mss_usb_ep_num_t ep_num)788 MSS_USB_CIF_rx_ep_set_dma_mode1
789 (
790     mss_usb_ep_num_t ep_num
791 )
792 {
793     USB->ENDPOINT[ep_num].RX_CSR |= (RxCSRL_REG_EPN_DMA_MODE_MASK |
794                                                RxCSRL_REG_EPN_RX_PKT_RDY_MASK);
795 }
796 
797 static __INLINE void
MSS_USB_CIF_rx_ep_set_dma_mode0(mss_usb_ep_num_t ep_num)798 MSS_USB_CIF_rx_ep_set_dma_mode0
799 (
800     mss_usb_ep_num_t ep_num
801 )
802 {
803     uint16_t reg_val = USB->ENDPOINT[ep_num].RX_CSR;
804 
805     reg_val &= ~RxCSRL_REG_EPN_DMA_MODE_MASK;
806     reg_val |= RxCSRL_REG_EPN_RX_PKT_RDY_MASK;
807     USB->ENDPOINT[ep_num].RX_CSR = reg_val;
808 }
809 
810 static __INLINE void
MSS_USB_CIF_rx_ep_enable_dma(mss_usb_ep_num_t ep_num)811 MSS_USB_CIF_rx_ep_enable_dma
812 (
813     mss_usb_ep_num_t ep_num
814 )
815 {
816     USB->ENDPOINT[ep_num].RX_CSR |= (RxCSRL_REG_EPN_ENABLE_DMA_MASK |
817                                                RxCSRL_REG_EPN_RX_PKT_RDY_MASK);
818 }
819 
820 static __INLINE void
MSS_USB_CIF_rx_ep_disable_dma(mss_usb_ep_num_t ep_num)821 MSS_USB_CIF_rx_ep_disable_dma
822 (
823     mss_usb_ep_num_t ep_num
824 )
825 {
826     uint16_t reg_val = USB->ENDPOINT[ep_num].RX_CSR;
827 
828     reg_val &= ~RxCSRL_REG_EPN_ENABLE_DMA_MASK;
829     reg_val |= RxCSRL_REG_EPN_RX_PKT_RDY_MASK;
830     USB->ENDPOINT[ep_num].RX_CSR = reg_val;
831 }
832 
833 static __INLINE uint8_t
MSS_USB_CIF_rx_ep_is_dma_enabled(mss_usb_ep_num_t ep_num)834 MSS_USB_CIF_rx_ep_is_dma_enabled
835 (
836     mss_usb_ep_num_t ep_num
837 )
838 {
839     return (((USB->ENDPOINT[ep_num].RX_CSR & RxCSRL_REG_EPN_ENABLE_DMA_MASK) ?
840                                 MSS_USB_BOOLEAN_TRUE : MSS_USB_BOOLEAN_FALSE));
841 }
842 
843 static __INLINE uint8_t
MSS_USB_CIF_rx_ep_is_piderr(mss_usb_ep_num_t ep_num)844 MSS_USB_CIF_rx_ep_is_piderr
845 (
846     mss_usb_ep_num_t ep_num
847 )
848 {
849     return (((USB->ENDPOINT[ep_num].RX_CSR & RxCSRL_REG_EPN_ISO_PID_ERR_MASK) ?
850                                 MSS_USB_BOOLEAN_TRUE : MSS_USB_BOOLEAN_FALSE));
851 }
852 
853 static __INLINE void
MSS_USB_CIF_rx_ep_disable_nyet(mss_usb_ep_num_t ep_num)854 MSS_USB_CIF_rx_ep_disable_nyet
855 (
856     mss_usb_ep_num_t ep_num
857 )
858 {
859     /* Setting BI_DIS_NYET mask disables NYET */
860     USB->ENDPOINT[ep_num].RX_CSR |= (RxCSRL_REG_EPN_BI_DIS_NYET_MASK |
861                                                RxCSRL_REG_EPN_RX_PKT_RDY_MASK);
862 }
863 
864 static __INLINE void
MSS_USB_CIF_rx_ep_enable_nyet(mss_usb_ep_num_t ep_num)865 MSS_USB_CIF_rx_ep_enable_nyet
866 (
867     mss_usb_ep_num_t ep_num
868 )
869 {
870     uint16_t reg_val = USB->ENDPOINT[ep_num].RX_CSR;
871 
872     reg_val &= ~RxCSRL_REG_EPN_BI_DIS_NYET_MASK;
873     reg_val |= RxCSRL_REG_EPN_RX_PKT_RDY_MASK;
874     USB->ENDPOINT[ep_num].RX_CSR = reg_val;
875 }
876 
877 static __INLINE void
MSS_USB_CIF_rx_ep_disable_iso(mss_usb_ep_num_t ep_num)878 MSS_USB_CIF_rx_ep_disable_iso
879 (
880     mss_usb_ep_num_t ep_num
881 )
882 {
883     uint16_t reg_val = USB->ENDPOINT[ep_num].RX_CSR;
884 
885     reg_val &= ~RxCSRL_REG_EPN_ENABLE_ISO_MASK;
886     reg_val |= RxCSRL_REG_EPN_RX_PKT_RDY_MASK;
887     USB->ENDPOINT[ep_num].RX_CSR = reg_val;
888 }
889 
890 static __INLINE void
MSS_USB_CIF_rx_ep_enable_iso(mss_usb_ep_num_t ep_num)891 MSS_USB_CIF_rx_ep_enable_iso
892 (
893     mss_usb_ep_num_t ep_num
894 )
895 {
896     USB->ENDPOINT[ep_num].RX_CSR |= (RxCSRL_REG_EPN_ENABLE_ISO_MASK |
897                                                RxCSRL_REG_EPN_RX_PKT_RDY_MASK);
898 }
899 
900 static __INLINE void
MSS_USB_CIF_rx_ep_set_autoclr(mss_usb_ep_num_t ep_num)901 MSS_USB_CIF_rx_ep_set_autoclr
902 (
903     mss_usb_ep_num_t ep_num
904 )
905 {
906     USB->ENDPOINT[ep_num].RX_CSR |= (RxCSRL_REG_EPN_ENABLE_AUTOCLR_MASK |
907                                                RxCSRL_REG_EPN_RX_PKT_RDY_MASK);
908 }
909 
910 static __INLINE void
MSS_USB_CIF_rx_ep_clr_autoclr(mss_usb_ep_num_t ep_num)911 MSS_USB_CIF_rx_ep_clr_autoclr
912 (
913     mss_usb_ep_num_t ep_num
914 )
915 {
916     uint16_t reg_val = USB->ENDPOINT[ep_num].RX_CSR;
917 
918     reg_val &= ~RxCSRL_REG_EPN_ENABLE_AUTOCLR_MASK;
919     reg_val |= RxCSRL_REG_EPN_RX_PKT_RDY_MASK;
920     USB->ENDPOINT[ep_num].RX_CSR = reg_val;
921 }
922 
923 static __INLINE uint8_t
MSS_USB_CIF_rx_ep_is_autoclr(mss_usb_ep_num_t ep_num)924 MSS_USB_CIF_rx_ep_is_autoclr
925 (
926     mss_usb_ep_num_t ep_num
927 )
928 {
929     return (((USB->ENDPOINT[ep_num].RX_CSR & RxCSRL_REG_EPN_ENABLE_AUTOCLR_MASK) ?
930                                   MSS_USB_BOOLEAN_TRUE : MSS_USB_BOOLEAN_FALSE));
931 }
932 
933 static __INLINE void
MSS_USB_CIF_rx_ep_clr_csrreg(mss_usb_ep_num_t ep_num)934 MSS_USB_CIF_rx_ep_clr_csrreg
935 (
936     mss_usb_ep_num_t ep_num
937 )
938 {
939     USB->ENDPOINT[ep_num].RX_CSR = 0x0000U;
940 }
941 
942 /*-------------------------------------------------------------------------*//**
943   RXCOUNT register related APIs
944  */
945 static __INLINE uint16_t
MSS_USB_CIF_rx_ep_read_count(mss_usb_ep_num_t ep_num)946 MSS_USB_CIF_rx_ep_read_count
947 (
948     mss_usb_ep_num_t ep_num
949 )
950 {
951     /* only valid when rxpktrdy is set */
952     return (USB->ENDPOINT[ep_num].RX_COUNT);
953 }
954 
955 /*-------------------------------------------------------------------------*//**
956   FIFOx register related APIs
957  */
958 static __INLINE void
MSS_USB_CIF_load_tx_fifo(mss_usb_ep_num_t ep_num,void * in_data,uint32_t length)959 MSS_USB_CIF_load_tx_fifo
960 (
961     mss_usb_ep_num_t ep_num,
962     void * in_data,
963     uint32_t length
964 )
965 {
966     uint32_t idx;
967     uint32_t* temp;
968     uint8_t* temp_8bit;
969 
970     uint16_t words = length / 4;
971     temp = in_data;
972     temp_8bit = in_data;
973 
974     for(idx = 0u; idx < words; ++idx)
975     {
976         USB->FIFO[ep_num].WORD.VALUE = (uint32_t)temp[idx];
977     }
978 
979     for(idx = (length - (length % 4)); idx < length; ++idx)
980     {
981         USB->FIFO[ep_num].BYTE.VALUE = (uint8_t)temp_8bit[idx];
982     }
983 }
984 
985 static __INLINE void
MSS_USB_CIF_read_rx_fifo(mss_usb_ep_num_t ep_num,void * out_data,uint32_t length)986 MSS_USB_CIF_read_rx_fifo
987 (
988     mss_usb_ep_num_t ep_num,
989     void * out_data,
990     uint32_t length
991 )
992 {
993     uint32_t idx;
994     volatile uint32_t* temp;
995     uint8_t* temp_8bit;
996 
997     uint16_t words = length / 4;
998     temp = out_data;
999     temp_8bit = out_data;
1000 
1001     for(idx = 0u; idx < words; ++idx)
1002     {
1003         temp[idx] = USB->FIFO[ep_num].WORD.VALUE;
1004     }
1005 
1006     for(idx = (length - (length % 4u)); idx < length; ++idx)
1007     {
1008         temp_8bit[idx] = USB->FIFO[ep_num].BYTE.VALUE;
1009     }
1010 }
1011 
1012 static __INLINE uint8_t
MSS_USB_CIF_read_rx_fifo_byte(mss_usb_ep_num_t ep_num)1013 MSS_USB_CIF_read_rx_fifo_byte
1014 (
1015     mss_usb_ep_num_t ep_num
1016 )
1017 {
1018     return (uint8_t)(USB->FIFO[ep_num].BYTE.VALUE);
1019 }
1020 
1021 static __INLINE uint16_t
MSS_USB_CIF_read_rx_fifo_halfword(mss_usb_ep_num_t ep_num)1022 MSS_USB_CIF_read_rx_fifo_halfword
1023 (
1024     mss_usb_ep_num_t ep_num
1025 )
1026 {
1027     return (uint16_t)(USB->FIFO[ep_num].HALFWORD.VALUE);
1028 }
1029 
1030 static __INLINE uint32_t
MSS_USB_CIF_read_rx_fifo_word(mss_usb_ep_num_t ep_num)1031 MSS_USB_CIF_read_rx_fifo_word
1032 (
1033     mss_usb_ep_num_t ep_num
1034 )
1035 {
1036     return (uint32_t)(USB->FIFO[ep_num].WORD.VALUE);
1037 }
1038 
1039 /*-------------------------------------------------------------------------*//**
1040   DynFIFOSIZE register related APIs
1041  */
1042 static __INLINE void
MSS_USB_CIF_tx_ep_set_fifo_size(mss_usb_ep_num_t ep_num,uint16_t fifo_size,uint8_t dpb)1043 MSS_USB_CIF_tx_ep_set_fifo_size
1044 (
1045     mss_usb_ep_num_t ep_num,
1046     uint16_t fifo_size,
1047     uint8_t dpb
1048 )
1049 {
1050     uint16_t temp;
1051     uint8_t i = 0;
1052 
1053     /* Valid FIFO sizes are 8,16,32,64,128,512,1024,2048,4096 */
1054     if ((ep_num > MSS_USB_CEP) && (fifo_size >= MIN_EP_FIFO_SZ))
1055     {
1056         USB->INDEX = ep_num;
1057         temp = (fifo_size / MIN_EP_FIFO_SZ);
1058         while (!(temp & MSS_USB_WORD_BIT_0_MASK))
1059         {
1060             temp >>= 1u;
1061             i++;
1062         }
1063         USB->TX_FIFO_SIZE = ((dpb << TXFIFOSZ_REG_DPB_SHIFT) | i);
1064     }
1065 }
1066 
1067 static __INLINE void
MSS_USB_CIF_rx_ep_set_fifo_size(mss_usb_ep_num_t ep_num,uint16_t fifo_size,uint8_t dpb)1068 MSS_USB_CIF_rx_ep_set_fifo_size
1069 (
1070     mss_usb_ep_num_t ep_num,
1071     uint16_t fifo_size,
1072     uint8_t dpb
1073 )
1074 {
1075     /* fifo_size is the size in terms of number of bytes.*/
1076     uint16_t temp;
1077     uint8_t i = 0u;
1078 
1079     /* Valid FIFO sizes are 8,16,32,64,128,512,1024,2048,4096 */
1080     if ((ep_num > MSS_USB_CEP) && (fifo_size >= MIN_EP_FIFO_SZ))
1081     {
1082         USB->INDEX = ep_num;
1083         temp= (fifo_size / MIN_EP_FIFO_SZ);
1084         while (!(temp & MSS_USB_WORD_BIT_0_MASK))
1085         {
1086             temp >>= 1u;
1087             i++;
1088         }
1089         USB->RX_FIFO_SIZE = ((dpb << RXFIFOSZ_REG_DPB_SHIFT) | i);
1090     }
1091 }
1092 
1093 /*-------------------------------------------------------------------------*//**
1094   DynFIFOAD register related APIs
1095  */
1096 static __INLINE void
MSS_USB_CIF_tx_ep_set_fifo_addr(mss_usb_ep_num_t ep_num,uint16_t addr)1097 MSS_USB_CIF_tx_ep_set_fifo_addr
1098 (
1099     mss_usb_ep_num_t ep_num,
1100     uint16_t addr
1101 )
1102 {
1103     /* Valid address values are from 0 to FFF8 in steps of 8 */
1104     if (ep_num > MSS_USB_CEP)
1105     {
1106         USB->INDEX = ep_num;
1107         USB->TX_FIFO_ADDR = (addr / EP_FIFO_ADDR_STEP);
1108     }
1109 }
1110 
1111 static __INLINE void
MSS_USB_CIF_rx_ep_set_fifo_addr(mss_usb_ep_num_t ep_num,uint16_t addr)1112 MSS_USB_CIF_rx_ep_set_fifo_addr
1113 (
1114     mss_usb_ep_num_t ep_num,
1115     uint16_t addr
1116 )
1117 {
1118     /* Valid address values are from 0 to FFF8 in steps of 8 */
1119     if (ep_num > MSS_USB_CEP)
1120     {
1121         USB->INDEX = ep_num;
1122         USB->RX_FIFO_ADDR = (addr / EP_FIFO_ADDR_STEP);
1123     }
1124 }
1125 
1126 /*-------------------------------------------------------------------------*//**
1127   RX_DPKTBUFDIS register related APIs
1128  */
1129 static __INLINE void
MSS_USB_CIF_disable_rx_ep_dpb(mss_usb_ep_num_t ep_num)1130 MSS_USB_CIF_disable_rx_ep_dpb
1131 (
1132     mss_usb_ep_num_t ep_num
1133 )
1134 {
1135     USB->RX_DPBUF_DIS |= (uint16_t)(MSS_USB_WORD_BIT_0_MASK << ep_num);
1136 }
1137 
1138 static __INLINE void
MSS_USB_CIF_enable_rx_ep_dpb(mss_usb_ep_num_t ep_num)1139 MSS_USB_CIF_enable_rx_ep_dpb
1140 (
1141     mss_usb_ep_num_t ep_num
1142 )
1143 {
1144     USB->RX_DPBUF_DIS &= (uint16_t)(~(MSS_USB_WORD_BIT_0_MASK << ep_num));
1145 }
1146 
1147 /*-------------------------------------------------------------------------*//**
1148   TX_DPKTBUFDIS register related APIs
1149  */
1150 static __INLINE void
MSS_USB_disable_tx_ep_dpb(mss_usb_ep_num_t ep_num)1151 MSS_USB_disable_tx_ep_dpb
1152 (
1153     mss_usb_ep_num_t ep_num
1154 )
1155 {
1156     USB->TX_DPBUF_DIS |= (uint16_t)(MSS_USB_WORD_BIT_0_MASK << ep_num);
1157 }
1158 
1159 static __INLINE void
MSS_USB_enable_tx_ep_dpb(mss_usb_ep_num_t ep_num)1160 MSS_USB_enable_tx_ep_dpb
1161 (
1162     mss_usb_ep_num_t ep_num
1163 )
1164 {
1165     USB->TX_DPBUF_DIS &= (uint16_t)(~(MSS_USB_WORD_BIT_0_MASK << ep_num));
1166 }
1167 
1168 /*-------------------------------------------------------------------------*//**
1169   DMA_INTR register related APIs
1170  */
1171 static __INLINE uint32_t
MSS_USB_CIF_dma_read_irq(void)1172 MSS_USB_CIF_dma_read_irq
1173 (
1174     void
1175 )
1176 {
1177     return (USB->DMA_CHANNEL[0].IRQ);
1178 }
1179 
1180 /*-------------------------------------------------------------------------*//**
1181  * DMA_CNTL register related APIs
1182  */
1183 static __INLINE void
MSS_USB_CIF_dma_start_xfr(mss_usb_dma_channel_t dma_channel)1184 MSS_USB_CIF_dma_start_xfr
1185 (
1186     mss_usb_dma_channel_t dma_channel
1187 )
1188 {
1189     USB->DMA_CHANNEL[dma_channel].CNTL |= DMA_CNTL_REG_START_XFR_MASK;
1190 }
1191 
1192 static __INLINE void
MSS_USB_CIF_dma_stop_xfr(mss_usb_dma_channel_t dma_channel)1193 MSS_USB_CIF_dma_stop_xfr
1194 (
1195     mss_usb_dma_channel_t dma_channel
1196 )
1197 {
1198     USB->DMA_CHANNEL[dma_channel].CNTL &= ~DMA_CNTL_REG_START_XFR_MASK;
1199 }
1200 
1201 static __INLINE void
MSS_USB_CIF_dma_set_dir(mss_usb_dma_channel_t dma_channel,mss_usb_dma_dir_t dir)1202 MSS_USB_CIF_dma_set_dir
1203 (
1204     mss_usb_dma_channel_t dma_channel,
1205     mss_usb_dma_dir_t dir
1206 )
1207 {
1208     /*
1209       dir = 1 => DMA read (TX EP)
1210       dir = 0 => DMA write (RX EP)
1211      */
1212     USB->DMA_CHANNEL[dma_channel].CNTL |= (dir << DMA_CNTL_REG_DMA_DIR_SHIFT);
1213 }
1214 
1215 static __INLINE mss_usb_dma_dir_t
MSS_USB_CIF_dma_get_dir(mss_usb_dma_channel_t dma_channel)1216 MSS_USB_CIF_dma_get_dir
1217 (
1218     mss_usb_dma_channel_t dma_channel
1219 )
1220 {
1221     return(((USB->DMA_CHANNEL[dma_channel].CNTL & DMA_CNTL_REG_DMA_DIR_MASK) ?
1222                                         MSS_USB_DMA_READ : MSS_USB_DMA_WRITE));
1223 }
1224 
1225 static __INLINE void
MSS_USB_CIF_dma_set_mode(mss_usb_dma_channel_t dma_channel,mss_usb_dma_mode_t dma_mode)1226 MSS_USB_CIF_dma_set_mode
1227 (
1228     mss_usb_dma_channel_t dma_channel,
1229     mss_usb_dma_mode_t dma_mode
1230 )
1231 {
1232     USB->DMA_CHANNEL[dma_channel].CNTL |= (dma_mode << DMA_CNTL_REG_DMA_MODE_SHIFT);
1233 }
1234 
1235 static __INLINE mss_usb_dma_mode_t
MSS_USB_CIF_dma_get_mode(mss_usb_dma_channel_t dma_channel)1236 MSS_USB_CIF_dma_get_mode
1237 (
1238     mss_usb_dma_channel_t dma_channel
1239 )
1240 {
1241     return (((USB->DMA_CHANNEL[dma_channel].CNTL & DMA_CNTL_REG_DMA_MODE_MASK) ?
1242                                          MSS_USB_DMA_MODE1: MSS_USB_DMA_MODE0));
1243 }
1244 
1245 static __INLINE void
MSS_USB_CIF_dma_enable_irq(mss_usb_dma_channel_t dma_channel)1246 MSS_USB_CIF_dma_enable_irq
1247 (
1248     mss_usb_dma_channel_t dma_channel
1249 )
1250 {
1251     USB->DMA_CHANNEL[dma_channel].CNTL |= DMA_CNTL_REG_ENABLE_DMA_IRQ_MASK;
1252 }
1253 
1254 static __INLINE void
MSS_USB_CIF_dma_disable_irq(mss_usb_dma_channel_t dma_channel)1255 MSS_USB_CIF_dma_disable_irq
1256 (
1257     mss_usb_dma_channel_t dma_channel
1258 )
1259 {
1260     USB->DMA_CHANNEL[dma_channel].CNTL &= ~DMA_CNTL_REG_ENABLE_DMA_IRQ_MASK;
1261 }
1262 
1263 static __INLINE void
MSS_USB_CIF_dma_assign_to_epnum(mss_usb_dma_channel_t dma_channel,mss_usb_ep_num_t ep_num)1264 MSS_USB_CIF_dma_assign_to_epnum
1265 (
1266     mss_usb_dma_channel_t dma_channel,
1267     mss_usb_ep_num_t ep_num
1268 )
1269 {
1270     USB->DMA_CHANNEL[dma_channel].CNTL |=
1271                                   ((ep_num << DMA_CNTL_REG_DMA_EP_NUM_SHIFT) &
1272                                     DMA_CNTL_REG_DMA_EP_NUM_MASK);
1273 }
1274 
1275 static __INLINE mss_usb_ep_num_t
MSS_USB_CIF_dma_get_epnum(mss_usb_dma_channel_t dma_channel)1276 MSS_USB_CIF_dma_get_epnum
1277 (
1278     mss_usb_dma_channel_t dma_channel
1279 )
1280 {
1281     /*
1282       This API will return numbers from 0 to 15, mss_usb_ep_num_t maps it to TX
1283       EP numbers. Using DMA DIR, CIF driver should correctly map it as TX EP or
1284       RX EP.
1285      */
1286     volatile uint8_t ep_num;
1287 
1288     ep_num = (USB->DMA_CHANNEL[dma_channel].CNTL  & DMA_CNTL_REG_DMA_EP_NUM_MASK);
1289 
1290     return (mss_usb_ep_num_t)(ep_num >> DMA_CNTL_REG_DMA_EP_NUM_SHIFT);
1291 }
1292 
1293 static __INLINE uint8_t
MSS_USB_CIF_dma_is_bus_err(mss_usb_dma_channel_t dma_channel)1294 MSS_USB_CIF_dma_is_bus_err
1295 (
1296     mss_usb_dma_channel_t dma_channel
1297 )
1298 {
1299     return (((USB->DMA_CHANNEL[dma_channel].CNTL  & DMA_CNTL_REG_DMA_BUS_ERR_MASK) ?
1300                                     MSS_USB_BOOLEAN_TRUE : MSS_USB_BOOLEAN_FALSE));
1301 }
1302 
1303 static __INLINE void
MSS_USB_CIF_dma_clr_bus_err(mss_usb_dma_channel_t dma_channel)1304 MSS_USB_CIF_dma_clr_bus_err
1305 (
1306     mss_usb_dma_channel_t dma_channel
1307 )
1308 {
1309     USB->DMA_CHANNEL[dma_channel].CNTL  &= ~DMA_CNTL_REG_DMA_BUS_ERR_MASK;
1310 }
1311 
1312 static __INLINE void
MSS_USB_CIF_dma_set_burst_mode(mss_usb_dma_channel_t dma_channel,mss_usb_dma_burst_mode_t burst_mode)1313 MSS_USB_CIF_dma_set_burst_mode
1314 (
1315     mss_usb_dma_channel_t dma_channel,
1316     mss_usb_dma_burst_mode_t
1317     burst_mode
1318 )
1319 {
1320     USB->DMA_CHANNEL[dma_channel].CNTL |=
1321                        ((burst_mode << DMA_CNTL_REG_DMA_BURST_MODE_SHIFT) &
1322                        DMA_CNTL_REG_DMA_BURST_MODE_MASK);
1323 }
1324 
1325 static __INLINE mss_usb_dma_burst_mode_t
MSS_USB_CIF_dma_get_burst_mode(mss_usb_dma_channel_t dma_channel,mss_usb_dma_burst_mode_t burst_mode)1326 MSS_USB_CIF_dma_get_burst_mode
1327 (
1328     mss_usb_dma_channel_t dma_channel,
1329     mss_usb_dma_burst_mode_t burst_mode
1330 )
1331 {
1332     uint8_t mode;
1333     mode = (USB->DMA_CHANNEL[dma_channel].CNTL  &
1334                                              DMA_CNTL_REG_DMA_BURST_MODE_MASK);
1335 
1336     return (mss_usb_dma_burst_mode_t)(mode >> DMA_CNTL_REG_DMA_BURST_MODE_SHIFT);
1337 }
1338 
1339 static __INLINE void
MSS_USB_CIF_dma_clr_ctrlreg(mss_usb_dma_channel_t dma_channel)1340 MSS_USB_CIF_dma_clr_ctrlreg
1341 (
1342     mss_usb_dma_channel_t dma_channel
1343 )
1344 {
1345     USB->DMA_CHANNEL[dma_channel].CNTL = 0x0000U;
1346 }
1347 
1348 /*-------------------------------------------------------------------------*//**
1349   DMA_ADDR register related APIs
1350  */
1351 static __INLINE uint32_t
MSS_USB_CIF_dma_read_addr(mss_usb_dma_channel_t dma_channel)1352 MSS_USB_CIF_dma_read_addr
1353 (
1354     mss_usb_dma_channel_t dma_channel
1355 )
1356 {
1357     return (USB->DMA_CHANNEL[dma_channel].ADDR);
1358 }
1359 
1360 static __INLINE void
MSS_USB_CIF_dma_write_addr(mss_usb_dma_channel_t dma_channel,uint32_t addr)1361 MSS_USB_CIF_dma_write_addr
1362 (
1363     mss_usb_dma_channel_t dma_channel,
1364     uint32_t addr
1365 )
1366 {
1367     USB->DMA_CHANNEL[dma_channel].ADDR = addr;
1368 }
1369 
1370 /*-------------------------------------------------------------------------*//**
1371   DMA_COUNT register related APIs
1372  */
1373 static __INLINE uint32_t
MSS_USB_CIF_dma_read_count(mss_usb_dma_channel_t dma_channel)1374 MSS_USB_CIF_dma_read_count
1375 (
1376     mss_usb_dma_channel_t dma_channel
1377 )
1378 {
1379     return (USB->DMA_CHANNEL[dma_channel].COUNT);
1380 }
1381 
1382 static __INLINE void
MSS_USB_CIF_dma_write_count(mss_usb_dma_channel_t dma_channel,uint32_t count)1383 MSS_USB_CIF_dma_write_count
1384 (
1385     mss_usb_dma_channel_t dma_channel,
1386     uint32_t count
1387 )
1388 {
1389     USB->DMA_CHANNEL[dma_channel].COUNT = count;
1390 }
1391 
1392 #ifdef __cplusplus
1393 }
1394 #endif
1395 
1396 #endif  /* __MSS_USB_COMMON_REG_IO_H_ */
1397