1 /*
2 * Copyright (c) 2019-2025 Allwinner Technology Co., Ltd. ALL rights reserved.
3 *
4 * Allwinner is a trademark of Allwinner Technology Co.,Ltd., registered in
5 * the the People's Republic of China and other countries.
6 * All Allwinner Technology Co.,Ltd. trademarks are used with permission.
7 *
8 * DISCLAIMER
9 * THIRD PARTY LICENCES MAY BE REQUIRED TO IMPLEMENT THE SOLUTION/PRODUCT.
10 * IF YOU NEED TO INTEGRATE THIRD PARTY’S TECHNOLOGY (SONY, DTS, DOLBY, AVS OR MPEGLA, ETC.)
11 * IN ALLWINNERS’SDK OR PRODUCTS, YOU SHALL BE SOLELY RESPONSIBLE TO OBTAIN
12 * ALL APPROPRIATELY REQUIRED THIRD PARTY LICENCES.
13 * ALLWINNER SHALL HAVE NO WARRANTY, INDEMNITY OR OTHER OBLIGATIONS WITH RESPECT TO MATTERS
14 * COVERED UNDER ANY REQUIRED THIRD PARTY LICENSE.
15 * YOU ARE SOLELY RESPONSIBLE FOR YOUR USAGE OF THIRD PARTY’S TECHNOLOGY.
16 *
17 *
18 * THIS SOFTWARE IS PROVIDED BY ALLWINNER"AS IS" AND TO THE MAXIMUM EXTENT
19 * PERMITTED BY LAW, ALLWINNER EXPRESSLY DISCLAIMS ALL WARRANTIES OF ANY KIND,
20 * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION REGARDING
21 * THE TITLE, NON-INFRINGEMENT, ACCURACY, CONDITION, COMPLETENESS, PERFORMANCE
22 * OR MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
23 * IN NO EVENT SHALL ALLWINNER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26 * LOSS OF USE, DATA, OR PROFITS, OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
28 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
30 * OF THE POSSIBILITY OF SUCH DAMAGE.
31 */
32 
33 #ifndef __HAL_GPIO_H__
34 #define __HAL_GPIO_H__
35 
36 #include <stdlib.h>
37 #include <hal_interrupt.h>
38 
39 #include <hal_log.h>
40 #include <gpio/gpio.h>
41 #include <platform-gpio.h>
42 
43 #ifdef __cplusplus
44 extern "C" {
45 #endif
46 
47 #define CONFIG_DRIVERS_GPIO_DEBUG
48 #ifndef CONFIG_DRIVERS_GPIO_DEBUG
49 #define GPIO_INFO(fmt, arg...) hal_log_info(fmt, ##arg)
50 #else
51 #define GPIO_INFO(fmt, arg...) do {}while(0)
52 #endif
53 
54 #define GPIO_ERR(fmt, arg...) hal_log_err(fmt, ##arg)
55 
56 /**This enum defines the GPIO MUX function*/
57 #if defined(CONFIG_SOC_SUN20IW1) || defined(CONFIG_ARCH_SUN8IW20)
58 typedef enum
59 {
60     GPIO_MUXSEL_IN = 0,
61     GPIO_MUXSEL_OUT = 1,
62     GPIO_MUXSEL_FUNCTION2 = 2,
63     GPIO_MUXSEL_FUNCTION3 = 3,
64     GPIO_MUXSEL_FUNCTION4 = 4,
65     GPIO_MUXSEL_FUNCTION5 = 5,
66     GPIO_MUXSEL_FUNCTION6 = 6,
67     GPIO_MUXSEL_FUNCTION7 = 7,
68     GPIO_MUXSEL_FUNCTION8 = 8,
69     GPIO_MUXSEL_FUNCTION9 = 9,
70     GPIO_MUXSEL_FUNCTION10 = 10,
71     GPIO_MUXSEL_FUNCTION11 = 11,
72     GPIO_MUXSEL_FUNCTION12 = 12,
73     GPIO_MUXSEL_FUNCTION13 = 13,
74     GPIO_MUXSEL_EINT = 14,
75     GPIO_MUXSEL_DISABLED = 15,
76 } gpio_muxsel_t;
77 #else
78 typedef enum
79 {
80     GPIO_MUXSEL_IN = 0,
81     GPIO_MUXSEL_OUT = 1,
82     GPIO_MUXSEL_FUNCTION2 = 2,
83     GPIO_MUXSEL_FUNCTION3 = 3,
84     GPIO_MUXSEL_FUNCTION4 = 4,
85     GPIO_MUXSEL_FUNCTION5 = 5,
86     GPIO_MUXSEL_EINT = 6,
87     GPIO_MUXSEL_DISABLED = 7,
88 } gpio_muxsel_t;
89 #endif
90 
91 typedef enum
92 {
93     GPIO_DRIVING_LEVEL0    = 0,        /**< Defines GPIO driving current as level0.  */
94     GPIO_DRIVING_LEVEL1    = 1,        /**< Defines GPIO driving current as level1.  */
95     GPIO_DRIVING_LEVEL2    = 2,        /**< Defines GPIO driving current as level2. */
96     GPIO_DRIVING_LEVEL3    = 3         /**< Defines GPIO driving current as level3. */
97 } gpio_driving_level_t;
98 
99 typedef enum
100 {
101     GPIO_PULL_DOWN_DISABLED    = 0,        /**< Defines GPIO pull up and pull down disable.  */
102     GPIO_PULL_UP          = 1,        /**< Defines GPIO is pull up state.  */
103     GPIO_PULL_DOWN            = 2,        /**< Defines GPIO is pull down state. */
104 } gpio_pull_status_t;
105 
106 /** This enum defines the GPIO direction. */
107 typedef enum
108 {
109     GPIO_DIRECTION_INPUT  = 0,              /**<  GPIO input direction. */
110     GPIO_DIRECTION_OUTPUT = 1               /**<  GPIO output direction. */
111 } gpio_direction_t;
112 
113 /** This enum defines the data type of GPIO. */
114 typedef enum
115 {
116     GPIO_DATA_LOW  = 0,                     /**<  GPIO data low. */
117     GPIO_DATA_HIGH = 1                      /**<  GPIO data high. */
118 } gpio_data_t;
119 
120 typedef enum
121 {
122     POWER_MODE_330 = 0,
123     POWER_MODE_180 = 1
124 } gpio_power_mode_t;
125 
126 bool hal_gpio_check_valid(gpio_pin_t pin);
127 int hal_gpio_get_data(gpio_pin_t pin, gpio_data_t *data);
128 int hal_gpio_set_data(gpio_pin_t pin, gpio_data_t data);
129 int hal_gpio_set_direction(gpio_pin_t pin, gpio_direction_t direction);
130 int hal_gpio_get_direction(gpio_pin_t pin, gpio_direction_t *direction);
131 int hal_gpio_set_pull(gpio_pin_t pin, gpio_pull_status_t pull);
132 int hal_gpio_get_pull(gpio_pin_t pin, gpio_pull_status_t *pull);
133 int hal_gpio_set_driving_level(gpio_pin_t pin, gpio_driving_level_t level);
134 int hal_gpio_get_driving_level(gpio_pin_t pin, gpio_driving_level_t *level);
135 int hal_gpio_pinmux_set_function(gpio_pin_t pin, gpio_muxsel_t function_index);
136 int hal_gpio_sel_vol_mode(gpio_pin_t pins, gpio_power_mode_t pm_sel);
137 int hal_gpio_set_debounce(gpio_pin_t pin, unsigned value);
138 int hal_gpio_to_irq(gpio_pin_t pin, uint32_t *irq);
139 int hal_gpio_irq_attach(uint32_t irq, void (*hdle)(void *), unsigned long flags, void *data);
140 int hal_gpio_irq_request(uint32_t irq, irq_handler_t hdle, unsigned long flags, void *data);
141 int hal_gpio_irq_free(uint32_t irq);
142 int hal_gpio_irq_enable(uint32_t irq);
143 int hal_gpio_irq_disable(uint32_t irq);
144 int hal_gpio_init(void);
145 
146 #ifdef __cplusplus
147 }
148 #endif
149 #endif
150