当前位置: 首页 > news >正文

基于GPIO子系统编写LED驱动

编写应用程序进行测试

设置定时器,每5秒打印一次hello world

驱动程序

#include <linux/init.h>
#include <linux/module.h>
#include<linux/of.h>
#include<linux/of_gpio.h>
#include<linux/fs.h>
#include<linux/io.h>
#include<linux/gpio.h>
/*       myled{led1-gpio=<&gpioe 10 0>; led2-gpio=<&gpiof 10 0>;led3-gpio=<&gpioe 8 0>;           }; 
*/
struct device_node *dnode;
unsigned int gpiono;
unsigned int gpiono2;
unsigned int gpiono3;
struct timer_list mytimer;
char kbuf[128]={0};
int major;//定时器处理函数void mytimer_function(struct timer_list *timer){//打印printk("hello world\n");//再次启用定时器mod_timer(timer,jiffies+5*HZ);}ssize_t mycdev_write(struct file *file, const char  *ubuf, size_t size, loff_t *lof)
{int net = copy_from_user(kbuf, ubuf, size);if (net){printk("copy_from_user filed\n");return -EIO;}switch(kbuf[0]){case '1'://LED1if(kbuf[1]=='0')//关灯           gpio_set_value(gpiono,0);else//灯亮gpio_set_value(gpiono,1);break;case '2'://LED2if(kbuf[1]=='0')//关灯gpio_set_value(gpiono2,0);else//灯亮gpio_set_value(gpiono2,1);break;case '3'://LED3if(kbuf[1]=='0')//关灯gpio_set_value(gpiono3,0);else//灯亮gpio_set_value(gpiono3,1);break;}return 0;
}struct file_operations fops={.write=mycdev_write,
};static int __init mycdev_init(void)
{//字符设备驱动注册major=register_chrdev(0,"mychrdev",&fops);if(major<0){printk("字符设备驱动注册失败\n");return major;}printk("字符设备驱动注册成功:major=%d\n",major);//解析设备树节点信息dnode=of_find_node_by_path("/myled");if(dnode==NULL){printk("解析设备树节点失败\n");return -ENXIO;}//获取LED1 GPIO编号gpiono=of_get_named_gpio(dnode,"led1-gpio",0);if(gpiono<0){printk("获取GPIO编号失败\n");return -ENXIO;}gpiono2=of_get_named_gpio(dnode,"led2-gpio",0);if(gpiono2<0){printk("获取GPIO编号失败\n");return -ENXIO;}gpiono3=of_get_named_gpio(dnode,"led3-gpio",0);if(gpiono3<0){printk("获取GPIO编号失败\n");return -ENXIO;}//申请gpio编号int ret=gpio_request(gpiono,NULL);if(ret){printk("申请GPIO编号失败\n");return -ENXIO;}printk("申请GPIO编号成功:%d\n",gpiono);//申请gpio编号int ret2=gpio_request(gpiono2,NULL);if(ret2){printk("申请GPIO编号失败\n");return -ENXIO;}printk("申请GPIO编号成功:%d\n",gpiono2);//申请gpio编号int ret3=gpio_request(gpiono3,NULL);if(ret3){printk("申请GPIO编号失败\n");return -ENXIO;}printk("申请GPIO编号成功:%d\n",gpiono3);//初始化定时器对象timer_setup(&mytimer,mytimer_function,0);mytimer.expires=jiffies+5*HZ;//定时1s;//注册定时器add_timer(&mytimer);//设置GPIO为输出ret=gpio_direction_output(gpiono,0);if(ret){printk("GPIO输出设置失败\n");return -1;}//设置GPIO为输出ret2=gpio_direction_output(gpiono2,0);if(ret2){printk("GPIO输出设置失败\n");return -1;}//设置GPIO为输出ret3=gpio_direction_output(gpiono3,0);if(ret3){printk("GPIO输出设置失败\n");return -1;}// //灯亮// gpio_set_value(gpiono,1);//     //灯亮// gpio_set_value(gpiono2,1);//     //灯亮// gpio_set_value(gpiono3,1);return 0;
}
static void __exit mycdev_exit(void)
{//注销定时器del_timer(&mytimer);//gpiod_set_value(gpiono,0);gpio_set_value(gpiono,0);gpio_set_value(gpiono2,0);gpio_set_value(gpiono3,0);//释放GPIO编号gpio_free(gpiono);//释放GPIO编号gpio_free(gpiono2);//释放GPIO编号gpio_free(gpiono3);//注销字符设备驱动unregister_chrdev(major,"mychrdev");}
module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");

应用程序

#include<stdlib.h>
#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<unistd.h>
#include<string.h>int main(int argc, char const *argv[])
{char buf[128]={0};int fd=open("/dev/mychrdev",O_RDWR);if(fd<0){printf("打开设备文件失败\n");exit(-1);}while(1){//从终端读取printf("请输入两个字符\n");printf("第一个字符:1(LED1) 2(LED2) 3(LED3)\n");printf("第二个字符:0(关灯) 1(开灯)\n");printf("请输入>");fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1]='\0';//向设备文件中写write(fd,buf,sizeof(buf));}return 0;
}

相关文章:

  • ChatGPT如何应对用户提出的道德伦理困境?
  • 【开源】基于SpringBoot的车险自助理赔系统的设计和实现
  • 【实战】Kubernetes安装持久化工具NFS-StorageClass
  • 【Python机器学习】零基础掌握RandomForestRegressor集成学习
  • MATLAB中polyvalm函数用法
  • MySQL - UNION 与 UNION ALL
  • web - 前段三剑客
  • json格式存储b64编码的rgb raw数据
  • leetcode_2558 从数量最多的堆取走礼物
  • 进制转换10进制转二进制,n进制转16进制
  • 一个简单的注册的页面,如有错误请指正;(3.JavaScript)
  • 记一次fineBI的增量删除更新BUG
  • Ansible上通过roles简化playbook演示介绍
  • 2023年【河北省安全员B证】新版试题及河北省安全员B证试题及解析
  • Vue中this指向问题
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • 30天自制操作系统-2
  • canvas 五子棋游戏
  • chrome扩展demo1-小时钟
  • co模块的前端实现
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • Java应用性能调优
  • JS基础之数据类型、对象、原型、原型链、继承
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • nodejs实现webservice问题总结
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • pdf文件如何在线转换为jpg图片
  • quasar-framework cnodejs社区
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • Travix是如何部署应用程序到Kubernetes上的
  • Vue官网教程学习过程中值得记录的一些事情
  • web标准化(下)
  • 对象管理器(defineProperty)学习笔记
  • 两列自适应布局方案整理
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 阿里云ACE认证之理解CDN技术
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (HAL库版)freeRTOS移植STMF103
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (剑指Offer)面试题34:丑数
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (新)网络工程师考点串讲与真题详解
  • (一)VirtualBox安装增强功能
  • (译)计算距离、方位和更多经纬度之间的点
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .bat批处理(四):路径相关%cd%和%~dp0的区别