C语言运用中断子系统用驱动控制led实验,c语言串口led点灯实验(驱动+应用层)

中断子系统用驱动控制led实验

驱动代码

#include <linux/init.h>
#include <linux/module.h>#include<linux/interrupt.h>
#include<linux/gpio.h>
#include<linux/timer.h>#include<linux/of.h>
#include<linux/of_irq.h>
#include<linux/of_gpio.h>/*myirq{compatible = "hqyj,myirq";interrupt-parent=<&gpiof>;interrupts=<9 0>,<7 0>,<8 0>;led1-gpio=<&gpioe 10 0>;led2-gpio=<&gpiof 10 0>;led3-gpio=<&gpioe 8 0>;};*/struct device_node *dnode;struct gpio_desc *lednode1;struct gpio_desc *lednode2;struct gpio_desc *lednode3;unsigned int irq_id1;unsigned int irq_id2;unsigned int irq_id3;//中断处理函数irqreturn_t myirq_handle1(int irq,void *dev){//反转电平gpiod_set_value(lednode1,!gpiod_get_value(lednode1));//防止其他灯亮gpiod_set_value(lednode2,0);gpiod_set_value(lednode3,0);return IRQ_HANDLED;}irqreturn_t myirq_handle2(int irq,void *dev){//反转电平gpiod_set_value(lednode2,!gpiod_get_value(lednode2));//防止其他灯亮gpiod_set_value(lednode1,0);gpiod_set_value(lednode3,0);return IRQ_HANDLED;}irqreturn_t myirq_handle3(int irq,void *dev){//反转电平gpiod_set_value(lednode3,!gpiod_get_value(lednode3));//防止其他灯亮gpiod_set_value(lednode1,0);gpiod_set_value(lednode2,0);return IRQ_HANDLED;}static int __init mycdev_init(void)
{//根据compatible解析设备节点dnode=of_find_compatible_node(NULL,NULL,"hqyj,myirq");if(NULL==dnode){printk("of_find_compatible_node error\n");return -ENXIO;}printk("解析设备节点成功\n");//设备树节点解析lednode1=gpiod_get_from_of_node(dnode,"led1-gpio",0,GPIOD_OUT_LOW,NULL);if(lednode1==NULL){printk("设备树节点解析失败\n");return ENXIO;}//设备树节点解析lednode2=gpiod_get_from_of_node(dnode,"led2-gpio",0,GPIOD_OUT_LOW,NULL);if(lednode2==NULL){printk("设备树节点解析失败\n");return ENXIO;}//设备树节点解析lednode3=gpiod_get_from_of_node(dnode,"led3-gpio",0,GPIOD_OUT_LOW,NULL);if(lednode3==NULL){printk("设备树节点解析失败\n");return ENXIO;}//解析按键1的软中断irq_id1=irq_of_parse_and_map(dnode,0);if(!irq_id1){printk("解析软中断失败\n");return -ENXIO;}//解析按键2的软中断irq_id2=irq_of_parse_and_map(dnode,1);if(!irq_id2){printk("解析软中断失败\n");return -ENXIO;}//解析按键3的软中断irq_id3=irq_of_parse_and_map(dnode,2);if(!irq_id3){printk("解析软中断失败\n");return -ENXIO;}printk("解析软中断成功\n");//注册按键1请求中断int ret=request_irq(irq_id1,myirq_handle1,IRQF_TRIGGER_FALLING,"key1",(void*)1); if(ret){printk("注册按键请求中断失败\n");return ret;}//注册按键2请求中断ret=request_irq(irq_id2,myirq_handle2,IRQF_TRIGGER_FALLING,"key2",(void*)2); if(ret){printk("注册按键请求中断失败\n");return ret;}//注册按键3请求中断ret=request_irq(irq_id3,myirq_handle3,IRQF_TRIGGER_FALLING,"key3",(void*)3); if(ret){printk("注册按键请求中断失败\n");return ret;}printk("注册按键请求中断成功\n");return 0;
}
static void __exit mycdev_exit(void)
{ //关灯gpiod_set_value(lednode1,0);gpiod_set_value(lednode2,0);gpiod_set_value(lednode3,0);//清空中断号free_irq(irq_id1,(void*)1);free_irq(irq_id2,(void*)2);free_irq(irq_id3,(void*)3);//释放设备树节点空间gpiod_put(lednode1);gpiod_put(lednode2);gpiod_put(lednode3);
}
module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");

串口led点灯实验(驱动+应用层)

驱动代码

