RT-Thread PIN驱动添加

描述

 

 

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)#define GET_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设备驱动框架的添加

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分