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.mzph.cn/news/696653.shtml

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

相关文章

GB/T 17640-2023 长丝机织土工布检测

长丝机织土工布是指以合成纤维长丝为原料织制而成的土工布&#xff0c;按纤维品种分为涤纶、丙纶、锦纶 等长丝机织土工布&#xff1b;按用途分为反滤布、复合用基布、管袋布、模袋布等。 GB/T 17640-2023 长丝机织土工布测试项目&#xff1a; 测试要求 测试标准 经向抗拉强…

实现律所高质量发展-Alpha法律智能操作系统

律师行业本质上属于服务行业&#xff0c;而律师团队作为一个独立的服务单位&#xff0c;应当包含研发、市场、销售、服务等单位发展的基础工作环节。但现实中&#xff0c;很多律师团队其实并没有区分这些工作。鉴于此&#xff0c;上海市锦天城律师事务所医药大健康行业资本市场…

【备忘】几个特殊的注册表路径

记录几个有用的注册表路径。防止用到忘记了。&#xff08;非教程篇&#xff09; 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PolicyManager\default\Start 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PolicyManager\default\WindowsLogon\HideFastUserSwitching 虚拟桌…

【SQL注入】靶场SQLI DUMB SERIES-26空格和注释被过滤

26题提示所有的空格和注释都会被过滤掉 输入?id0判断闭合方式&#xff0c;回显报错可以确定闭合方式为单引号 正常思路是需要通过注释符将后面的语句注释掉&#xff0c;但是这一关的注释符被过滤了&#xff0c;可以考虑使用将后面的语句也闭合的思路来避免引号带来的报错。输…

【区块链技术——智能合约——以太坊平台——金融交易】

引言 在如今这个高度数字化的世界中&#xff0c;金融交易趋向于使用更加先进的技术来减少交易成本&#xff0c;提高效率。区块链技术的出现作为一场革命&#xff0c;尤其是其衍生技术——智能合约&#xff0c;为金融交易带来诸多新机遇。本文将以最广泛使用的区块链平台——以…

【leetcode】记忆化搜索

记忆化搜索 一、斐波那契数1、题目描述2、代码3、解析 二、不同路径1、题目描述2、代码3、解析 三、最长递增子序列1、题目描述2、代码3、解析 四、猜数字大小II1、题目描述2、代码3、解析 五、矩阵中的最长递增路径1、题目描述2、代码3、解析 一、斐波那契数 1、题目描述 le…

【java】小学生数学练习题目生成系统

本文章主要是CSDN-问答板块&#xff0c;有题主提出的问题&#xff0c;我这边将完整代码提供出来&#xff0c;仅供大家参考学习&#xff01; 一、效果截图 二、直接上代码 package com.example.dingtalk.question;import javax.script.ScriptEngine; import javax.script.Scrip…

PHP实践:Laravel中事件使用讲解

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师…

kafka生产者

1.原理 2.普通异步发送 引入pom&#xff1a; <dependencies><dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>3.0.0</version></dependency><dependency><g…

“errcode“:40163,“errmsg“:“code been used

{"errcode":40163,"errmsg":"code been used, rid: 65d6fa01-6ae8fecc-3a2f4bf8"} 通过微信静默授权方式&#xff0c;获得当前微信用户 openid 时&#xff0c;重复使用 code 造成的。 不是腾讯的问题&#xff0c;自己的代码逻辑没有遵循腾讯请…

2024022202-查询优化

查询优化 概述 关系系统和关系模型是两个密切相关而有不同的概念。支持关系模型的数据库管理系统称为关系系统。但是关系模型中并非每一部分都是同等重要的&#xff0c;所以我们不苛求完全支持关系模型的系统才能称为关系系统。因此&#xff0c;我们给出一个关系系统的最小要求…

excel数据处理——一列数据转换为n列多行

按行抽取 如果只希望保留第一行的标题&#xff0c;然后将其他奇数行删除&#xff0c;可以选择一个空白列&#xff0c;为不同的行赋值&#xff0c;函数为“mod(row(),2)”&#xff1b; 这个是0,1 数列&#xff0c;如果是0,1&#xff0c;2就是“mod(row(),3)”。 行列转换 复制…

【学习总结】慢SQL治理经验总结

一、慢SQL定义 执行超过1s的SQL为慢SQL 三、慢SQl的风险 系统的响应时间延迟&#xff0c;影响用户体验 资源占用增加&#xff0c;增高了系统的负载&#xff0c;其他请求响应时间也可能会收到影响。 慢SQL占用数据库连接的时间长,如果有大量慢SQL查询同时执行&#xff0c;可能…

Waline评论服务端转移至Deta

旧文首发地址 问题 前阵子评论系统又挂了&#xff0c;原因是*.vercel.app域名被污染。 解决方法 法一&#xff1a;服务端换个域名 法二&#xff1a;换个服务端部署 我选法二。 步骤 DETA官网&#xff1a;https://www.deta.sh/ Deta is free for ever. 这句话很不错有木有…

C语言中的assert.h:调试助手与断言详解

在C语言编程中&#xff0c;assert.h头文件提供了非常有用的断言&#xff08;Assertion&#xff09;功能&#xff0c;它主要用于开发和调试阶段&#xff0c;确保程序在运行时满足某些预期条件。如果这些条件未得到满足&#xff0c;则程序会立即停止执行&#xff0c;并打印出有关…

【MySQL】解决在join表时一对多的情况下重复数据的问题

在MySQL中进行JOIN操作&#xff0c;特别是在处理一对多关系的表时&#xff0c;可能会出现重复的记录&#xff0c;这是因为左表&#xff08;或右表&#xff09;中的每一项在与右表&#xff08;或左表&#xff09;连接时&#xff0c;如果对应有多条匹配记录&#xff0c;则会生成多…

冷链物流追踪:Java与MySQL的协同实践

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

第三百六十一回

文章目录 1. 概念介绍2. 实现方法2.1 环绕效果2.2 立体效果 3. 示例代码4. 内容总结 我们在上一章回中介绍了"自定义SlideImageSwitch组件"相关的内容&#xff0c;本章回中将介绍两种阴影效果.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本…

Gson 库的使用

Gson 是由 Google 开发的一个流行的 Java 库,用于处理 JSON 数据的序列化和反序列化。它提供了简单易用的 API,使得在 Java 应用程序中操作 JSON 数据变得非常方便。 以下是 Gson 库的一些主要特点和用法 简单易用 Gson 提供了一个简单而直观的 API,使得在 Java 应用程序中…

谷歌seo推广怎么做?

除了常规的优化之外&#xff0c;还可以针对特定垂直搜索进行优化&#xff0c;比如图片的以及视频的搜索优化&#xff0c;这对于贩卖自己产品的网站来说也是挺重要的一点 图片需要确保您的图片文件名包含相关关键词&#xff0c;并为每张图片添加描述性的ALT文本&#xff0c;以帮…