1 /* 2 * Copyright (C) 2022 HiSilicon (Shanghai) Technologies CO., LIMITED. 3 * 4 * This program is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU General Public License 6 * as published by the Free Software Foundation; either version 2 7 * of the License, or (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write to the Free Software 16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 17 */ 18 19 #ifndef __HI_DRV_GPIO_H__ 20 #define __HI_DRV_GPIO_H__ 21 22 #include "hi_type.h" 23 #include "drv_gpio_struct.h" 24 #include "hi_osal.h" 25 26 #define HI_GPIO_GROUP_NUM 23 27 28 #define GPIO_ERROR_MIN_NO 16 29 #define GPIO_ERROR_MAX_NO 17 30 31 #define HI_GPIO_BIT_NUM 8 32 #define HI_GPIO_MAX_BIT_NUM (HI_GPIO_GROUP_NUM * HI_GPIO_BIT_NUM) 33 34 #define HI_GPIO_SPACE_SIZE 0x1000 35 36 #define HI_GPIO_REG_REMAP(pvAddr, u32RegAddr) \ 37 do { \ 38 (pvAddr) = osal_ioremap_nocache((u32RegAddr), HI_GPIO_SPACE_SIZE); \ 39 if (NULL == (pvAddr)) { \ 40 HI_LOG_ERR("ioremap REG_ADDR[0x%x] failure!\n", (u32RegAddr)); \ 41 return HI_FAILURE; \ 42 } \ 43 } while (0) 44 45 #ifdef __KERNEL__ 46 #define HI_GPIO_REG_UNMAP(pvAddr) osal_iounmap(pvAddr) 47 #else 48 #define HI_GPIO_REG_UNMAP(pvAddr) osal_iounmap(pvAddr, HI_GPIO_SPACE_SIZE) 49 #endif 50 51 #define HI_GPIO_MAX_GROUP_NUM 23 52 #define HI_gpio_irqTB0_NO (126 + 32) 53 #define HI_GPIO_IRQ_NO (108 + 32) 54 55 #define HI_GPIO_0_ADDR 0xF8B20000 56 #define HI_GPIO_1_ADDR 0xF8B21000 57 #define HI_GPIO_2_ADDR 0xF8B22000 58 #define HI_GPIO_3_ADDR 0xF8B23000 59 #define HI_GPIO_4_ADDR 0xF8B24000 60 #define HI_GPIO_5_ADDR 0xF8B25000 61 #define HI_GPIO_6_ADDR 0xF8B26000 62 #define HI_GPIO_7_ADDR 0xF8B27000 63 #define HI_GPIO_8_ADDR 0xF8B28000 64 #define HI_GPIO_9_ADDR 0xF8B29000 65 /* V350 :GPIO_10-GPIO_15 is reserved */ 66 #define HI_GPIO_10_ADDR 0xF8B2A000 67 #define HI_GPIO_11_ADDR 0xF8B2B000 68 #define HI_GPIO_12_ADDR 0xF8B2C000 69 #define HI_GPIO_13_ADDR 0xF8B2D000 70 #define HI_GPIO_14_ADDR 0xF8B2E000 71 #define HI_GPIO_15_ADDR 0xF8B2F000 72 73 #define HI_GPIO_18_ADDR 0xF8004000 /* STB_GPIO_PWM18 */ 74 #define HI_GPIO_19_ADDR 0xF8009000 /* STB_GPIO_PWM19 */ 75 #define HI_GPIO_20_ADDR 0xF800B000 /* STB_GPIO_PWM20 */ 76 /* V350 :GPIO_21、GPIO_22 is reserved */ 77 #define HI_GPIO_21_ADDR 0xF800C000 /* STB_GPIO_PWM21 */ 78 #define HI_GPIO_22_ADDR 0xF8036000 /* STB_GPIO_PWM22 */ 79 80 #define HI_GPIO_DIR_REG 0x400 81 #define HI_GPIO_IS_REG 0x404 82 #define HI_GPIO_IBE_REG 0x408 83 #define HI_GPIO_IEV_REG 0x40c 84 #define HI_GPIO_IE_REG 0x410 85 #define HI_GPIO_RIS_REG 0x414 86 #define HI_GPIO_MIS_REG 0x418 87 #define HI_GPIO_IC_REG 0x41c 88 89 #define HI_GPIO_OUTPUT 1 90 #define HI_GPIO_INPUT 0 91 #define REG_USR_ADDR(RegAddr) *((volatile hi_u32*)(RegAddr)) 92 93 typedef struct { 94 hi_u32 irq_no; 95 hi_char name[16]; // 存放名称的字符最大长度为16 96 } gpio_irq; 97 98 hi_s32 hi_drv_gpio_init(hi_void); 99 hi_void hi_drv_gpio_de_init(hi_void); 100 101 hi_s32 hi_drv_gpio_set_dir_bit(hi_u32 gpio_no, hi_u32 dir_bit); 102 hi_s32 hi_drv_gpio_get_dir_bit(hi_u32 gpio_no, hi_u32 *p_dir_bit); 103 hi_s32 hi_drv_gpio_write_bit(hi_u32 gpio_no, hi_u32 bit_value); 104 hi_s32 hi_drv_gpio_read_bit(hi_u32 gpio_no, hi_u32 *p_bit_value); 105 hi_s32 hi_drv_gpio_get_gpio_num(gpio_get_gpionum *gpio_num); 106 107 hi_s32 hi_drv_gpio_set_int_type(hi_u32 gpio_no, gpio_inttpye en_int_tri_mode); 108 hi_s32 hi_drv_gpio_set_bit_int_enable(hi_u32 gpio_no, HI_BOOL b_enable); 109 hi_s32 hi_drv_gpio_register_server_func(hi_u32 gpio_no, hi_void(*func)(hi_u32)); 110 hi_s32 hi_drv_gpio_unregister_server_func(hi_u32 gpio_no); 111 hi_s32 hi_drv_gpio_clear_group_int(hi_u32 group_no); 112 hi_s32 hi_drv_gpio_clear_bit_int(hi_u32 gpio_no); 113 hi_s32 hi_drv_gpio_get_usr_addr(hi_u32 group_no, hi_void **pv_vir_addr); 114 115 typedef hi_s32 (*fn_gpio_get_bit)(hi_u32, hi_u32 *); 116 typedef hi_s32 (*fn_gpio_set_bit)(hi_u32, hi_u32); 117 typedef hi_s32 (*fn_gpio_get_num)(gpio_get_gpionum *); 118 119 typedef hi_s32 (*fn_gpio_register_server_func)(hi_u32, hi_void (*func)(hi_u32)); 120 typedef hi_s32 (*fn_gpio_unregister_server_func)(hi_u32); 121 typedef hi_s32 (*fn_gpio_set_int_type)(hi_u32, gpio_inttpye); 122 typedef hi_s32 (*fn_gpio_set_int_enable)(hi_u32, hi_bool); 123 typedef hi_s32 (*fn_gpio_clear_group_int)(hi_u32); 124 typedef hi_s32 (*fn_gpio_clear_bit_int)(hi_u32); 125 typedef hi_s32 (*fn_gpio_get_usr_addr)(hi_u32, hi_void **); 126 127 typedef struct { 128 fn_gpio_get_bit pfn_gpio_dir_get_bit; 129 fn_gpio_set_bit pfn_gpio_dir_set_bit; 130 fn_gpio_get_bit pfn_gpio_read_bit; 131 fn_gpio_set_bit pfn_gpio_write_bit; 132 fn_gpio_get_num pfn_gpio_get_num; 133 fn_gpio_register_server_func pfn_gpio_register_server_func; 134 fn_gpio_unregister_server_func pfn_gpio_unregister_server_func; 135 fn_gpio_set_int_type pfn_gpio_set_int_type; 136 fn_gpio_set_int_enable pfn_gpio_set_int_enable; 137 fn_gpio_clear_group_int pfn_gpio_clear_group_int; 138 fn_gpio_clear_bit_int pfn_gpio_clear_bit_int; 139 fn_gpio_get_usr_addr pfn_gpio_get_usr_addr; 140 } gpio_ext_func; 141 hi_void gpio_drv_get_gpio_ext_func(gpio_ext_func **st_gpio_export_funcs); 142 143 #endif /* End of #ifndef __HI_DRV_GPIO_H__ */ 144