#include <linux/init.h>
#include <linux/module.h>#include<linux/fs.h>
#include<linux/io.h>
#include<linux/device.h>#include<linux/gpio.h>
#include<linux/of.h>
#include<linux/of_gpio.h>#include"head.h"int major;
char kbuf[128]={0};struct class *cls;
struct device *dev;struct device_node *dnode;struct gpio_desc *lednode1;
struct gpio_desc *lednode2;
struct gpio_desc *lednode3;int mycdev_open(struct inode *inode, struct file *file)
{printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);return 0;
}ssize_t mycdev_read(struct file *file, char  *ubuf, size_t size, loff_t *lof)
{printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);unsigned long ret;//向用户空间读取拷贝if(size>sizeof(kbuf))//用户空间期待读取的大小内核满足不了,那就给内核支持的最大大小size=sizeof(kbuf);ret=copy_to_user(ubuf,kbuf,size);if(ret)//拷贝失败{printk("copy_to_user filed\n");return ret;}return 0;
}ssize_t mycdev_write(struct file *file, const char  *ubuf, size_t size, loff_t *lof)
{unsigned long ret;//从用户空间读取数据if(size>sizeof(kbuf))//用户空间期待读取的大小内核满足不了,那就给内核支持的最大大小size=sizeof(kbuf);ret=copy_from_user(kbuf,ubuf,size);if(ret)//拷贝失败{printk("copy_to_user filed\n");return ret;}return 0;
}long mycdev_ioctl (struct file * file, unsigned int cmd, unsigned long arg)
{switch (cmd){case LED_OFF:switch (arg){case 1:gpiod_set_value(lednode1,0);break;case 2:gpiod_set_value(lednode2,0);break;case 3:gpiod_set_value(lednode3,0);break;}break;case LED_ON:switch (arg){case 1:gpiod_set_value(lednode1,1);break;case 2:gpiod_set_value(lednode2,1);break;case 3:gpiod_set_value(lednode3,1);break;}break;default:break;}return 0;
}int mycdev_close(struct inode *inode, struct file *file)
{printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);return 0;
}//定义操作方法结构体变量并赋值
struct file_operations fops={.open=mycdev_open,.read=mycdev_read,.write=mycdev_write,.unlocked_ioctl=mycdev_ioctl,.release=mycdev_close,
};static int __init mycdev_init(void)
{//字符设备驱动注册major=register_chrdev(0,"mychrdev",&fops);if(major<0){printk("字符设备驱动注册失败\n");return major;}printk("字符设备驱动注册成功:major=%d\n",major);//向上提交目录cls=class_create(THIS_MODULE,"mychrdev");if(IS_ERR(cls)){printk("向上提交目录失败\n");return -PTR_ERR(cls);}printk("向上提交目录成功\n");int i;//向上提交三次设备节点信息for(i=0;i<3;i++){dev=device_create(cls,NULL,MKDEV(major,i),NULL,"myled%d",i);if(IS_ERR(dev)){printk("向上提交设备节点失败\n");return -PTR_ERR(dev);}}printk("向上提交设备节点成功\n");dnode=of_find_compatible_node(NULL,NULL,"hqyj,myirq");if(NULL==dnode){printk("of_find_compatible_node error\n");return -ENXIO;}printk("解析设备节点成功\n");//设备树节点解析lednode1=gpiod_get_from_of_node(dnode,"led1-gpio",0,GPIOD_OUT_LOW,NULL);if(lednode1==NULL){printk("设备树节点解析失败\n");return ENXIO;}//设备树节点解析lednode2=gpiod_get_from_of_node(dnode,"led2-gpio",0,GPIOD_OUT_LOW,NULL);if(lednode2==NULL){printk("设备树节点解析失败\n");return ENXIO;}//设备树节点解析lednode3=gpiod_get_from_of_node(dnode,"led3-gpio",0,GPIOD_OUT_LOW,NULL);if(lednode3==NULL){printk("设备树节点解析失败\n");return ENXIO;}printk("设备树节点解析成功\n");return 0;
}
static void __exit mycdev_exit(void)
{ //关灯gpiod_set_value(lednode1,0);gpiod_set_value(lednode2,0);gpiod_set_value(lednode3,0);//释放设备树节点空间gpiod_put(lednode1);gpiod_put(lednode2);gpiod_put(lednode3);int i;for(i=0;i<3;i++){device_destroy(cls,MKDEV(major,i));}//销毁目录class_destroy(cls);//注销字符设备驱动unregister_chrdev(major,"mychrdev");}
module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");

头文件

#ifndef __HEAD_H__
#define __HEAD_H__#define LED_ON  _IOW('l',1,int)
#define LED_OFF _IOW('l',0,int)
#endif

应用层

#include<stdio.h>
#include<stdlib.h>
#include<string.h>#include<fcntl.h>
#include<unistd.h>#include<sys/types.h>
#include<sys/stat.h>
#include<sys/ioctl.h>#include"head.h"int main(int argc, char const *argv[])
{int fd;fd=open("/dev/myled0",O_RDWR);if(fd<0){perror("open error:");return -1;}int a;int b;
while (1)
{out:printf("选择要实现的功能\n");printf("请输入0关灯 1开灯\n");scanf("%d",&a);printf("LED 1,LED 2 LED 3");printf("请输入:");scanf("%d",&b);switch (a){case 0:ioctl(fd,LED_OFF,b);  break;case 1:ioctl(fd,LED_ON,b);  break;default:printf("输入错误请重新输入\n");goto out;break;}
}return 0;
}

中断运用驱动控制led实验

串口led点灯实验结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/484288.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2-21算法习题总结

由于蓝桥杯的题,我不知道从怎么复制,就只能粘贴图片了 翻硬币 代码 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);String start sc.next();char[] starts start.toCharArray();String end sc…

Eclipse 分栏显示同一文件

Eclipse 分栏显示同一文件 1. Window -> EditorReferences 1. Window -> Editor Toggle Split Editor (Horizontal) &#xff1a;取消或设置水平分栏显示 Toggle Split Editor (Vertical) &#xff1a;取消或设置垂直分栏显示 References [1] Yongqiang Cheng, https:/…

linux 系统的目录结构

为什么某些执行程序位于/bin、/sbin、/usr/bin或/usr/sbin目录下&#xff1f;例如&#xff0c;less命令位于/usr/bin目录下。为什么不是/bin、/sbin或/usr/sbin&#xff1f;这些目录之间有什么区别呢&#xff1f; 在这篇文章中&#xff0c;让我们主要讲述一下Linux文件系统结构…

linux调用so库之一

任务&#xff1a;linux系统&#xff0c;已经生成so库&#xff0c;需要调用。 参考文献&#xff1a; Linux 调用动态库&#xff08;.SO文件&#xff09;总结_linux deviceio.so-CSDN博客 可以看他的第一部分&#xff0c;即显式调用。但是会报错&#xff0c;我的版本是64位的U…

MyBatis Plus:自定义typeHandler类型处理器

目录 引言&#xff1a;关于TypeHandler PostGreSQL&#xff1a;JSON数据类型 PostGreSQL数据库驱动&#xff1a;PGobject类 TypeHandler类型处理器 自定义类型处理器 类型处理器实现&#xff1a;PGJsonTypeHandler 注册类型处理器 引言&#xff1a;关于TypeHandler MyBa…

Java项目:22 Javaweb实现的学生宿舍管理系统

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 Javaweb实现的学生宿舍管理系统采用jspservlet技术实现了如下功能模块&#xff0c;分别是宿舍管理员管理、学生管理、宿舍楼管理、缺勤记录、修改密码…

基于springboot+vue的B2B平台的医疗病历交互系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

哪款护眼台灯比较耐用?2024年五款甄选高评分榜单好物!

作为一位专业家电测评博主&#xff0c;经常会有粉丝们的询问&#xff1a;究竟哪个牌子的护眼台灯好用又护眼&#xff1f;许多人在购买时由于信息不对等&#xff0c;结果选择的产品往往存在诸如光照不舒适、损伤眼睛等问题。为了让大家都能精准找到能够保护眼睛的台灯&#xff0…

大工程 从0到1 数据治理 数仓篇(sample database classicmodels _No.7)

大工程 从0到1 数据治理 之数仓篇 我这里还是sample database classicmodels为案列&#xff0c;可以下载&#xff0c;我看 网上还没有类似的 案列&#xff0c;那就 从 0-1开始吧&#xff01; 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参…

【安卓基础3】Activity(一)

&#x1f3c6;作者简介&#xff1a;|康有为| &#xff0c;大四在读&#xff0c;目前在小米安卓实习&#xff0c;毕业入职 &#x1f3c6;本文收录于 安卓学习大全&#xff0c;欢迎关注 &#x1f3c6;安卓学习资料推荐&#xff1a; 视频&#xff1a;b站搜动脑学院 视频链接 &…

WEB甘特图选型

1.火车侠 GitHub - w1301625107/Vue-Gantt-chart: 使用Vue做数据控制的Gantt图表 优点&#xff1a;有小时选项 缺点&#xff1a;不支持拖拽 2.火车侠二号 GitHub - liyang5945/vue-drag-gantt-chart: Vue拖拽甘特图 a draggable gantt-chart with vue 有点&#xff1a;实现了…

2012及其以上系统修改服务器密码指南

修改服务器密码指南,目前介绍两种不同的方案 方法一 指令式 winR键 弹出运行框里输入 cmd 点击确认或者右下角开始程序里面的点开运行 2.在弹出框里手动输入以下一组文字&#xff1a;net user administrator 123456 框内无法粘贴 需要手动输入 其中administrator 是用…