作业:通过GPIO子系统编写LED灯的驱动,应用程序测试
在led驱动中设置一个定时器,实现底板三盏灯一秒亮一秒灭
1.找引脚
led1---->gpioz组5号引脚
led2---->gpioz组6号引脚
led3---->gpioz组7号引脚
2.加设备树节点
//led的设备树节点
leds{
led1-gpio=<&gpioe 10 0>;//10表示当前节点使用gpioe的第10个引脚,0表示对于这个引脚信息按照默认描述
led2-gpio=<&gpiof 10 0>;
led3-gpio=<&gpioe 8 0>;
led4-gpio=<&gpioz 5 0>;
led5-gpio=<&gpioz 6 0>;
led6-gpio=<&gpioz 7 0>;
};
};
3.写驱动
#include <linux/init.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/gpio.h>
#include <linux/timer.h>
/*leds{
led1-gpio=<&gpioe 10 0>;//10表示当前节点使用的时gpioe的第10个管脚 0,表示对于这个管脚信息按照默认描述
led1-gpio=<&gpiof 10 0>;
led1-gpio=<&gpioe 8 0>;
};*/
struct device_node *dev;
struct gpio_desc *gpiono4;
struct gpio_desc *gpiono5;
struct gpio_desc *gpiono6;
//分配定时器对象
struct timer_list mytimer;
//定时器处理函数
void mytimer_handler(struct timer_list *timer)
{
//实现LED456一秒亮一秒灭
gpiod_set_value(gpiono4,!gpiod_get_value(gpiono4));
gpiod_set_value(gpiono5,!gpiod_get_value(gpiono5));
gpiod_set_value(gpiono6,!gpiod_get_value(gpiono6));
//再次启用定时器
mod_timer(timer,jiffies+HZ);
}
static int __init mycdev_init(void)
{
//解析LED设备树节点
dev = of_find_node_by_path("/leds");
if (dev==NULL)
{
printk("解析设备树节点失败\n");
return -ENXIO;
}
printk("解析设备树节点成功\n");
//申请gpio_desc 对象并且设置输出为低电平
gpiono4 = gpiod_get_from_of_node(dev,"led4-gpio",0,GPIOD_OUT_LOW,NULL);
if (IS_ERR(gpiono4))
{
printk("申请gpio对象失败\n");
return -PTR_ERR(gpiono4);
}
printk("申请gpio对象成功\n");
gpiono5 = gpiod_get_from_of_node(dev,"led5-gpio",0,GPIOD_OUT_LOW,NULL);
if (IS_ERR(gpiono5))
{
printk("申请gpio对象失败\n");
return -PTR_ERR(gpiono5);
}
printk("申请gpio对象成功\n");
gpiono6 = gpiod_get_from_of_node(dev,"led6-gpio",0,GPIOD_OUT_LOW,NULL);
if (IS_ERR(gpiono6))
{
printk("申请gpio对象失败\n");
return -PTR_ERR(gpiono6);
}
printk("申请gpio对象成功\n");
//初始化定时器对象
mytimer.expires=jiffies+HZ;//设置定时1s
timer_setup(&mytimer,mytimer_handler,0);
//注册定时器对象
add_timer(&mytimer);
return 0;
}
static void __exit mycdev_exit(void)
{
//注销定时器
del_timer(&mytimer);
//灭灯
gpiod_set_value(gpiono4,0);
gpiod_set_value(gpiono5,0);
gpiod_set_value(gpiono6,0);
gpiod_put(gpiono4);
gpiod_put(gpiono5);
gpiod_put(gpiono6);
}
module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");
现象: