驱动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");
相关推荐
Initialize-le3 小时前
Nginx 504 超时、499 一堆?网关排查法
运维·nginx
Android系统攻城狮5 小时前
Linux Gstreamer深度解析之gst_audio_ring_buffer_delay调用流程与实战(七十二)
linux·运维·服务器·gstreamer音视频·音视频进阶
快乐的韭菜根根5 小时前
ubuntu 安装slurm并配置
linux·运维·ubuntu
U-Mail邮件系统6 小时前
自建邮箱服务器有哪些软件?三款主流邮件服务器软件推荐
运维·服务器
倒头就睡的小比特7 小时前
Linux基础指令3
linux·服务器
天远数科8 小时前
零信任架构实战:基于天远贷前风险报告构建自动化消金信贷风控与多头共债排查网关
运维·人工智能·架构·自动化
梦帮科技8 小时前
Kali Linux Scapy 畸形报文构造学——深度解剖非法 TCP Flags 与反常序列号
linux·爬虫·神经网络·算法·数学建模·系统架构·模拟退火算法
半杯咖啡半行码9 小时前
Linux 驱动开发入门:内核模块编程基础
linux·服务器·网络
别动我齐刘海9 小时前
Linux 系统调试学习2
linux·运维·c++·人工智能·学习·机器学习·机器人
龙虾电话9 小时前
语音机器人打断不进去:VAD 双阈值迟滞里一个共用的 bool,和它引发的连锁误判
linux