1 /*
2  * Copyright 2021 MindMotion Microelectronics Co., Ltd.
3  * All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 
8 #include "hal_uart.h"
9 
UART_Init(UART_Type * UARTx,UART_Init_Type * init)10 void UART_Init(UART_Type * UARTx, UART_Init_Type * init)
11 {
12     uint32_t ccr = UARTx->CCR & ~(    UART_CCR_PEN_MASK
13                                     | UART_CCR_PSEL_MASK
14                                     | UART_CCR_SPB0_MASK
15                                     | UART_CCR_CHAR_MASK
16                                     | UART_CCR_SPB1_MASK
17                                  );
18     /* WordLength. */
19     ccr |= UART_CCR_CHAR(init->WordLength);
20 
21     /* StopBits. */
22     if ( (init->StopBits == UART_StopBits_2) || (init->StopBits == UART_StopBits_1_5) )
23     {
24         ccr |= UART_CCR_SPB0_MASK;
25     }
26     if ( (init->StopBits == UART_StopBits_0_5) || (init->StopBits == UART_StopBits_1_5) )
27     {
28         ccr |= UART_CCR_SPB1_MASK;
29     }
30 
31     /* Parity. */
32     if (init->Parity == UART_Parity_Even)
33     {
34         ccr |= UART_CCR_PEN_MASK;
35     }
36     if (init->Parity == UART_Parity_Odd)
37     {
38         ccr |= UART_CCR_PEN_MASK | UART_CCR_PSEL_MASK;
39     }
40     UARTx->CCR = ccr;
41 
42     /* XferMode. */
43     uint32_t gcr = UARTx->GCR & ~(   UART_GCR_RXEN_MASK
44                                    | UART_GCR_TXEN_MASK
45                                    | UART_GCR_AUTOFLOWEN_MASK
46                                  );
47     gcr |= ((uint32_t)(init->XferMode) << UART_GCR_RXEN_SHIFT);
48     if (init->HwFlowControl == UART_HwFlowControl_RTS_CTS)
49     {
50         gcr |= UART_GCR_AUTOFLOWEN_MASK;
51     }
52     UARTx->GCR = gcr;
53 
54     /* Setup the baudrate. */
55     UARTx->BRR = (init->ClockFreqHz / init->BaudRate) / 16u;
56     UARTx->FRA = (init->ClockFreqHz / init->BaudRate) % 16u;
57 }
58 
UART_Enable(UART_Type * UARTx,bool enable)59 void UART_Enable(UART_Type * UARTx, bool enable)
60 {
61     if (enable)
62     {
63         UARTx->GCR |= UART_GCR_UARTEN_MASK;
64     }
65     else
66     {
67         UARTx->GCR &= ~UART_GCR_UARTEN_MASK;
68     }
69 }
70 
UART_EnableInterrupts(UART_Type * UARTx,uint32_t interrupts,bool enable)71 void UART_EnableInterrupts(UART_Type * UARTx, uint32_t interrupts, bool enable)
72 {
73     (enable) ? (UARTx->IER |= interrupts) : (UARTx->IER &= ~interrupts);
74 }
75 
UART_GetEnabledInterrupts(UART_Type * UARTx)76 uint32_t UART_GetEnabledInterrupts(UART_Type * UARTx)
77 {
78     return UARTx->IER;
79 }
80 
UART_EnableDMA(UART_Type * UARTx,bool enable)81 void UART_EnableDMA(UART_Type * UARTx, bool enable)
82 {
83     if (enable)
84     {
85         UARTx->GCR |= UART_GCR_DMAMODE_MASK;
86     }
87     else
88     {
89         UARTx->GCR &= ~UART_GCR_DMAMODE_MASK;
90     }
91 }
92 
UART_PutData(UART_Type * UARTx,uint8_t value)93 void UART_PutData(UART_Type * UARTx, uint8_t value)
94 {
95     UARTx->TDR = value;
96 }
97 
UART_GetData(UART_Type * UARTx)98 uint8_t UART_GetData(UART_Type * UARTx)
99 {
100     return (uint8_t)(UARTx->RDR & 0xFFU);
101 }
102 
103 /* return flags */
UART_GetStatus(UART_Type * UARTx)104 uint32_t UART_GetStatus(UART_Type * UARTx)
105 {
106     return UARTx->CSR;
107 }
108 
109 /* return flags. */
UART_GetInterruptStatus(UART_Type * UARTx)110 uint32_t UART_GetInterruptStatus(UART_Type * UARTx)
111 {
112     return UARTx->ISR;
113 }
114 
UART_ClearInterruptStatus(UART_Type * UARTx,uint32_t interrupts)115 void UART_ClearInterruptStatus(UART_Type * UARTx, uint32_t interrupts)
116 {
117     UARTx->ICR = interrupts;
118 }
119 
UART_GetRxDataRegAddr(UART_Type * UARTx)120 uint32_t   UART_GetRxDataRegAddr(UART_Type * UARTx)
121 {
122     return (uint32_t)(&(UARTx->RDR));
123 }
124 
UART_GetTxDataRegAddr(UART_Type * UARTx)125 uint32_t   UART_GetTxDataRegAddr(UART_Type * UARTx)
126 {
127     return (uint32_t)(&(UARTx->TDR));
128 }
129 
130 /* EOF. */
131