1 /* SPDX-License-Identifier: BSD-3-Clause */ 2 /* 3 * Copyright (c) 2020-2021 Rockchip Electronics Co., Ltd. 4 */ 5 6 #include "hal_conf.h" 7 8 /** @addtogroup RK_HAL_Driver 9 * @{ 10 */ 11 12 /** @addtogroup GPIO 13 * @{ 14 */ 15 16 #ifndef __HAL_GPIO_H 17 #define __HAL_GPIO_H 18 19 #include "hal_def.h" 20 #include "hal_pinctrl.h" 21 22 /***************************** MACRO Definition ******************************/ 23 /** @defgroup GPIO_Exported_Definition_Group1 Basic Definition 24 * @{ 25 */ 26 27 #ifndef GPIO_VER_ID 28 #define GPIO_VER_ID (0U) 29 #endif 30 31 #define PIN_NUMBER_PER_BANK (32) 32 33 #define GPIO_PIN_SHIFT (0) /**< Bits 0-4: GPIO Pin number: 0 - 31 */ 34 #define GPIO_PIN_MASK (0x1f << GPIO_PIN_SHIFT) 35 #define GPIO_BANK_SHIFT (5) /**< Bits 5-7: GPIO Port number: 0 - 7 */ 36 #define GPIO_BANK_MASK (0x7 << GPIO_BANK_SHIFT) 37 38 #define BANK_PIN(BANK, PIN) ((((BANK) << GPIO_BANK_SHIFT) & GPIO_BANK_MASK) + (((PIN) << GPIO_PIN_SHIFT) & GPIO_PIN_MASK)) 39 40 /***************************** Structure Definition **************************/ 41 /** GPIO pin level definition */ 42 typedef enum { 43 GPIO_LOW, 44 GPIO_HIGH 45 } eGPIO_pinLevel; 46 47 /** GPIO pin direction definition */ 48 typedef enum { 49 GPIO_IN, 50 GPIO_OUT 51 } eGPIO_pinDirection; 52 53 /** GPIO pin debounce definition */ 54 typedef enum { 55 GPIO_DEBOUNCE_DIS, 56 GPIO_DEBOUNCE_EN 57 } eGPIO_pinDebounce; 58 59 /** GPIO pin interrupt enable definition */ 60 typedef enum { 61 GPIO_INT_ENABLE, 62 GPIO_INT_DISABLE 63 } eGPIO_intEnable; 64 65 /** GPIO pin interrupt type definition */ 66 typedef enum { 67 GPIO_INT_TYPE_NONE = 0x00000000, 68 GPIO_INT_TYPE_EDGE_RISING = 0x00000001, 69 GPIO_INT_TYPE_EDGE_FALLING = 0x00000002, 70 GPIO_INT_TYPE_EDGE_BOTH = (GPIO_INT_TYPE_EDGE_FALLING | GPIO_INT_TYPE_EDGE_RISING), 71 GPIO_INT_TYPE_LEVEL_HIGH = 0x00000004, 72 GPIO_INT_TYPE_LEVEL_LOW = 0x00000008, 73 GPIO_INT_TYPE_LEVEL_MASK = (GPIO_INT_TYPE_LEVEL_LOW | GPIO_INT_TYPE_LEVEL_HIGH), 74 GPIO_INT_TYPE_SENSE_MASK = 0x0000000f, 75 GPIO_INT_TYPE_DEFAULT = GPIO_INT_TYPE_SENSE_MASK, 76 } eGPIO_intType; 77 78 /** GPIO pin interrupt mode definition */ 79 typedef enum { 80 GPIO_INT_MODE_EDGE_RISING, 81 GPIO_INT_MODE_EDGE_FALLING, 82 GPIO_INT_MODE_EDGE_RISING_FALLING, 83 GPIO_INT_MODE_LEVEL_HIGH, 84 GPIO_INT_MODE_LEVEL_LOW, 85 GPIO_INT_MODE_INVALID 86 } eGPIO_intMode; 87 88 #define IS_GPIO_PIN_DIR(ACTION) (((ACTION) == GPIO_IN) || ((ACTION) == GPIO_OUT)) 89 #define IS_GPIO_PIN_LEVEL(ACTION) (((ACTION) == GPIO_LOW) || ((ACTION) == GPIO_HIGH)) 90 91 #define IS_GPIO_PIN(PIN) ((PIN) != 0x00000000U) 92 #define IS_GPIO_HIGH_PIN(PIN) IS_GPIO_PIN(((PIN) & 0xFFFF0000U)) 93 94 #define IS_GET_GPIO_PIN(PIN) (((PIN) == GPIO_PIN_A0) || \ 95 ((PIN) == GPIO_PIN_A1) || \ 96 ((PIN) == GPIO_PIN_A2) || \ 97 ((PIN) == GPIO_PIN_A3) || \ 98 ((PIN) == GPIO_PIN_A4) || \ 99 ((PIN) == GPIO_PIN_A5) || \ 100 ((PIN) == GPIO_PIN_A6) || \ 101 ((PIN) == GPIO_PIN_A7) || \ 102 ((PIN) == GPIO_PIN_B0) || \ 103 ((PIN) == GPIO_PIN_B1) || \ 104 ((PIN) == GPIO_PIN_B2) || \ 105 ((PIN) == GPIO_PIN_B3) || \ 106 ((PIN) == GPIO_PIN_B4) || \ 107 ((PIN) == GPIO_PIN_B5) || \ 108 ((PIN) == GPIO_PIN_B6) || \ 109 ((PIN) == GPIO_PIN_B7) || \ 110 ((PIN) == GPIO_PIN_C0) || \ 111 ((PIN) == GPIO_PIN_C1) || \ 112 ((PIN) == GPIO_PIN_C2) || \ 113 ((PIN) == GPIO_PIN_C3) || \ 114 ((PIN) == GPIO_PIN_C4) || \ 115 ((PIN) == GPIO_PIN_C5) || \ 116 ((PIN) == GPIO_PIN_C6) || \ 117 ((PIN) == GPIO_PIN_C7) || \ 118 ((PIN) == GPIO_PIN_D0) || \ 119 ((PIN) == GPIO_PIN_D1) || \ 120 ((PIN) == GPIO_PIN_D2) || \ 121 ((PIN) == GPIO_PIN_D3) || \ 122 ((PIN) == GPIO_PIN_D4) || \ 123 ((PIN) == GPIO_PIN_D5) || \ 124 ((PIN) == GPIO_PIN_D6) || \ 125 ((PIN) == GPIO_PIN_D7)) 126 127 /** @} */ 128 /***************************** Function Declare ******************************/ 129 /** @defgroup GPIO_Exported_Definition_Group2 Public Functions Declare. 130 * @{ 131 */ 132 eGPIO_pinDirection HAL_GPIO_GetPinDirection(struct GPIO_REG *pGPIO, ePINCTRL_GPIO_PINS pin); 133 eGPIO_pinLevel HAL_GPIO_GetPinLevel(struct GPIO_REG *pGPIO, ePINCTRL_GPIO_PINS pin); 134 eGPIO_pinLevel HAL_GPIO_GetPinData(struct GPIO_REG *pGPIO, ePINCTRL_GPIO_PINS pin); 135 uint32_t HAL_GPIO_GetBankLevel(struct GPIO_REG *pGPIO); 136 137 HAL_Status HAL_GPIO_SetPinLevel(struct GPIO_REG *pGPIO, ePINCTRL_GPIO_PINS pin, eGPIO_pinLevel level); 138 HAL_Status HAL_GPIO_SetPinDirection(struct GPIO_REG *pGPIO, ePINCTRL_GPIO_PINS pin, eGPIO_pinDirection direction); 139 HAL_Status HAL_GPIO_SetIntType(struct GPIO_REG *pGPIO, ePINCTRL_GPIO_PINS pin, eGPIO_intType mode); 140 141 HAL_Status HAL_GPIO_SetPinsLevel(struct GPIO_REG *pGPIO, uint32_t mPins, eGPIO_pinLevel level); 142 HAL_Status HAL_GPIO_SetPinsDirection(struct GPIO_REG *pGPIO, uint32_t mPins, eGPIO_pinDirection direction); 143 144 void HAL_GPIO_EnableIRQ(struct GPIO_REG *pGPIO, ePINCTRL_GPIO_PINS pin); 145 void HAL_GPIO_DisableIRQ(struct GPIO_REG *pGPIO, ePINCTRL_GPIO_PINS pin); 146 void HAL_GPIO_IRQHandler(struct GPIO_REG *pGPIO, eGPIO_bankId bank); 147 148 /* The parameter pin for this function is special, it's 0~31. */ 149 void HAL_GPIO_IRQDispatch(eGPIO_bankId bank, uint32_t pin); 150 151 /** @} */ 152 153 #endif 154 /** @} */ 155 156 /** @} */ 157