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

相关文章

Python38个游戏开发库整理汇总

《Python38个游戏开发库整理汇总》文章介绍了多种Python游戏开发库,涵盖2D/3D游戏开发、多人游戏框架及视觉小说引擎,适合不同需求的开发者入门,强调跨平台支持与易用性,并鼓励读者交流反馈以... 目录PyGameCocos2dPySoyPyOgrepygletPanda3DBlenderFife

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

Python进行JSON和Excel文件转换处理指南

《Python进行JSON和Excel文件转换处理指南》在数据交换与系统集成中,JSON与Excel是两种极为常见的数据格式,本文将介绍如何使用Python实现将JSON转换为格式化的Excel文件,... 目录将 jsON 导入为格式化 Excel将 Excel 导出为结构化 JSON处理嵌套 JSON:

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

PyQt5 GUI 开发的基础知识

《PyQt5GUI开发的基础知识》Qt是一个跨平台的C++图形用户界面开发框架,支持GUI和非GUI程序开发,本文介绍了使用PyQt5进行界面开发的基础知识,包括创建简单窗口、常用控件、窗口属性设... 目录简介第一个PyQt程序最常用的三个功能模块控件QPushButton(按钮)控件QLable(纯文本

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

小白也能轻松上手! 路由器设置优化指南

《小白也能轻松上手!路由器设置优化指南》在日常生活中,我们常常会遇到WiFi网速慢的问题,这主要受到三个方面的影响,首要原因是WiFi产品的配置优化不合理,其次是硬件性能的不足,以及宽带线路本身的质... 在数字化时代,网络已成为生活必需品,追剧、游戏、办公、学习都离不开稳定高速的网络。但很多人面对新路由器

Linux之platform平台设备驱动详解

《Linux之platform平台设备驱动详解》Linux设备驱动模型中,Platform总线作为虚拟总线统一管理无物理总线依赖的嵌入式设备,通过platform_driver和platform_de... 目录platform驱动注册platform设备注册设备树Platform驱动和设备的关系总结在 l