XFusion API v1.3.0
载入中...
搜索中...
未找到
xf_hal_gpio.c
浏览该文件的文档.
1
12/* ==================== [Includes] ========================================== */
13
14#include "xf_hal_gpio.h"
15
16#if XF_HAL_GPIO_IS_ENABLE
17
18#include "../kernel/xf_hal_dev.h"
19
20/* ==================== [Defines] =========================================== */
21
22#define TAG "hal_gpio"
23#define XF_HAL_GPIO_TYPE XF_HAL_GPIO
24
25/* ==================== [Typedefs] ========================================== */
26
27typedef struct _xf_hal_gpio_t {
28 xf_hal_dev_t dev; // 一定要放到第一个,以便后续close一起free
31
32/* ==================== [Static Prototypes] ================================= */
33
35
36/* ==================== [Static Variables] ================================== */
37
38/* ==================== [Macros] ============================================ */
39
40#define XF_HAL_GPIO_CHECK(condition, retval, format, ...) \
41 XF_CHECK(condition, retval, TAG, format, ##__VA_ARGS__)
42
43/* ==================== [Global Functions] ================================== */
44
49
51{
52 xf_err_t err = XF_OK;
53 UNUSED(err);
54
56 XF_HAL_GPIO_CHECK(!dev, XF_ERR_NOT_FOUND, "gpio init failed!");
57
58 xf_hal_gpio_t *dev_gpio = (xf_hal_gpio_t *)dev;
59
60#if XF_HAL_LOCK_IS_ENABLE
61 xf_lock_lock(dev_gpio->dev.mutex);
62#endif
63
64 dev_gpio->config.direction = direction;
65
66#if XF_HAL_LOCK_IS_ENABLE
67 xf_lock_unlock(dev_gpio->dev.mutex);
68#endif
69
71 XF_HAL_GPIO_CHECK(err, err, "enable failed!");
72
73 return XF_OK;
74}
75
77{
78 xf_err_t err = XF_OK;
79 UNUSED(err);
80
82 XF_HAL_GPIO_CHECK(!dev, XF_ERR_UNINIT, "gpio is not init!");
83
84 err = xf_hal_driver_close(dev);
85 XF_HAL_GPIO_CHECK(err, err, "deinit failed!");
86
87 return XF_OK;
88}
89
91{
92 xf_err_t err = XF_OK;
93 UNUSED(err);
94
96 xf_hal_gpio_t *dev_gpio = (xf_hal_gpio_t *)dev;
97 XF_HAL_GPIO_CHECK(!dev_gpio, XF_ERR_UNINIT, "gpio is not init!");
98
99#if XF_HAL_LOCK_IS_ENABLE
100 xf_lock_lock(dev_gpio->dev.mutex);
101#endif
102
103 dev_gpio->config.direction = direction;
104
105#if XF_HAL_LOCK_IS_ENABLE
106 xf_lock_unlock(dev_gpio->dev.mutex);
107#endif
108
110 XF_HAL_GPIO_CHECK(err, err, "set direction failed!");
111
112 return XF_OK;
113}
114
116{
117 xf_err_t err = XF_OK;
118 UNUSED(err);
119
121 xf_hal_gpio_t *dev_gpio = (xf_hal_gpio_t *)dev;
122 XF_HAL_GPIO_CHECK(!dev_gpio, XF_ERR_UNINIT, "gpio is not init!");
123
124#if XF_HAL_LOCK_IS_ENABLE
125 xf_lock_lock(dev_gpio->dev.mutex);
126#endif
127
128 dev_gpio->config.pull = pull;
129
130#if XF_HAL_LOCK_IS_ENABLE
131 xf_lock_unlock(dev_gpio->dev.mutex);
132#endif
133
134 err = xf_hal_driver_ioctl(dev, XF_HAL_GPIO_CMD_PULL, &dev_gpio->config);
135 XF_HAL_GPIO_CHECK(err, err, "set pull failed!");
136
137 return XF_OK;
138}
139
141{
142 xf_err_t err = XF_OK;
143 UNUSED(err);
144
146 xf_hal_gpio_t *dev_gpio = (xf_hal_gpio_t *)dev;
147 XF_HAL_GPIO_CHECK(!dev_gpio, XF_ERR_UNINIT, "gpio is not init!");
148
149#if XF_HAL_LOCK_IS_ENABLE
150 xf_lock_lock(dev_gpio->dev.mutex);
151#endif
152
153 dev_gpio->config.speed = speed;
154
155#if XF_HAL_LOCK_IS_ENABLE
156 xf_lock_unlock(dev_gpio->dev.mutex);
157#endif
158
159 err = xf_hal_driver_ioctl(dev, XF_HAL_GPIO_CMD_SPEED, &dev_gpio->config);
160 XF_HAL_GPIO_CHECK(err, err, "set speed failed!");
161
162 return XF_OK;
163}
164
166{
167 xf_err_t err = XF_OK;
168 UNUSED(err);
169
171 xf_hal_gpio_t *dev_gpio = (xf_hal_gpio_t *)dev;
172 XF_HAL_GPIO_CHECK(!dev_gpio, XF_ERR_UNINIT, "gpio is not init!");
173
174#if XF_HAL_LOCK_IS_ENABLE
175 xf_lock_lock(dev_gpio->dev.mutex);
176#endif
177
178 dev_gpio->config.cb.callback = callback;
179 dev_gpio->config.cb.user_data = user_data;
180
181#if XF_HAL_LOCK_IS_ENABLE
182 xf_lock_unlock(dev_gpio->dev.mutex);
183#endif
184
185 err = xf_hal_driver_ioctl(dev, XF_HAL_GPIO_CMD_INTR_CB, &dev_gpio->config);
186 XF_HAL_GPIO_CHECK(err, err, "set callback failed!");
187
188 return XF_OK;
189}
190
192{
193 xf_err_t err = XF_OK;
194 UNUSED(err);
195
197 xf_hal_gpio_t *dev_gpio = (xf_hal_gpio_t *)dev;
198 XF_HAL_GPIO_CHECK(!dev_gpio, XF_ERR_UNINIT, "gpio is not init!");
199
200#if XF_HAL_LOCK_IS_ENABLE
201 xf_lock_lock(dev_gpio->dev.mutex);
202#endif
203
204 dev_gpio->config.isr.callback = callback;
205 dev_gpio->config.isr.user_data = user_data;
206
207#if XF_HAL_LOCK_IS_ENABLE
208 xf_lock_unlock(dev_gpio->dev.mutex);
209#endif
210
212 XF_HAL_GPIO_CHECK(err, err, "set isr failed!");
213
214 return XF_OK;
215}
216
218{
219 xf_err_t err = XF_OK;
220 UNUSED(err);
221
223 xf_hal_gpio_t *dev_gpio = (xf_hal_gpio_t *)dev;
224 XF_HAL_GPIO_CHECK(!dev_gpio, XF_ERR_UNINIT, "gpio is not init!");
225
226#if XF_HAL_LOCK_IS_ENABLE
227 xf_lock_lock(dev_gpio->dev.mutex);
228#endif
229
230 dev_gpio->config.intr_type = intr_type;
231
232#if XF_HAL_LOCK_IS_ENABLE
233 xf_lock_unlock(dev_gpio->dev.mutex);
234#endif
235
237 XF_HAL_GPIO_CHECK(err, err, "set intr type failed!");
238
239 return XF_OK;
240}
241
243{
244 xf_err_t err = XF_OK;
245 UNUSED(err);
246
248 xf_hal_gpio_t *dev_gpio = (xf_hal_gpio_t *)dev;
249 XF_HAL_GPIO_CHECK(!dev_gpio, XF_ERR_UNINIT, "gpio is not init!");
250
251#if XF_HAL_LOCK_IS_ENABLE
252 xf_lock_lock(dev_gpio->dev.mutex);
253#endif
254
255 dev_gpio->config.intr_enable = true;
256
257#if XF_HAL_LOCK_IS_ENABLE
258 xf_lock_unlock(dev_gpio->dev.mutex);
259#endif
260
262 XF_HAL_GPIO_CHECK(err, err, "irq enable failed!");
263
264 return XF_OK;
265}
266
268{
269 xf_err_t err = XF_OK;
270 UNUSED(err);
271
273 xf_hal_gpio_t *dev_gpio = (xf_hal_gpio_t *)dev;
274 XF_HAL_GPIO_CHECK(!dev_gpio, XF_ERR_UNINIT, "gpio is not init!");
275
276#if XF_HAL_LOCK_IS_ENABLE
277 xf_lock_lock(dev_gpio->dev.mutex);
278#endif
279
280 dev_gpio->config.intr_enable = false;
281
282#if XF_HAL_LOCK_IS_ENABLE
283 xf_lock_unlock(dev_gpio->dev.mutex);
284#endif
285
287 XF_HAL_GPIO_CHECK(err, err, "irq disable failed!");
288
289 return XF_OK;
290}
291
293{
294 xf_err_t err = XF_OK;
295 UNUSED(err);
296
298 XF_HAL_GPIO_CHECK(!dev, XF_ERR_UNINIT, "gpio is not init!");
299
300 err = xf_hal_driver_write(dev, &level, 1);
301 // 此处返回正错误码(-err)即可,无需像其他真正的读写那样返回负值错误码
302 XF_HAL_GPIO_CHECK(err < XF_OK, -err, "gpio write failed!");
303
304 return err;
305}
306
308{
309 xf_err_t err = XF_OK;
310 UNUSED(err);
311 bool level = 0;
312
314 XF_HAL_GPIO_CHECK(!dev, XF_ERR_UNINIT, "gpio is not init!");
315
316 err = xf_hal_driver_read(dev, &level, 1);
317 XF_HAL_GPIO_CHECK(err < XF_OK, 0, "gpio read failed!");
318
319 return level;
320}
321/* ==================== [Static Functions] ================================== */
322
324{
325 xf_err_t err = XF_OK;
326 xf_hal_dev_t *dev = NULL;
327 xf_hal_gpio_t *dev_gpio = (xf_hal_gpio_t *)xf_malloc(sizeof(xf_hal_gpio_t));
328 XF_ASSERT(dev_gpio, NULL, TAG, "memory alloc failed!");
329
330 dev = (xf_hal_dev_t *)dev_gpio;
331
332 err = xf_hal_driver_open(dev, XF_HAL_GPIO_TYPE, gpio_num);
333
334 if (err) {
335 XF_LOGE(TAG, "open failed!");
336 xf_free(dev);
337 dev = NULL;
338 }
339
340 return dev;
341}
342
343#endif
344
xf_err_t xf_hal_gpio_set_pull(xf_gpio_num_t gpio_num, xf_hal_gpio_pull_t pull)
gpio 设置上下拉模式。
bool xf_hal_gpio_get_level(xf_gpio_num_t gpio_num)
获取 gpio 电平高低。
xf_err_t xf_hal_gpio_set_level(xf_gpio_num_t gpio_num, bool level)
设置 gpio 设置电平高低。
enum _xf_hal_gpio_intr_type_t xf_hal_gpio_intr_type_t
gpio 的中断类型。
xf_err_t xf_hal_gpio_set_intr_disable(xf_gpio_num_t gpio_num)
设置 gpio 禁用中断。
xf_err_t xf_hal_gpio_set_intr_type(xf_gpio_num_t gpio_num, xf_hal_gpio_intr_type_t intr_type)
设置 gpio 中断类型。
xf_err_t xf_hal_gpio_set_intr_isr(xf_gpio_num_t gpio_num, xf_hal_gpio_irq_cb_t callback, void *user_data)
gpio 设置中断服务。
enum _xf_hal_gpio_pull_t xf_hal_gpio_pull_t
gpio 的上下拉。
enum _xf_hal_gpio_dir_t xf_hal_gpio_dir_t
gpio 的方向。
xf_err_t xf_hal_gpio_set_direction(xf_gpio_num_t gpio_num, xf_hal_gpio_dir_t direction)
gpio 设置方向。
Definition xf_hal_gpio.c:90
xf_err_t xf_hal_gpio_deinit(xf_gpio_num_t gpio_num)
gpio 反初始化。恢复到未初始化状态且回收相关资源。
Definition xf_hal_gpio.c:76
uint32_t xf_gpio_num_t
gpio 序号。
Definition xf_hal_gpio.h:44
xf_err_t xf_hal_gpio_set_intr_enable(xf_gpio_num_t gpio_num)
设置 gpio 启用中断。
xf_err_t xf_hal_gpio_set_speed(xf_gpio_num_t gpio_num, uint32_t speed)
gpio 速度设置。
xf_err_t xf_hal_gpio_set_intr_cb(xf_gpio_num_t gpio_num, xf_hal_gpio_irq_cb_t callback, void *user_data)
gpio 设置中断回调。
xf_err_t xf_hal_gpio_init(xf_gpio_num_t gpio_num, xf_hal_gpio_dir_t direction)
gpio 初始化函数。使用 gpio 之前必须要进行初始化。
Definition xf_hal_gpio.c:50
void(* xf_hal_gpio_irq_cb_t)(xf_gpio_num_t gpio_num, bool level, void *user_data)
gpio 中断回调函数原型。
Definition xf_hal_gpio.h:57
@ XF_HAL_GPIO_CMD_PULL
@ XF_HAL_GPIO_CMD_INTR_ENABLE
@ XF_HAL_GPIO_CMD_INTR_ISR
@ XF_HAL_GPIO_CMD_SPEED
@ XF_HAL_GPIO_CMD_DIRECTION
@ XF_HAL_GPIO_CMD_INTR_CB
@ XF_HAL_GPIO_CMD_INTR_TYPE
#define XF_ASSERT(condition, retval, tag, format,...)
xfusion 断言宏(条件 不成立 时则输出日志后返回)。
Definition xf_check.h:150
int32_t xf_err_t
整形错误类型。 错误码具体值见 xf_err_code_t.
Definition xf_err.h:69
@ XF_OK
Definition xf_err.h:43
@ XF_ERR_NOT_FOUND
Definition xf_err.h:50
@ XF_ERR_UNINIT
Definition xf_err.h:54
int xf_lock_unlock(xf_lock_t lock)
解锁.
Definition xf_lock.c:88
int xf_lock_lock(xf_lock_t lock)
锁定直至成功.
Definition xf_lock.c:72
#define xf_malloc(x)
Definition xf_stdlib.h:38
#define xf_free(x)
Definition xf_stdlib.h:39
gpio 配置结构体。用于对接 gpio 设置的参数。
xf_hal_gpio_callback_t isr
xf_hal_gpio_callback_t cb
xf_hal_gpio_irq_cb_t callback
xf_hal_dev_t dev
Definition xf_hal_gpio.c:28
xf_hal_gpio_config_t config
Definition xf_hal_gpio.c:29
xf_err_t xf_hal_driver_close(xf_hal_dev_t *dev)
Definition xf_hal_dev.c:192
int xf_hal_driver_read(xf_hal_dev_t *dev, void *buf, size_t count)
Definition xf_hal_dev.c:168
xf_err_t xf_hal_driver_ioctl(xf_hal_dev_t *dev, uint32_t cmd, void *config)
Definition xf_hal_dev.c:154
xf_err_t xf_hal_driver_open(xf_hal_dev_t *dev, xf_hal_type_t type, uint32_t id)
Definition xf_hal_dev.c:118
int xf_hal_driver_write(xf_hal_dev_t *dev, const void *buf, size_t count)
Definition xf_hal_dev.c:180
xf_hal_dev_t * xf_hal_device_find(xf_hal_type_t type, uint32_t id)
Definition xf_hal_dev.c:238
xf_err_t xf_hal_driver_register(xf_hal_type_t type, xf_hal_flag_t flag, xf_hal_dev_create_t constructor, const xf_driver_ops_t *driver_ops)
Definition xf_hal_dev.c:44
xf_hal_dev_t * xf_hal_driver_create(xf_hal_type_t type, uint32_t id)
Definition xf_hal_dev.c:93
@ XF_HAL_FLAG_READ_WRITE
Definition xf_hal_dev.h:54
xf_err_t xf_hal_gpio_register(const xf_driver_ops_t *driver_ops)
gpio 设备注册。
Definition xf_hal_gpio.c:45
static xf_hal_dev_t * gpio_constructor(xf_gpio_num_t gpio_num)
struct _xf_hal_gpio_t xf_hal_gpio_t
#define XF_HAL_GPIO_CHECK(condition, retval, format,...)
Definition xf_hal_gpio.c:40
#define XF_HAL_GPIO_TYPE
Definition xf_hal_gpio.c:23
#define TAG
Definition xf_hal_gpio.c:22
xf_hal 的 gpio(通用输入输出) 设备抽象。
#define XF_LOGE(tag, format,...)
#define UNUSED(_x)