1 /*
2  * Copyright (C) 2015-2020 Alibaba Group Holding Limited
3  */
4 
5 #include <termio.h>
6 #include <stdio.h>
7 #include <unistd.h>
8 #include <fcntl.h>
9 #include <sys/ioctl.h>
10 #include <signal.h>
11 #include "aos_hal_gpio.h"
12 
13 #ifdef CONFIG_GPIO_NUM
14 #define PLATFORM_GPIO_NUM CONFIG_GPIO_NUM
15 #else
16 #define PLATFORM_GPIO_NUM 40
17 #endif
18 
19 static uint8_t gpio_value[PLATFORM_GPIO_NUM * 2] = { 0 };
20 
aos_hal_gpio_init(gpio_dev_t * gpio)21 int32_t aos_hal_gpio_init(gpio_dev_t *gpio)
22 {
23     memset(gpio_value, 0, PLATFORM_GPIO_NUM * 2);
24     return 0;
25 }
26 
aos_hal_gpio_output_high(gpio_dev_t * gpio)27 int32_t aos_hal_gpio_output_high(gpio_dev_t *gpio)
28 {
29     gpio_value[gpio->port] = 1;
30     return 0;
31 }
32 
aos_hal_gpio_output_low(gpio_dev_t * gpio)33 int32_t aos_hal_gpio_output_low(gpio_dev_t *gpio)
34 {
35     gpio_value[gpio->port] = 0;
36     return 0;
37 }
38 
aos_hal_gpio_output_toggle(gpio_dev_t * gpio)39 int32_t aos_hal_gpio_output_toggle(gpio_dev_t *gpio)
40 {
41     return 0;
42 }
43 
aos_hal_gpio_input_get(gpio_dev_t * gpio,uint32_t * value)44 int32_t aos_hal_gpio_input_get(gpio_dev_t *gpio, uint32_t *value)
45 {
46     *value = gpio_value[gpio->port];
47     return 0;
48 }
49 
50 static gpio_irq_handler_t irq_handler = NULL;
51 static void *irq_arg = NULL;
52 
linux_sig_handler(void * arg)53 static void linux_sig_handler(void *arg)
54 {
55     printf("recv signal SIGUSR1\n");
56     irq_handler(irq_arg);
57 }
58 
aos_hal_gpio_enable_irq(gpio_dev_t * gpio,gpio_irq_trigger_t trigger,gpio_irq_handler_t handler,void * arg)59 int32_t aos_hal_gpio_enable_irq(gpio_dev_t *gpio, gpio_irq_trigger_t trigger, gpio_irq_handler_t handler, void *arg)
60 {
61     irq_handler = handler;
62     irq_arg = arg;
63 
64     struct sigaction sa_usr;
65     sa_usr.sa_flags = 0;
66     sa_usr.sa_handler = linux_sig_handler;
67 
68     sigaction(SIGUSR1, &sa_usr, NULL);
69 
70     return 0;
71 }
72 
aos_hal_gpio_disable_irq(gpio_dev_t * gpio)73 int32_t aos_hal_gpio_disable_irq(gpio_dev_t *gpio)
74 {
75     return 0;
76 }
77 
aos_hal_gpio_clear_irq(gpio_dev_t * gpio)78 int32_t aos_hal_gpio_clear_irq(gpio_dev_t *gpio)
79 {
80     return aos_hal_gpio_disable_irq(gpio);
81 }
82 
aos_hal_gpio_finalize(gpio_dev_t * gpio)83 int32_t aos_hal_gpio_finalize(gpio_dev_t *gpio)
84 {
85     return 0;
86 }
87