1 /* 2 * Copyright (c) 2006-2021, RT-Thread Development Team 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 * 6 * Change Logs: 7 * Date Author Notes 8 * 2018-02-08 RT-Thread the first version 9 */ 10 #ifndef __DRV_GPIO_H__ 11 #define __DRV_GPIO_H__ 12 13 #include <rtdef.h> 14 15 /* IO default function */ 16 #define IO_INPUT (0x00) 17 #define IO_OUTPUT (0x01) 18 #define IO_DISABLE (0x07) 19 20 #define IO_FUN_1 (0x02) 21 #define IO_FUN_2 (0x03) 22 #define IO_FUN_3 (0x04) 23 #define IO_FUN_4 (0x05) 24 #define IO_FUN_5 (0x06) 25 26 /* IO port */ 27 enum gpio_port 28 { 29 GPIO_PORT_A = 0, 30 GPIO_PORT_B, 31 GPIO_PORT_C, 32 GPIO_PORT_D, 33 GPIO_PORT_E, 34 GPIO_PORT_F, 35 GPIO_PORT_NUM, 36 }; 37 38 /* IO pin */ 39 enum gpio_pin 40 { 41 GPIO_PIN_0 = 0, 42 GPIO_PIN_1, 43 GPIO_PIN_2, 44 GPIO_PIN_3, 45 GPIO_PIN_4, 46 GPIO_PIN_5, 47 GPIO_PIN_6, 48 GPIO_PIN_7, 49 GPIO_PIN_8, 50 GPIO_PIN_9, 51 GPIO_PIN_10, 52 GPIO_PIN_11, 53 GPIO_PIN_12, 54 GPIO_PIN_13, 55 GPIO_PIN_14, 56 GPIO_PIN_15, 57 GPIO_PIN_16, 58 GPIO_PIN_17, 59 GPIO_PIN_18, 60 GPIO_PIN_19, 61 GPIO_PIN_20, 62 GPIO_PIN_21, 63 GPIO_PIN_22, 64 GPIO_PIN_23, 65 GPIO_PIN_NUM, 66 }; 67 68 /* Drive level */ 69 enum gpio_drv_level 70 { 71 DRV_LEVEL_0 = 0, 72 DRV_LEVEL_1, 73 DRV_LEVEL_2, 74 DRV_LEVEL_3, 75 }; 76 77 /* Pull mode */ 78 enum gpio_pull 79 { 80 PULL_DISABLE = 0, 81 PULL_UP, 82 PULL_DOWN, 83 }; 84 85 /* interrupt type */ 86 enum gpio_irq_type 87 { 88 POSITIVE = 0, 89 NEGATIVE, 90 HIGH, 91 LOW, 92 DOUBLE, 93 }; 94 95 enum gpio_irq_clock 96 { 97 GPIO_IRQ_LOSC_32KHZ = 0, 98 GPIO_IRQ_HOSC_24MHZ 99 }; 100 101 enum gpio_direction_type 102 { 103 DEBOUNCE_PRE_SCALE_1 = 0, 104 DEBOUNCE_PRE_SCALE_2, 105 DEBOUNCE_PRE_SCALE_4, 106 DEBOUNCE_PRE_SCALE_8, 107 DEBOUNCE_PRE_SCALE_16, 108 DEBOUNCE_PRE_SCALE_32, 109 DEBOUNCE_PRE_SCALE_64, 110 DEBOUNCE_PRE_SCALE_128, 111 }; 112 113 struct gpio_irq_def 114 { 115 void *irq_arg[32]; 116 void (*irq_cb[32])(void *param); 117 }; 118 119 #define GPIO_BASE_ADDR (0x01C20800) 120 #define GPIOn_CFG_ADDR(n) (GPIO_BASE_ADDR + (n) * 0x24 + 0x00) 121 #define GPIOn_DATA_ADDR(n) (GPIO_BASE_ADDR + (n) * 0x24 + 0x10) 122 #define GPIOn_DRV_ADDR(n) (GPIO_BASE_ADDR + (n) * 0x24 + 0x14) 123 #define GPIOn_PUL_ADDR(n) (GPIO_BASE_ADDR + (n) * 0x24 + 0x1C) 124 #define GPIOn_INT_CFG_ADDR(n) (GPIO_BASE_ADDR + 0x200 + (n) * 0x20 + 0x00) 125 #define GPIOn_INT_CTRL_ADDR(n) (GPIO_BASE_ADDR + 0x200 + (n) * 0x20 + 0x10) 126 #define GPIOn_INT_STA_ADDR(n) (GPIO_BASE_ADDR + 0x200 + (n) * 0x20 + 0x14) 127 #define GPIOn_INT_DEB_ADDR(n) (GPIO_BASE_ADDR + 0x200 + (n) * 0x20 + 0x18) 128 129 struct tina_gpio 130 { 131 volatile rt_uint32_t pa_cfg0; /* 0x00 */ 132 volatile rt_uint32_t pa_cfg1; /* 0x04 */ 133 volatile rt_uint32_t pa_cfg2; /* 0x08 */ 134 volatile rt_uint32_t pa_cfg3; /* 0x0C */ 135 volatile rt_uint32_t pa_data; /* 0x10 */ 136 volatile rt_uint32_t pa_drv0; /* 0x14 */ 137 volatile rt_uint32_t pa_drv1; /* 0x18 */ 138 volatile rt_uint32_t pa_pul0; /* 0x1C */ 139 volatile rt_uint32_t pa_pul1; /* 0x20 */ 140 volatile rt_uint32_t pb_cfg0; /* 0x24 */ 141 volatile rt_uint32_t pb_cfg1; /* 0x28 */ 142 volatile rt_uint32_t pb_cfg2; /* 0x2C */ 143 volatile rt_uint32_t pb_cfg3; /* 0x30 */ 144 volatile rt_uint32_t pb_data; /* 0x34 */ 145 volatile rt_uint32_t pb_drv0; /* 0x38 */ 146 volatile rt_uint32_t pb_drv1; /* 0x3C */ 147 volatile rt_uint32_t pb_pul0; /* 0x40 */ 148 volatile rt_uint32_t pb_pul1; /* 0x44 */ 149 volatile rt_uint32_t pc_cfg0; /* 0x48 */ 150 volatile rt_uint32_t pc_cfg1; /* 0x4C */ 151 volatile rt_uint32_t pc_cfg2; /* 0x50 */ 152 volatile rt_uint32_t pc_cfg3; /* 0x54 */ 153 volatile rt_uint32_t pc_data; /* 0x58 */ 154 volatile rt_uint32_t pc_drv0; /* 0x5C */ 155 volatile rt_uint32_t pc_drv1; /* 0x60 */ 156 volatile rt_uint32_t pc_pul0; /* 0x64 */ 157 volatile rt_uint32_t pc_pul1; /* 0x68 */ 158 volatile rt_uint32_t pd_cfg0; /* 0x6C */ 159 volatile rt_uint32_t pd_cfg1; /* 0x70 */ 160 volatile rt_uint32_t pd_cfg2; /* 0x74 */ 161 volatile rt_uint32_t pd_cfg3; /* 0x78 */ 162 volatile rt_uint32_t pd_data; /* 0x7C */ 163 volatile rt_uint32_t pd_drv0; /* 0x80 */ 164 volatile rt_uint32_t pd_drv1; /* 0x84 */ 165 volatile rt_uint32_t pd_pul0; /* 0x88 */ 166 volatile rt_uint32_t pd_pul1; /* 0x8C */ 167 volatile rt_uint32_t pe_cfg0; /* 0x90 */ 168 volatile rt_uint32_t pe_cfg1; /* 0x94 */ 169 volatile rt_uint32_t pe_cfg2; /* 0x98 */ 170 volatile rt_uint32_t pe_cfg3; /* 0x9C */ 171 volatile rt_uint32_t pe_data; /* 0xA0 */ 172 volatile rt_uint32_t pe_drv0; /* 0xA4 */ 173 volatile rt_uint32_t pe_drv1; /* 0xA8 */ 174 volatile rt_uint32_t pe_pul0; /* 0xAC */ 175 volatile rt_uint32_t pe_pul1; /* 0xB0 */ 176 volatile rt_uint32_t pf_cfg0; /* 0xB4 */ 177 volatile rt_uint32_t pf_cfg1; /* 0xB8 */ 178 volatile rt_uint32_t pf_cfg2; /* 0xBC */ 179 volatile rt_uint32_t pf_cfg3; /* 0xC0 */ 180 volatile rt_uint32_t pf_data; /* 0xC4 */ 181 volatile rt_uint32_t pf_drv0; /* 0xC8 */ 182 volatile rt_uint32_t pf_drv1; /* 0xCC */ 183 volatile rt_uint32_t pf_pul0; /* 0xD0 */ 184 volatile rt_uint32_t reserved0[76]; 185 volatile rt_uint32_t pd_int_cfg0; /* 0x200 */ 186 volatile rt_uint32_t pd_int_cfg1; /* 0x204 */ 187 volatile rt_uint32_t pd_int_cfg2; /* 0x208 */ 188 volatile rt_uint32_t pd_int_cfg3; /* 0x20C */ 189 volatile rt_uint32_t pd_int_ctrl; /* 0x210 */ 190 volatile rt_uint32_t pd_int_sta; /* 0x214 */ 191 volatile rt_uint32_t pd_int_deb; /* 0x218 */ 192 volatile rt_uint32_t reserved1; 193 volatile rt_uint32_t pe_int_cfg0; /* 0x220 */ 194 volatile rt_uint32_t pe_int_cfg1; /* 0x224 */ 195 volatile rt_uint32_t pe_int_cfg2; /* 0x228 */ 196 volatile rt_uint32_t pe_int_cfg3; /* 0x22C */ 197 volatile rt_uint32_t pe_int_ctrl; /* 0x230 */ 198 volatile rt_uint32_t pe_int_sta; /* 0x234 */ 199 volatile rt_uint32_t pe_int_deb; /* 0x238 */ 200 volatile rt_uint32_t reserved2; 201 volatile rt_uint32_t pf_int_cfg0; /* 0x240 */ 202 volatile rt_uint32_t pf_int_cfg1; /* 0x244 */ 203 volatile rt_uint32_t pf_int_cfg2; /* 0x248 */ 204 volatile rt_uint32_t pf_int_cfg3; /* 0x24C */ 205 volatile rt_uint32_t pf_int_ctrl; /* 0x250 */ 206 volatile rt_uint32_t pf_int_sta; /* 0x254 */ 207 volatile rt_uint32_t pf_int_deb; /* 0x258 */ 208 volatile rt_uint32_t reserved3[26]; 209 volatile rt_uint32_t sdr_pad_drv; /* 0x2C0*/ 210 volatile rt_uint32_t sdr_pad_pul; /* 0x2C4 */ 211 }; 212 213 typedef struct tina_gpio *tina_gpio_t; 214 215 #define GPIO ((tina_gpio_t)GPIO_BASE_ADDR) 216 217 rt_err_t gpio_set_func(enum gpio_port port, enum gpio_pin pin, rt_uint8_t func); 218 int gpio_set_value(enum gpio_port port, enum gpio_pin pin, rt_uint8_t value); 219 int gpio_get_value(enum gpio_port port, enum gpio_pin pin); 220 int gpio_set_pull_mode(enum gpio_port port, enum gpio_pin pin, enum gpio_pull pull); 221 int gpio_set_drive_level(enum gpio_port port, enum gpio_pin pin, enum gpio_drv_level level); 222 void gpio_direction_input(enum gpio_port port, enum gpio_pin pin); 223 void gpio_direction_output(enum gpio_port port, enum gpio_pin pin, int value); 224 void gpio_irq_enable(enum gpio_port port, enum gpio_pin pin); 225 void gpio_irq_disable(enum gpio_port port, enum gpio_pin pin); 226 void gpio_set_irq_type(enum gpio_port port, enum gpio_pin pin, enum gpio_irq_type irq_type); 227 void gpio_select_irq_clock(enum gpio_port port, enum gpio_irq_clock clock); 228 void gpio_set_debounce(enum gpio_port port, rt_uint8_t prescaler); 229 void gpio_set_irq_callback(enum gpio_port port, enum gpio_pin pin, void (*irq_cb)(void *), void *irq_arg); 230 int rt_hw_gpio_init(void); 231 232 #endif /* __DRV_GPIO_H__ */ 233