Pin驱动框架

以NXP MCXA153为例
PIN设备驱动层
单纯的提供接口给应用层用,其中PIN设备驱动框架接口包含rt_pin_read等,具体在pin.c 文件中查看
pin.c是提供应用接口
drv_gpio.c是具体实现
实现操作方法原理
struct rt_pin_ops{ void (*pin_mode)(struct rt_device *device, rt_base_t pin, rt_uint8_t mode); void (*pin_write)(struct rt_device *device, rt_base_t pin, rt_uint8_t value); rt_ssize_t (*pin_read)(struct rt_device *device, rt_base_t pin); rt_err_t (*pin_attach_irq)(struct rt_device *device, rt_base_t pin, rt_uint8_t mode, void (*hdr)(void *args), void *args); rt_err_t (*pin_detach_irq)(struct rt_device *device, rt_base_t pin); rt_err_t (*pin_irq_enable)(struct rt_device *device, rt_base_t pin, rt_uint8_t enabled); rt_base_t (*pin_get)(const char *name);#ifdef RT_USING_DM rt_err_t (*pin_irq_mode)(struct rt_device *device, rt_base_t pin, rt_uint8_t mode); rt_ssize_t (*pin_parse)(struct rt_device *device, struct rt_ofw_cell_args *args, rt_uint32_t *flags);#endif#ifdef RT_USING_PINCTRL rt_err_t (*pin_ctrl_confs_apply)(struct rt_device *device, void *fw_conf_np);#endif /* RT_USING_PINCTRL */};
rt_pin_ops 成员介绍
pin_mode
引脚初始化
pin_write
引脚写
pin_read
引脚读
pin_attach_irq
中断操作 为某个引脚绑定一个中断回调函数,使能中断,当中断来时调用该函数
pin_detach_irq
中断操作 脱离某个引脚的中断回调函数
pin_irq_enable
中断操作 开启或关闭中断
pin_get
获取某个pin脚编号
pin_irq_mode
pin_parse
pin_ctrl_confs_apply
引脚编号
#define GET_GPIO_PORT(x) ((x) / 32)#defineGET_GPIO_PIN(x)((x)%32)
rt_pin_ops 赋值
rt_hw_pin_init(){ int ret = RT_EOK; mcx_pin_ops.pin_mode = mcx_pin_mode; mcx_pin_ops.pin_read = mcx_pin_read; mcx_pin_ops.pin_write = mcx_pin_write; mcx_pin_ops.pin_attach_irq = mcx_pin_attach_irq; mcx_pin_ops.pin_detach_irq = mcx_pin_detach_irq; mcx_pin_ops.pin_irq_enable = mcx_pin_irq_enable; mcx_pin_ops.pin_get = RT_NULL, ret = rt_device_pin_register("pin", &mcx_pin_ops, RT_NULL);// return ret;}INIT_BOARD_EXPORT(rt_hw_pin_init);
注意:这里的操作很奇怪INIT_BOARD_EXPORT ,根据老师的讲解是在预编译的时候就处理了,具体后面再学习。。。
drv_pin.c 的 rt_hw_pin_init 将底层驱动和驱动框架进行链接起来,此文件实现gpio的初始化
添加Pin驱动代码流程
编写drv_pin.c文件
实现 rt_pin_ops 的各种操作接口函数
然后利用 rt_hw_pin_init 进行链接驱动层
实际上就是指针的赋值
实验代码
rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT); /* Set GPIO as Output */rt_pin_mode(KEY_BAND, PIN_MODE_INPUT);rt_kprintf("MCXA153 HelloWorld\r\n");while (1){ rt_thread_mdelay(1000); if(rt_pin_read(KEY_BAND)) rt_pin_write(LED_PIN, PIN_HIGH); /* Set GPIO output 1 */ else rt_pin_write(LED_PIN, PIN_LOW); /* Set GPIO output 0 */ #if 0 rt_pin_write(LED_PIN, PIN_HIGH); /* Set GPIO output 1 */ rt_thread_mdelay(500); /* Delay 500mS */ rt_pin_write(LED_PIN, PIN_LOW); /* Set GPIO output 0 */ rt_thread_mdelay(500); /* Delay 500mS */ #endif}
注意:这里延迟1s,目的是为了有msh 功能
总结
学习了PIN设备驱动框架的添加
-
驱动
+关注
关注
12文章
1927浏览量
88184 -
PIN
+关注
关注
1文章
317浏览量
26438 -
RT-Thread
+关注
关注
32文章
1540浏览量
44249
发布评论请先 登录
RT-Thread NUC97x 移植 LVGL
RT-Thread编程指南
RT-Thread用户手册
RT-Thread Studio驱动SD卡
【RT-Thread开源作品秀】基于RT-Thread的星务平台研究
RT-Thread学习笔记 RT-Thread的架构概述
RT-Thread文档_RT-Thread 潘多拉 STM32L475 上手指南
《RT-Thread设备驱动开发指南》基础篇--以先楫bsp的hwtimer设备为例

RT-Thread PIN驱动添加
评论