summaryrefslogtreecommitdiff
path: root/bsp/rockchip/common/rk_hal/lib/hal/inc/hal_gpio.h
blob: 93a51d3527370fa826e18ea995433dce74bc88ab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
/* SPDX-License-Identifier: BSD-3-Clause */
/*
 * Copyright (c) 2020-2021 Rockchip Electronics Co., Ltd.
 */

#include "hal_conf.h"

/** @addtogroup RK_HAL_Driver
  * @{
  */

/** @addtogroup GPIO
  * @{
  */

#ifndef __HAL_GPIO_H
#define __HAL_GPIO_H

#include "hal_def.h"
#include "hal_pinctrl.h"

/***************************** MACRO Definition ******************************/
/** @defgroup GPIO_Exported_Definition_Group1 Basic Definition
 *  @{
 */

#ifndef GPIO_VER_ID
#define GPIO_VER_ID (0U)
#endif

#define PIN_NUMBER_PER_BANK (32)

#define GPIO_PIN_SHIFT  (0) /**< Bits 0-4: GPIO Pin number: 0 - 31 */
#define GPIO_PIN_MASK   (0x1f << GPIO_PIN_SHIFT)
#define GPIO_BANK_SHIFT (5) /**< Bits 5-7: GPIO Port number: 0 - 7 */
#define GPIO_BANK_MASK  (0x7 << GPIO_BANK_SHIFT)

#define BANK_PIN(BANK, PIN) ((((BANK) << GPIO_BANK_SHIFT) & GPIO_BANK_MASK) + (((PIN) << GPIO_PIN_SHIFT) & GPIO_PIN_MASK))

/***************************** Structure Definition **************************/
/** GPIO pin level definition */
typedef enum {
    GPIO_LOW,
    GPIO_HIGH
} eGPIO_pinLevel;

/** GPIO pin direction definition */
typedef enum {
    GPIO_IN,
    GPIO_OUT
} eGPIO_pinDirection;

/** GPIO pin debounce definition */
typedef enum {
    GPIO_DEBOUNCE_DIS,
    GPIO_DEBOUNCE_EN
} eGPIO_pinDebounce;

/** GPIO pin interrupt enable definition */
typedef enum {
    GPIO_INT_ENABLE,
    GPIO_INT_DISABLE
} eGPIO_intEnable;

/** GPIO pin interrupt type definition */
typedef enum {
    GPIO_INT_TYPE_NONE         = 0x00000000,
    GPIO_INT_TYPE_EDGE_RISING  = 0x00000001,
    GPIO_INT_TYPE_EDGE_FALLING = 0x00000002,
    GPIO_INT_TYPE_EDGE_BOTH    = (GPIO_INT_TYPE_EDGE_FALLING | GPIO_INT_TYPE_EDGE_RISING),
    GPIO_INT_TYPE_LEVEL_HIGH   = 0x00000004,
    GPIO_INT_TYPE_LEVEL_LOW    = 0x00000008,
    GPIO_INT_TYPE_LEVEL_MASK   = (GPIO_INT_TYPE_LEVEL_LOW | GPIO_INT_TYPE_LEVEL_HIGH),
    GPIO_INT_TYPE_SENSE_MASK   = 0x0000000f,
    GPIO_INT_TYPE_DEFAULT      = GPIO_INT_TYPE_SENSE_MASK,
} eGPIO_intType;

/** GPIO pin interrupt mode definition */
typedef enum {
    GPIO_INT_MODE_EDGE_RISING,
    GPIO_INT_MODE_EDGE_FALLING,
    GPIO_INT_MODE_EDGE_RISING_FALLING,
    GPIO_INT_MODE_LEVEL_HIGH,
    GPIO_INT_MODE_LEVEL_LOW,
    GPIO_INT_MODE_INVALID
} eGPIO_intMode;

#define IS_GPIO_PIN_DIR(ACTION)   (((ACTION) == GPIO_IN) || ((ACTION) == GPIO_OUT))
#define IS_GPIO_PIN_LEVEL(ACTION) (((ACTION) == GPIO_LOW) || ((ACTION) == GPIO_HIGH))

#define IS_GPIO_PIN(PIN)      ((PIN) != 0x00000000U)
#define IS_GPIO_HIGH_PIN(PIN) IS_GPIO_PIN(((PIN) & 0xFFFF0000U))

