1 /* 2 * Copyright ( C) 2015-2020 Alibaba Group Holding Limited 3 */ 4 5 #ifndef _IO_GPIO_H_ 6 #define _IO_GPIO_H_ 7 8 #define IOC_GPIO_BASE 'G' 9 #define IOC_GPIO_SET IOC_GPIO_BASE + 1 10 #define IOC_GPIO_GET IOC_GPIO_BASE + 2 11 #define IOC_GPIO_SET_IRQ IOC_GPIO_BASE + 3 12 13 enum GPIO_IO_BITS { 14 GPIO_IO_INPUT_BIT = 0, // Input 15 GPIO_IO_OUTPUT_BIT, // Output 16 GPIO_IO_INPUT_PU_BIT, // Pull up 17 GPIO_IO_INPUT_PD_BIT, // Pull down 18 GPIO_IO_INPUT_HI_BIT, // High impedance 19 GPIO_IO_OUTPUT_PP_BIT, // Push high and pull low actively 20 GPIO_IO_OUTPUT_ODNP_BIT, // Open Drain No Pull 21 GPIO_IO_OUTPUT_ODPU_BIT, // Open Drain Pull Up 22 GPIO_IO_OUTPUT_TOGGLE_BIT, // get GPIO output level reverted 23 GPIO_IO_INPUT_OUTPUT_MAX_BIT, 24 }; 25 26 #define GPIO_IO_INPUT (1 << GPIO_IO_INPUT_BIT) 27 #define GPIO_IO_OUTPUT (1 << GPIO_IO_OUTPUT_BIT) 28 #define GPIO_IO_INPUT_PU (1 << GPIO_IO_INPUT_PU_BIT) 29 #define GPIO_IO_INPUT_PD (1 << GPIO_IO_INPUT_PD_BIT) 30 #define GPIO_IO_INPUT_HI (1 << GPIO_IO_INPUT_HI_BIT) 31 #define GPIO_IO_OUTPUT_PP (1 << GPIO_IO_OUTPUT_PP_BIT) 32 #define GPIO_IO_OUTPUT_ODNP (1 << GPIO_IO_OUTPUT_ODNP_BIT) 33 #define GPIO_IO_OUTPUT_ODPU (1 << GPIO_IO_OUTPUT_ODPU_BIT) 34 #define GPIO_IO_OUTPUT_TOGGLE (1 << GPIO_IO_OUTPUT_TOGGLE_BIT) 35 36 #define GPIO_IO_INPUT_MASK (GPIO_IO_INPUT_PU | GPIO_IO_INPUT_PD | GPIO_IO_INPUT_HI) 37 #define GPIO_IO_OUTPUT_MASK (GPIO_IO_OUTPUT_PP | GPIO_IO_OUTPUT_ODNP | GPIO_IO_OUTPUT_ODPU | GPIO_IO_OUTPUT_TOGGLE) 38 39 enum GPIO_IRQ_BITS { 40 GPIO_IRQ_ENABLE_BIT = 0, 41 GPIO_IRQ_DISABLE_BIT, 42 GPIO_IRQ_CLEAR_BIT, 43 GPIO_IRQ_LEVEL_LOW_BIT, 44 GPIO_IRQ_LEVEL_HIGH_BIT, 45 GPIO_IRQ_EDGE_FALLING_BIT, 46 GPIO_IRQ_EDGE_RISING_BIT, 47 GPIO_IRQ_EDGE_BOTH_BIT, 48 }; 49 50 #define GPIO_IRQ_ENABLE (1 << GPIO_IRQ_ENABLE_BIT) 51 #define GPIO_IRQ_DISABLE (1 << GPIO_IRQ_DISABLE_BIT) 52 #define GPIO_IRQ_CLEAR (1 << GPIO_IRQ_CLEAR_BIT) 53 #define GPIO_IRQ_LEVEL_LOW (1 << GPIO_IRQ_LEVEL_LOW_BIT) 54 #define GPIO_IRQ_LEVEL_HIGH (1 << GPIO_IRQ_LEVEL_HIGH_BIT) 55 #define GPIO_IRQ_EDGE_FALLING (1 << GPIO_IRQ_EDGE_FALLING_BIT) 56 #define GPIO_IRQ_EDGE_RISING (1 << GPIO_IRQ_EDGE_RISING_BIT) 57 #define GPIO_IRQ_EDGE_BOTH (1 << GPIO_IRQ_EDGE_BOTH_BIT) 58 #define GPIO_IRQ_MODE_MASK (GPIO_IRQ_LEVEL_LOW | GPIO_IRQ_LEVEL_HIGH | GPIO_IRQ_EDGE_FALLING | GPIO_IRQ_EDGE_RISING | GPIO_IRQ_EDGE_BOTH) 59 60 typedef struct gpio_io_config { 61 unsigned int id:8; // GPIO id 62 unsigned int config:16; // GPIO config (directin/pull up/down, etc.) 63 unsigned int data:1; // output data 64 } gpio_io_config_t; 65 66 typedef int (*io_irq_handler_t)(void *arg); 67 68 typedef struct gpio_irq_config { 69 unsigned int id:8; // GPIO id 70 unsigned int config:16; // IRQ config (enable/disable, trigger type, clear, etc.) 71 unsigned char *arg; // argument used to parsed to irq callback 72 io_irq_handler_t cb; 73 } gpio_irq_config_t; 74 75 int vfs_gpio_drv_init (void); 76 77 #endif //_IO_GPIO_H_ 78