作业:通过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;//设置定时1stimer_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");
现象: