Pin驱动框架
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设备驱动框架的添加
↓ 点击“阅读原文”