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