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