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

本文主要是介绍【驱动开发】基于GPIO子系统编写LED驱动,编写应用程序进行测试设置定时器,5秒钟打印一次hello world,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

驱动程序:

#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为输出并且初始化数值为0gpio_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为输出并且初始化数值为0gpio_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为输出并且初始化数值为0gpio_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");

 

这篇关于【驱动开发】基于GPIO子系统编写LED驱动,编写应用程序进行测试设置定时器,5秒钟打印一次hello world的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/298033

相关文章

PyCharm如何设置新建文件默认为LF换行符

《PyCharm如何设置新建文件默认为LF换行符》:本文主要介绍PyCharm如何设置新建文件默认为LF换行符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录PyCharm设置新建文件默认为LF换行符设置换行符修改换行符总结PyCharm设置新建文件默认为LF

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

Python使用date模块进行日期处理的终极指南

《Python使用date模块进行日期处理的终极指南》在处理与时间相关的数据时,Python的date模块是开发者最趁手的工具之一,本文将用通俗的语言,结合真实案例,带您掌握date模块的六大核心功能... 目录引言一、date模块的核心功能1.1 日期表示1.2 日期计算1.3 日期比较二、六大常用方法详

Python使用DrissionPage中ChromiumPage进行自动化网页操作

《Python使用DrissionPage中ChromiumPage进行自动化网页操作》DrissionPage作为一款轻量级且功能强大的浏览器自动化库,为开发者提供了丰富的功能支持,本文将使用Dri... 目录前言一、ChromiumPage基础操作1.初始化Drission 和 ChromiumPage

Linux上设置Ollama服务配置(常用环境变量)

《Linux上设置Ollama服务配置(常用环境变量)》本文主要介绍了Linux上设置Ollama服务配置(常用环境变量),Ollama提供了多种环境变量供配置,如调试模式、模型目录等,下面就来介绍一... 目录在 linux 上设置环境变量配置 OllamPOgxSRJfa手动安装安装特定版本查看日志在

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

Springboot如何配置Scheduler定时器

《Springboot如何配置Scheduler定时器》:本文主要介绍Springboot如何配置Scheduler定时器问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Springboot配置Scheduler定时器1.在启动类上添加 @EnableSchedulin

Jackson库进行JSON 序列化时遇到了无限递归(Infinite Recursion)的问题及解决方案

《Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursion)的问题及解决方案》使用Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursi... 目录解决方案‌1. 使用 @jsonIgnore 忽略一个方向的引用2. 使用 @JsonManagedR