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