驱动DAY8

复制代码
#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>
/*       myled
    {
        led1-gpio=<&gpioe 10 0>;
        led2-gpio=<&gpiof 10 0>;
        led3-gpio=<&gpioe 8 0>;
    };
*/
struct device_node *dnode;
struct gpio_desc *gpiono;
struct gpio_desc *gpiono2;
struct gpio_desc *gpiono3;
struct timer_list mytimer;
struct timer_list mytimer2;
void mytimer_function(struct timer_list *timer)
{
    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);
}

void mytimer_function2(struct timer_list *timer2)
{
    printk("hello world\n");
    mod_timer(timer2, jiffies + HZ*5);
}

static int __init mycdev_init(void)
{
    // 解析设备树节点信息
    dnode = of_find_node_by_path("/myled");
    if (dnode == NULL)
    {
        printk("解析设备树节点失败\n");
        return -ENXIO;
    }

    // 获取LED1 GPIO编号
    gpiono = gpiod_get_from_of_node(dnode, "led1-gpio", 0, GPIOD_OUT_LOW, NULL);
    if (IS_ERR(gpiono))
    {
        printk("申请gpio信息失败\n");
        return -PTR_ERR(gpiono);
    }
    // 灯亮
    //gpiod_set_value(gpiono, 1);

    // 获取LED2 GPIO编号
    gpiono2 = gpiod_get_from_of_node(dnode, "led2-gpio", 0, GPIOD_OUT_LOW, NULL);
    if (IS_ERR(gpiono2))
    {
        printk("申请gpio信息失败\n");
        return -PTR_ERR(gpiono2);
    }
    // 灯亮
    //gpiod_set_value(gpiono2, 1);

    // 获取LED3 GPIO编号
    gpiono3 = gpiod_get_from_of_node(dnode, "led3-gpio", 0, GPIOD_OUT_LOW, NULL);
    if (IS_ERR(gpiono3))
    {
        printk("申请gpio信息失败\n");
        return -PTR_ERR(gpiono3);
    }
    // 灯亮
    //gpiod_set_value(gpiono3, 1);
    timer_setup(&mytimer, mytimer_function, 0);
    mytimer.expires = jiffies + HZ;
    add_timer(&mytimer);

    timer_setup(&mytimer2, mytimer_function2, 0);
    mytimer2.expires = jiffies + 5*HZ;
    add_timer(&mytimer2);
    return 0;
}
static void __exit mycdev_exit(void)
{
    del_timer(&mytimer);
    del_timer(&mytimer2);
    gpiod_set_value(gpiono, 0);
    // 释放GPIO编号
    gpiod_put(gpiono);
    gpiod_set_value(gpiono2, 0);
    // 释放GPIO编号
    gpiod_put(gpiono2);
    gpiod_set_value(gpiono3, 0);
    // 释放GPIO编号
    gpiod_put(gpiono3);
}
module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");
相关推荐
且从容.3 小时前
Ubuntu安装flume
linux·ubuntu·flume
承渊政道3 小时前
Linux网络学习【Reactor反应堆模式】
linux·网络·学习·ubuntu·reactor
讯捷蓝达5 小时前
戴尔R720xd服务器卡死在 “Configuring Memory...Done“,换了内存还是卡?问题根本不在内存
运维·服务器
且从容.6 小时前
ubuntu安装flink
linux·ubuntu·flink
爱和冰阔落7 小时前
【Linux网络】TCP 服务器如何并发处理多个客户端?从 fork、僵尸进程到双重 fork
linux·运维·服务器·网络
程序员沉梦听雨7 小时前
WSL2的安装与使用
linux·wsl
微小的鱼8 小时前
Linux的渲染与显示系统链路
android·java·linux
csdn_aspnet8 小时前
Redis 入门:Windows、Mac安装指南
数据库·windows·redis·缓存·mac
lisanmengmeng8 小时前
alertmanger 标签 rules 打上分组标签
linux·运维·服务器
Android系统攻城狮9 小时前
Linux FFmpeg深度解析之av_write_frame调用流程与实战(三十三)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频