1 /*
2  * @ : Copyright (c) 2021 Phytium Information Technology, Inc.
3  *
4  * SPDX-License-Identifier: Apache-2.0.
5  *
6  * @Date: 2021-04-27 17:55:31
7  * @LastEditTime: 2021-05-25 16:43:31
8  * @Description:  This files is for
9  *
10  * @Modify History:
11  *  Ver   Who        Date         Changes
12  * ----- ------     --------    --------------------------------------
13  */
14 
15 #include "ft_gpio.h"
16 #include "ft_gpio_hw.h"
17 #include "ft_assert.h"
18 #include "ft_debug.h"
19 
20 #define GPIO_MAX_PIN 7
21 #define GPIO_MAX_CTRL_ID 1
22 
FGpio_SetGroupModeA(FT_IN u32 ctrlId,FT_IN u8 pin,FT_IN u32 mode)23 void FGpio_SetGroupModeA(FT_IN u32 ctrlId, FT_IN u8 pin, FT_IN u32 mode)
24 {
25     u32 RegVal;
26     Ft_assertNoneReturn(ctrlId <= GPIO_MAX_CTRL_ID);
27     Ft_assertNoneReturn(pin <= GPIO_MAX_PIN);
28 
29     RegVal = FGpioA_ReadReg(ctrlId, GPIO_INTEN);
30     switch (mode)
31     {
32     case GPIO_MODE_GPIO:
33         RegVal &= ~(1 << pin);
34         break;
35     case GPIO_MODE_INT:
36         RegVal |= (1 << pin);
37         break;
38     default:
39         Ft_assertNoneReturn(0);
40         break;
41     }
42 
43     FGpioA_WriteReg(ctrlId, GPIO_INTEN, RegVal);
44     return;
45 }
46 
FGpio_SetPinInOutA(FT_IN u32 ctrlId,FT_IN u8 pin,FT_IN u8 inOut)47 static void FGpio_SetPinInOutA(FT_IN u32 ctrlId, FT_IN u8 pin, FT_IN u8 inOut)
48 {
49     u32 RegVal;
50     Ft_assertNoneReturn(ctrlId <= GPIO_MAX_CTRL_ID);
51     Ft_assertNoneReturn(pin <= GPIO_MAX_PIN);
52 
53     RegVal = FGpioA_ReadReg(ctrlId, GPIO_SWPORTA_DDR);
54     if (inOut != (RegVal & (0x1 << pin)))
55     {
56         if (GPIO_INPUT == inOut)
57         {
58             RegVal &= ~(0x1 << pin);
59         }
60         else if (GPIO_OUTPUT == inOut)
61         {
62             RegVal |= (0x1 << pin);
63         }
64         else
65         {
66             Ft_assertNoneReturn(0);
67         }
68 
69         FGpioA_WriteReg(ctrlId, GPIO_SWPORTA_DDR, RegVal);
70     }
71 
72     return;
73 }
74 
FGpio_ReadPinA(FT_IN u32 ctrlId,FT_IN u8 pin)75 u32 FGpio_ReadPinA(FT_IN u32 ctrlId, FT_IN u8 pin)
76 {
77     u32 RegVal;
78     u32 OnOff;
79     Ft_assertNoneReturn(ctrlId <= GPIO_MAX_CTRL_ID);
80     Ft_assertNoneReturn(pin <= GPIO_MAX_PIN);
81 
82     FGpio_SetPinInOutA(ctrlId, pin, GPIO_INPUT);
83     RegVal = FGpioA_ReadReg(ctrlId, GPIO_EXT_PORTA);
84     OnOff = (RegVal & (0x1 << pin)) ? GPIO_ON : GPIO_OFF;
85     return OnOff;
86 }
87 
FGpio_WritePinA(FT_IN u32 ctrlId,FT_IN u8 pin,FT_IN u8 onOff)88 void FGpio_WritePinA(FT_IN u32 ctrlId, FT_IN u8 pin, FT_IN u8 onOff)
89 {
90     u32 RegVal;
91     Ft_assertNoneReturn(ctrlId <= GPIO_MAX_CTRL_ID);
92     Ft_assertNoneReturn(pin <= GPIO_MAX_PIN);
93     Ft_assertNoneReturn((onOff == GPIO_OFF) || (onOff == GPIO_ON));
94 
95     FGpio_SetPinInOutA(ctrlId, pin, GPIO_OUTPUT);
96     RegVal = FGpioA_ReadReg(ctrlId, GPIO_SWPORTA_DR);
97     if (GPIO_OFF == onOff)
98     {
99         RegVal &= ~(1 << pin);
100     }
101     else
102     {
103         RegVal |= (1 << pin);
104     }
105     FGpioA_WriteReg(ctrlId, GPIO_SWPORTA_DR, RegVal);
106     return;
107 }
108