【day8】驱动

作业:通过GPIO子系统编写LED灯的驱动,应用程序测试
在led驱动中设置一个定时器,实现底板三盏灯一秒亮一秒灭
1.找引脚
led1---->gpioz组5号引脚
led2---->gpioz组6号引脚
led3---->gpioz组7号引脚
【day8】驱动_第1张图片
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 
#include 
#include 
#include 
#include 
#include 
/*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");

现象:

【day8】驱动_第2张图片

你可能感兴趣的:(linux,驱动开发,c语言)