• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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