#define IS_GET_GPIO_PIN(PIN) (((PIN) == GPIO_PIN_A0) || \
                              ((PIN) == GPIO_PIN_A1) || \
                              ((PIN) == GPIO_PIN_A2) || \
                              ((PIN) == GPIO_PIN_A3) || \
                              ((PIN) == GPIO_PIN_A4) || \
                              ((PIN) == GPIO_PIN_A5) || \
                              ((PIN) == GPIO_PIN_A6) || \
                              ((PIN) == GPIO_PIN_A7) || \
                              ((PIN) == GPIO_PIN_B0) || \
                              ((PIN) == GPIO_PIN_B1) || \
                              ((PIN) == GPIO_PIN_B2) || \
                              ((PIN) == GPIO_PIN_B3) || \
                              ((PIN) == GPIO_PIN_B4) || \
                              ((PIN) == GPIO_PIN_B5) || \
                              ((PIN) == GPIO_PIN_B6) || \
                              ((PIN) == GPIO_PIN_B7) || \
                              ((PIN) == GPIO_PIN_C0) || \
                              ((PIN) == GPIO_PIN_C1) || \
                              ((PIN) == GPIO_PIN_C2) || \
                              ((PIN) == GPIO_PIN_C3) || \
                              ((PIN) == GPIO_PIN_C4) || \
                              ((PIN) == GPIO_PIN_C5) || \
                              ((PIN) == GPIO_PIN_C6) || \
                              ((PIN) == GPIO_PIN_C7) || \
                              ((PIN) == GPIO_PIN_D0) || \
                              ((PIN) == GPIO_PIN_D1) || \
                              ((PIN) == GPIO_PIN_D2) || \
                              ((PIN) == GPIO_PIN_D3) || \
                              ((PIN) == GPIO_PIN_D4) || \
                              ((PIN) == GPIO_PIN_D5) || \
                              ((PIN) == GPIO_PIN_D6) || \
                              ((PIN) == GPIO_PIN_D7))

/** @} */
/***************************** Function Declare ******************************/
/** @defgroup GPIO_Exported_Definition_Group2 Public Functions Declare.
 *  @{
 */
eGPIO_pinDirection HAL_GPIO_GetPinDirection(struct GPIO_REG *pGPIO, ePINCTRL_GPIO_PINS pin);
eGPIO_pinLevel HAL_GPIO_GetPinLevel(struct GPIO_REG *pGPIO, ePINCTRL_GPIO_PINS pin);
eGPIO_pinLevel HAL_GPIO_GetPinData(struct GPIO_REG *pGPIO, ePINCTRL_GPIO_PINS pin);
uint32_t HAL_GPIO_GetBankLevel(struct GPIO_REG *pGPIO);

HAL_Status HAL_GPIO_SetPinLevel(struct GPIO_REG *pGPIO, ePINCTRL_GPIO_PINS pin, eGPIO_pinLevel level);
HAL_Status HAL_GPIO_SetPinDirection(struct GPIO_REG *pGPIO, ePINCTRL_GPIO_PINS pin, eGPIO_pinDirection direction);
HAL_Status HAL_GPIO_SetIntType(struct GPIO_REG *pGPIO, ePINCTRL_GPIO_PINS pin, eGPIO_intType mode);

HAL_Status HAL_GPIO_SetPinsLevel(struct GPIO_REG *pGPIO, uint32_t mPins, eGPIO_pinLevel level);
HAL_Status HAL_GPIO_SetPinsDirection(struct GPIO_REG *pGPIO, uint32_t mPins, eGPIO_pinDirection direction);

void HAL_GPIO_EnableIRQ(struct GPIO_REG *pGPIO, ePINCTRL_GPIO_PINS pin);
void HAL_GPIO_DisableIRQ(struct GPIO_REG *pGPIO, ePINCTRL_GPIO_PINS pin);
void HAL_GPIO_IRQHandler(struct GPIO_REG *pGPIO, eGPIO_bankId bank);

/* The parameter pin for this function is special, it's 0~31. */
void HAL_GPIO_IRQDispatch(eGPIO_bankId bank, uint32_t pin);

/** @} */

#endif
/** @} */

/** @} */