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