1 #include <rthw.h>
2 #include <rtdevice.h>
3 #include <hal_gpio.h>
4 
hal_pin_mode(struct rt_device * device,rt_base_t pin,rt_uint8_t mode)5 static void hal_pin_mode(struct rt_device *device, rt_base_t pin, rt_uint8_t mode)
6 {
7     switch (mode)
8     {
9         case PIN_MODE_OUTPUT:
10             hal_gpio_set_direction(pin,GPIO_DIRECTION_OUTPUT);
11             break;
12         case PIN_MODE_INPUT:
13             hal_gpio_set_direction(pin,GPIO_DIRECTION_INPUT);
14             break;
15         case PIN_MODE_INPUT_PULLDOWN:
16             hal_gpio_set_pull(pin, GPIO_PULL_DOWN);
17             hal_gpio_set_direction(pin,GPIO_DIRECTION_INPUT);
18             break;
19         case PIN_MODE_INPUT_PULLUP:
20             hal_gpio_set_pull(pin,GPIO_PULL_UP);
21             hal_gpio_set_direction(pin,GPIO_DIRECTION_INPUT);
22             break;
23         case PIN_MODE_OUTPUT_OD:
24             hal_gpio_set_pull(pin, GPIO_PULL_DOWN_DISABLED);
25             hal_gpio_set_direction(pin,GPIO_DIRECTION_OUTPUT);
26             break;
27     }
28 }
29 
hal_pin_write(struct rt_device * device,rt_base_t pin,rt_uint8_t value)30 static void hal_pin_write(struct rt_device *device, rt_base_t pin, rt_uint8_t value)
31 {
32     hal_gpio_set_data(pin,value);
33 }
34 
hal_pin_read(struct rt_device * device,rt_base_t pin)35 static rt_ssize_t hal_pin_read(struct rt_device *device, rt_base_t pin)
36 {
37     gpio_data_t value;
38     hal_gpio_get_data(pin,&value);
39     return (rt_ssize_t)value;
40 }
41 
hal_pin_attach_irq(struct rt_device * device,rt_base_t pin,rt_uint8_t mode,void (* hdr)(void * args),void * args)42 static rt_err_t hal_pin_attach_irq(struct rt_device *device, rt_base_t pin,
43                                        rt_uint8_t mode, void (*hdr)(void *args),
44                                        void *args)
45 {
46     rt_base_t level = 0;
47     uint32_t irq;
48     int ret = 0;
49 
50     ret = hal_gpio_to_irq(pin, &irq);
51     if (ret < 0)
52     {
53         rt_kprintf("gpio to irq error, irq num:%lu error num: %d", irq, ret);
54         return -RT_ERROR;
55     }
56 
57     level = rt_hw_interrupt_disable();
58     hal_gpio_set_debounce(pin, 1); // enable debounce 24Mhz
59     ret = hal_gpio_irq_attach(irq, hdr, mode + 1, args);
60     if (ret < 0)
61     {
62         rt_hw_interrupt_enable(level);
63         rt_kprintf("request irq error, irq num:%lu error num: %d", irq, ret);
64         return -RT_ERROR;
65     }
66     rt_hw_interrupt_enable(level);
67 
68     return RT_EOK;
69 }
70 
hal_pin_detach_irq(struct rt_device * device,rt_base_t pin)71 static rt_err_t hal_pin_detach_irq(struct rt_device *device, rt_base_t pin)
72 {
73     rt_base_t level = 0;
74     uint32_t irq;
75     int ret;
76 
77     ret = hal_gpio_to_irq(pin, &irq);
78     if (ret < 0)
79     {
80         rt_kprintf("gpio to irq error, irq num:%lu error num: %d", irq, ret);
81         return -RT_ERROR;
82     }
83 
84     level = rt_hw_interrupt_disable();
85     ret = hal_gpio_irq_free(irq);
86     if (ret < 0)
87     {
88         rt_hw_interrupt_enable(level);
89         rt_kprintf("free irq error, error num: %d", ret);
90         return -RT_ERROR;
91     }
92     return RT_EOK;
93 }
94 
hal_pin_irq_enable(struct rt_device * device,rt_base_t pin,rt_uint8_t enabled)95 static rt_err_t hal_pin_irq_enable(struct rt_device *device, rt_base_t pin, rt_uint8_t enabled)
96 {
97     uint32_t irq;
98     int ret;
99 
100     ret = hal_gpio_to_irq(pin, &irq);
101     if (ret < 0)
102     {
103         rt_kprintf("gpio to irq error, irq num:%lu error num: %d", irq, ret);
104         return -RT_ERROR;
105     }
106 
107     if (enabled == PIN_IRQ_ENABLE)
108     {
109         ret = hal_gpio_irq_enable(irq);
110         if (ret < 0)
111         {
112             rt_kprintf("request irq error, error num: %d", ret);
113             return -RT_ERROR;
114         }
115     }
116     else
117     {
118         ret = hal_gpio_irq_disable(irq);
119         if (ret < 0)
120         {
121             rt_kprintf("disable irq error, irq num:%lu, error num: %d", irq, ret);
122             return -RT_ERROR;
123         }
124     }
125 
126     return RT_EOK;
127 }
128 
129 static const struct rt_pin_ops gpio_ops =
130 {
131     hal_pin_mode,
132     hal_pin_write,
133     hal_pin_read,
134     hal_pin_attach_irq,
135     hal_pin_detach_irq,
136     hal_pin_irq_enable,
137     RT_NULL,
138 };
139 
hal_hw_pin_init(void)140 int hal_hw_pin_init(void)
141 {
142     return rt_device_pin_register("pin", &gpio_ops, RT_NULL);
143 }
144 
145 INIT_BOARD_EXPORT(hal_hw_pin_init);
146