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