1 /*
2 * @ : Copyright (c) 2021 Phytium Information Technology, Inc.
3 *
4 * SPDX-License-Identifier: Apache-2.0.
5 *
6 * @Date: 2021-04-07 09:53:07
7 * @LastEditTime: 2021-05-24 10:47:33
8 * @Description: This files is for uart option setting
9 *
10 * @Modify History:
11 * Ver Who Date Changes
12 * ----- ------ -------- --------------------------------------
13 */
14
15 #include "ft_uart.h"
16 #include "ft_uart_hw.h"
17 #include "ft_types.h"
18 /************************** Variable Definitions ****************************/
19 /*
20 * The following data type is a map from an option to the offset in the
21 * register to which it belongs as well as its bit mask in that register.
22 */
23 typedef struct
24 {
25 u32 Option;
26 u32 RegisterOffset;
27 u32 Mask;
28 } Mapping;
29
30 static Mapping OptionTable[] = {
31 {FUART_OPTION_UARTEN, UARTCR_OFFSET, UARTCR_UARTEN},
32 {FUART_OPTION_RXEN, UARTCR_OFFSET, UARTCR_RXE},
33 {FUART_OPTION_TXEN, UARTCR_OFFSET, UARTCR_TXE},
34 {FUART_OPTION_FIFOEN, UARTLCR_H_OFFSET, UARTLCR_H_FEN}};
35
36 #define FT_UART_NUM_OPITIONS (sizeof(OptionTable) / sizeof(Mapping))
37
FUart_SetOptions(Ft_Uart * UartPtr,u32 Options)38 void FUart_SetOptions(Ft_Uart *UartPtr, u32 Options)
39 {
40 u32 Index;
41 u32 RegValue;
42 Ft_assertVoid(UartPtr != NULL);
43 Ft_assertVoid(UartPtr->IsReady == FT_COMPONENT_IS_READLY);
44
45 for (Index = 0; Index < FT_UART_NUM_OPITIONS; Index++)
46 {
47 RegValue = FT_UART_ReadReg(UartPtr->Config.BaseAddress, OptionTable[Index].RegisterOffset);
48
49 if ((Options & OptionTable[Index].Option) != (u32)(0))
50 {
51 RegValue |= OptionTable[Index].Mask;
52 }
53 else
54 {
55 RegValue &= ~OptionTable[Index].Mask;
56 }
57
58 FT_UART_WriteReg(UartPtr->Config.BaseAddress, OptionTable[Index].RegisterOffset, RegValue);
59 }
60 }
61
FUart_SetSpecificOptions(Ft_Uart * UartPtr,u32 Options)62 void FUart_SetSpecificOptions(Ft_Uart *UartPtr, u32 Options)
63 {
64 u32 Index;
65 u32 RegValue;
66 Ft_assertVoid(UartPtr != NULL);
67
68 for (Index = 0; Index < FT_UART_NUM_OPITIONS; Index++)
69 {
70 if ((Options & OptionTable[Index].Option) == (u32)(0))
71 {
72 continue;
73 }
74
75 RegValue = FT_UART_ReadReg(UartPtr->Config.BaseAddress, OptionTable[Index].RegisterOffset);
76
77 /* set specific options */
78 RegValue |= OptionTable[Index].Mask;
79 FT_UART_WriteReg(UartPtr->Config.BaseAddress, OptionTable[Index].RegisterOffset, RegValue);
80 }
81 }
82
FUart_ClearSpecificOptions(FT_IN Ft_Uart * UartPtr,FT_IN u32 Options)83 void FUart_ClearSpecificOptions(FT_IN Ft_Uart *UartPtr, FT_IN u32 Options)
84 {
85 u32 Index;
86 u32 RegValue;
87 Ft_assertVoid(UartPtr != NULL);
88
89 for (Index = 0; Index < FT_UART_NUM_OPITIONS; Index++)
90 {
91 if ((Options & OptionTable[Index].Option) == (u32)(0))
92 {
93 continue;
94 }
95
96 RegValue = FT_UART_ReadReg(UartPtr->Config.BaseAddress, OptionTable[Index].RegisterOffset);
97
98 /* remove specific options */
99 RegValue &= ~OptionTable[Index].Mask;
100 FT_UART_WriteReg(UartPtr->Config.BaseAddress, OptionTable[Index].RegisterOffset, RegValue);
101 }
102 }
103