驱动程序
#include <linux/init.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/timer.h>
/*
//添加自定义led灯的设备树结点
myleds{
myled1=<&gpioe 10 0>; //应用gpioe控制器节点 0表示默认
myled2=<&gpioe 8 0>;
myled3=<&gpiof 10 0>;
};
*/
struct gpio_desc *gpiono;
struct gpio_desc *gpiono2;
struct gpio_desc *gpiono3;
struct device_node *dnode;
//定义定时器结构体对象
struct timer_list mytimer;
//定义定时器回调函数
void mytimer_function(struct timer_list* timer)
{
//让gpio管脚输出与上一次相反的电平
gpiod_set_value(gpiono,!gpiod_get_value(gpiono));
gpiod_set_value(gpiono2,!gpiod_get_value(gpiono2));
gpiod_set_value(gpiono3,!gpiod_get_value(gpiono3));
//再次起用定时器
mod_timer(timer,jiffies+HZ);
}
static int __init mycdev_init(void)
{
//初始化定时器结构体成员
mytimer.expires=jiffies+HZ; //定时1秒
timer_setup(&mytimer,mytimer_function,0);
//注册并启用定时器
add_timer(&mytimer);
//解析myleds设备树节点
dnode=of_find_node_by_name(NULL,"myleds");
if(dnode==NULL)
{
printk("解析myleds设备树失败\n");
return -1;
}
//基于设备树节点解析led1的新版gpio对象
gpiono=gpiod_get_from_of_node(dnode,"myled1",0,GPIOD_OUT_LOW,NULL);
if(IS_ERR(gpiono))
{
printk("基于设备树节点解析led1的gpio编号失败\n");
return PTR_ERR(gpiono);
}
printk("基于设备树节点解析led1的gpio编号成功\n");
//设置方向为输出并出初始化为低电平
gpiod_direction_output(gpiono,0);
//基于设备树节点解析led1的新版gpio对象
gpiono2=gpiod_get_from_of_node(dnode,"myled2",0,GPIOD_OUT_LOW,NULL);
if(IS_ERR(gpiono2))
{
printk("基于设备树节点解析led2的gpio编号失败\n");
return PTR_ERR(gpiono2);
}
printk("基于设备树节点解析led2的gpio编号成功\n");
//设置方向为输出并出初始化为低电平
gpiod_direction_output(gpiono2,0);
//基于设备树节点解析led1的新版gpio对象
gpiono3=gpiod_get_from_of_node(dnode,"myled3",0,GPIOD_OUT_LOW,NULL);
if(IS_ERR(gpiono3))
{
printk("基于设备树节点解析led3的gpio编号失败\n");
return PTR_ERR(gpiono3);
}
printk("基于设备树节点解析led3的gpio编号成功\n");
//设置方向为输出并出初始化为低电平
gpiod_direction_output(gpiono3,0);
return 0;
}
static void __exit mycdev_exit(void)
{
//关灯
gpiod_set_value(gpiono,0);
gpiod_set_value(gpiono2,0);
gpiod_set_value(gpiono3,0);
//释放gpio编号
gpiod_put(gpiono);
gpiod_put(gpiono2);
gpiod_put(gpiono3);
//注销定时器对象
del_timer(&mytimer);
}
module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");
效果: