【驱动开发】基于GPIO子系统编写LED驱动,编写应用程序进行测试设置定时器,5秒钟打印一次hello world

基于GPIO子系统编写LED驱动,编写应用程序进行测试,设置定时器,5秒钟打印一次hello world

驱动程序:

cpp 复制代码
#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 timer_list mytimer;
struct device_node *dnode;
int gpiono1, gpiono2, gpiono3;

// 定时器处理函数
int n = 1;
int count = 0;
int trigger_count = 5;
void mytimer_function(struct timer_list *timer)
{
    count++;
    if (count == trigger_count)
    {
        printk("Hello World\n");
        count = 0;
    }
    mod_timer(timer, jiffies + 5 * HZ);

    switch (n)
    {
    case 1:
        gpio_set_value(gpiono1, !gpio_get_value(gpiono1));
        n++;
        break;
    case 2:
        gpio_set_value(gpiono2, !gpio_get_value(gpiono2));
        n++;
        break;
    case 3:
        gpio_set_value(gpiono3, !gpio_get_value(gpiono3));
        n = 1;
        break;
    default:
        break;
    }
    mod_timer(timer, jiffies + HZ);
}

int gpio_led1(int gpiono, struct device_node *dnode)
{
    // 根据设备树节点解析gpio编号
    gpiono = of_get_named_gpio(dnode, "led1-gpio", 0);
    if (gpiono < 0)
    {
        printk("解析led1_gpio编号失败\n");
        return -EIO;
    }
    printk("解析led1_gpio编号成功\n");
    // 申请gpio编号
    gpio_request(gpiono, NULL);
    // 设置gpio为输出并且初始化数值为0
    gpio_direction_output(gpiono, 0);
    return gpiono;
}

int gpio_led2(int gpiono, struct device_node *dnode)
{
    // 根据设备树节点解析gpio编号
    gpiono = of_get_named_gpio(dnode, "led2-gpio", 0);
    if (gpiono < 0)
    {
        printk("解析led2_gpio编号失败\n");
        return -EIO;
    }
    printk("解析led2_gpio编号成功\n");
    // 申请gpio编号
    gpio_request(gpiono, NULL);
    // 设置gpio为输出并且初始化数值为0
    gpio_direction_output(gpiono, 0);
    return gpiono;
}

int gpio_led3(int gpiono, struct device_node *dnode)
{
    // 根据设备树节点解析gpio编号
    gpiono = of_get_named_gpio(dnode, "led3-gpio", 0);
    if (gpiono < 0)
    {
        printk("解析led3_gpio编号失败\n");
        return -EIO;
    }
    printk("解析led3_gpio编号成功\n");
    // 申请gpio编号
    gpio_request(gpiono, NULL);
    // 设置gpio为输出并且初始化数值为0
    gpio_direction_output(gpiono, 0);
    return gpiono;
}

static int __init mycdev_init(void)
{
    // 解析设备树节点信息
    dnode = of_find_node_by_path("/myled");
    if (dnode == NULL)
    {
        printk("解析设备树节点失败\n");
        return -ENXIO;
    }
    gpiono1 = gpio_led1(gpiono1, dnode);
    gpiono2 = gpio_led2(gpiono2, dnode);
    gpiono3 = gpio_led3(gpiono3, dnode);
    // 初始化定时器对象
    timer_setup(&mytimer, mytimer_function, 0);
    mytimer.expires = jiffies + HZ; // 定时1s
    // 注册定时器
    add_timer(&mytimer);
    return 0;
}

static void __exit mycdev_exit(void)
{
    //注销定时器
    del_timer(&mytimer);
    gpiod_set_value(gpiono1,0);
    //释放GPIO编号
    gpiod_put(gpiono1);

    //注销定时器
    del_timer(&mytimer);
    gpiod_set_value(gpiono2,0);
    //释放GPIO编号
    gpiod_put(gpiono2);

    //注销定时器
    del_timer(&mytimer);
    gpiod_set_value(gpiono3,0);
    //释放GPIO编号
    gpiod_put(gpiono3);
}
module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");
相关推荐
mg6689 小时前
安卓玩机工具----告别面具!SukiSU Ultra 内核级 Root 与终极隐藏实战指南
驱动开发·root系统
共享家952710 小时前
408 操作系统第一章
服务器·数据库·windows
Sakura_j_h_12 小时前
GitHub Actions 打包 Windows exe:中文编码与产物上传
windows·ci/cd·打包发布·github·pyinstaller·github actions
xixiaoyunya15 小时前
搭一个浏览器即用的二进制文件分发点:目录规范与权限边界实践
网络·windows
麻瓜code15 小时前
Spring AI 全模块 API 字典一览(1.1.0 版)
人工智能·windows·spring
zrc00700717 小时前
steam无法登录 steam错误 登录时出现错误。请稍后再试。解决办法 steam无法登录解决办法 湖南地区steam DNS问题解决办法
windows·经验分享·游戏·缓存·游戏程序·创业创新·玩游戏
BK贝壳18 小时前
布尔队列 BHA_Queue:入队出队均摊 O(1);附 BHA_Dict
windows
-星空下无敌18 小时前
Windows Docker K8s 安装部署Naocs ,SpringBoot 3.x 4.x 整合Naocs 版本兼容 配置中心、服务注册与发现
windows·docker·nacos·kubernetes·springboot·alibaba
燃烧的枫18 小时前
Windows 下 YOLO11 Pose 的 TensorRT C++ 部署
windows·yolo·tensorrt·1024程序员节·yolo11-pose
深圳恒讯20 小时前
香港云主机硬盘满了怎么办?Linux和Windows在线扩容操作教程
linux·运维·windows