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