【驱动开发】基于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

相关文章

如何设置vim永久显示行号

《如何设置vim永久显示行号》在Linux环境下,vim默认不显示行号,这在程序编译出错时定位错误语句非常不便,通过修改vim配置文件vimrc,可以在每次打开vim时永久显示行号... 目录设置vim永久显示行号1.临时显示行号2.永www.chinasem.cn久显示行号总结设置vim永久显示行号在li

Linux:alias如何设置永久生效

《Linux:alias如何设置永久生效》在Linux中设置别名永久生效的步骤包括:在/root/.bashrc文件中配置别名,保存并退出,然后使用source命令(或点命令)使配置立即生效,这样,别... 目录linux:alias设置永久生效步骤保存退出后功能总结Linux:alias设置永久生效步骤

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

利用Python编写一个简单的聊天机器人

《利用Python编写一个简单的聊天机器人》这篇文章主要为大家详细介绍了如何利用Python编写一个简单的聊天机器人,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 使用 python 编写一个简单的聊天机器人可以从最基础的逻辑开始,然后逐步加入更复杂的功能。这里我们将先实现一个简单的

基于Python开发电脑定时关机工具

《基于Python开发电脑定时关机工具》这篇文章主要为大家详细介绍了如何基于Python开发一个电脑定时关机工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 简介2. 运行效果3. 相关源码1. 简介这个程序就像一个“忠实的管家”,帮你按时关掉电脑,而且全程不需要你多做

Spring MVC如何设置响应

《SpringMVC如何设置响应》本文介绍了如何在Spring框架中设置响应,并通过不同的注解返回静态页面、HTML片段和JSON数据,此外,还讲解了如何设置响应的状态码和Header... 目录1. 返回静态页面1.1 Spring 默认扫描路径1.2 @RestController2. 返回 html2

使用Python进行文件读写操作的基本方法

《使用Python进行文件读写操作的基本方法》今天的内容来介绍Python中进行文件读写操作的方法,这在学习Python时是必不可少的技术点,希望可以帮助到正在学习python的小伙伴,以下是Pyth... 目录一、文件读取:二、文件写入:三、文件追加:四、文件读写的二进制模式:五、使用 json 模块读写