全志_外部中断

全志_外部中断


 

 

平台:全志A64

源码:Android 7.1  Linux3.1

 

 

  1 #include <linux/init.h>
  2 #include <linux/module.h>
  3 #include <linux/fs.h>
  4 #include <linux/device.h>
  5 #include <linux/slab.h>
  6 #include <linux/gpio.h>
  7 #include <linux/cdev.h>
  8 #include <linux/interrupt.h>
  9 #include <linux/input.h>
 10 #include <asm/io.h>
 11 #include <asm/string.h>
 12 #include <asm/uaccess.h>
 13 #include <asm-generic/ioctl.h>
 14 #include <linux/kernel.h>
 15 #include <linux/interrupt.h>
 16 #include <linux/input.h>
 17 #include <linux/platform_device.h>
 18 #include <linux/list.h>
 19 #include <linux/spinlock.h>
 20 #include <linux/rwsem.h>
 21 #include <linux/timer.h>
 22 #include <linux/module.h>
 23 #include <linux/err.h>
 24 #include <linux/ctype.h>
 25 #include <linux/sysfs.h>
 26 #include <linux/of.h>
 27 #include <linux/of_gpio.h>
 28 #include <linux/miscdevice.h>
 29 #include <linux/delay.h>
 30 #include <linux/sys_config.h>
 31 
 32 // 串口3     RX      PH5   PH_EINT5
 33 
 34 #define IR_GPIO GPIOH(8)               //外部中断引脚
 35 
 36 
 37 //定义个数据包
 38 struct fsp_event{
 39     int code;         
 40     int value;     
 41 };
 42 
 43 
 44 //面向对象-设备的类型
 45 struct fsp{
 46     //unsigned int major;
 47     dev_t  devno;
 48     struct class * cls;
 49     struct device * dev;
 50     struct cdev  *cdev;
 51     unsigned int irqno;
 52     struct fsp_event event;
 53     int data;
 54 };
 55 struct fsp *fsp_dev;
 56 
 57 
 58 //中断服务函数
 59 irqreturn_t fsp_irq_svc(int irqno, void *dev)
 60 {
 61     printk("irq success !\n");    //for text 
 62 
 63 
 64     return IRQ_HANDLED;
 65 }
 66 
 67 
 68 //设备操作接口
 69 int fsp_open(struct inode *inode, struct file *filp)
 70 {
 71 
 72 
 73     return 0;
 74 }
 75 
 76 
 77 ssize_t fsp_read(struct file *filp , char __user *buf , size_t size, loff_t *flags)
 78 {
 79 
 80 
 81 
 82     return size;
 83 }
 84 
 85 ssize_t fsp_write(struct file *filp, const char __user *buf, size_t size, loff_t *flags)
 86 {
 87 
 88 
 89     return size;
 90 }
 91 
 92 
 93 long fsp_ioctl(struct file *filp, unsigned int cmd , unsigned long args)
 94 {
 95      
 96 
 97     return 0;
 98 }
 99 
100 
101 int fsp_close(struct inode *inode, struct file *filp)
102 {
103     
104     
105     return 0;
106 }
107 
108 
109 static struct file_operations fops = {
110     .open = fsp_open,
111     .read = fsp_read,
112     .write = fsp_write,
113     .unlocked_ioctl = fsp_ioctl,
114     .release = fsp_close,
115 };
116 
117 static int __init fsp_init(void)   
118 {
119     
120     printk("fsp_init  success !\n");
121     
122     int ret;
123     fsp_dev = kzalloc(sizeof(struct fsp),GFP_KERNEL);
124     if(IS_ERR(fsp_dev)){
125         printk("kzalloc error!\n");
126         ret = PTR_ERR(fsp_dev);
127         return -ENOMEM;
128     }
129     
130 
131     //动态申请设备号
132     ret = alloc_chrdev_region(&fsp_dev->devno,0,1,"button_drv");
133     if(ret < 0){
134         printk("register_chrdev_region error!\n");
135         ret =  -EINVAL;
136         goto err_kfree;
137     }
138 
139 
140     //申请cdev的空间
141     fsp_dev->cdev = cdev_alloc();
142     if(IS_ERR(fsp_dev->cdev)){        
143         printk("fsp_dev->cdev error!\n");
144         ret = PTR_ERR(fsp_dev->cdev);
145         goto err_unregister;
146     }
147 
148     //初始化cdev的成员
149     cdev_init(fsp_dev->cdev,&fops);
150 
151     //将cdev加入到内核中----链表
152     ret = cdev_add(fsp_dev->cdev,fsp_dev->devno,1);
153 
154     //创建设备文件
155     fsp_dev->cls = class_create(THIS_MODULE,"fsp_dev");
156     if(IS_ERR(fsp_dev->cls)){
157         printk("class_create error!\n");
158         ret = PTR_ERR(fsp_dev->cls);
159         goto err_cdev_del;
160     }
161     
162     fsp_dev->dev = device_create(fsp_dev->cls,NULL,fsp_dev->devno,NULL,"fsp_EINT");
163     if(IS_ERR(fsp_dev->dev)){
164         printk("device_create error!\n");
165         ret = PTR_ERR(fsp_dev->dev);
166         goto err_class;
167     }
168     
169     
170     fsp_dev->irqno = gpio_to_irq(IR_GPIO);   //中断号
171     ret = request_irq(fsp_dev->irqno,fsp_irq_svc,IRQF_TRIGGER_FALLING|IRQF_TRIGGER_RISING,"eint-keydown",NULL);
172     if(ret != 0){
173         printk("request_irq error!\n");
174         ret = -EBUSY;
175         goto err_device;
176     }
177 
178     return 0;
179     
180 err_device:
181     device_destroy(fsp_dev->cls,fsp_dev->devno);
182 err_class:
183     class_destroy(fsp_dev->cls);
184     
185 err_cdev_del:
186     cdev_del(fsp_dev->cdev);
187     
188 err_unregister:
189     unregister_chrdev_region(fsp_dev->devno,1);
190     
191 err_kfree:
192     kfree(fsp_dev);
193     return ret;
194   
195 }
196 
197 static void __exit fsp_exit(void)   
198 {
199     printk("fsp_init  success !\n");
200     
201     free_irq(fsp_dev->irqno,NULL);
202     device_destroy(fsp_dev->cls,fsp_dev->devno);
203     class_destroy(fsp_dev->cls);
204     cdev_del(fsp_dev->cdev);
205     unregister_chrdev_region(fsp_dev->devno,1);
206     kfree(fsp_dev);
207 }
208 
209 module_init(fsp_init);
210 module_exit(fsp_exit);
211 MODULE_LICENSE("GPL");

 

 

 测试:

 

 

 

success

 

 

笔记


 

转载于:https://www.cnblogs.com/panda-w/p/11574752.html

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

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

相关文章

[ZJOI2007]时态同步 树形DP

题意&#xff1a;给定一棵N个节点的无根树&#xff0c;每条边都有一个权值V&#xff0c;选取其中一个点作为关键点&#xff0c;你可以任意增加某条边的权值&#xff0c;求使得从关键点出发&#xff0c;到任意一个叶子节点的距离都相同所需要增加的权值和。 数据范围&#xff1a…

题解P3942_将军令

初始数组忘了赋初值&#xff0c;&#xff0c;&#xff0c;我真是个机灵鬼 还有这题是三倍经验P2279&&P2016&#xff0c;这题的实现思想来自P2279首个题解 luogu 简化题意 给你一棵树&#xff0c;你有一些可以覆盖范围为$k$的障碍物&#xff0c;问最少放几个障碍物可以使…

[SCOI2009]生日礼物 单调性尺取法

题意&#xff1a;给你n个k种颜色的点&#xff0c;每个点都有坐标和颜色两个属性&#xff0c;选出一个长度尽量短的区间&#xff0c;使得每种颜色的点都在区间内出现。 数据范围&#xff1a; 对于50%的数据&#xff0c; N≤10000&#xff1b; 对于80%的数据&#xff0c; N≤8000…

PJ2018T4 对称二叉树 树形结构

题意&#xff1a;现在给出一棵二叉树&#xff0c;希望你找出它的一棵子树&#xff0c;该子树为对称二叉树&#xff0c;且节点数最多。请输出这棵子树的节点数。对称二叉树满足&#xff1a;将这棵树所有节点的左右子树交换后&#xff0c;新树和原树对应位置的结构相同且点权相等…

提高ASP.Net应用程序性能的十大方法

一、返回多个数据集 检查你的访问数据库的代码&#xff0c;看是否存在着要返回多次的请求。每次往返降低了你的应用程序的每秒能够响应请求的次数。通过在单个数据库请求中返回多个结果集&#xff0c;可以减少与数据库通信的时间&#xff0c;使你的系统具有扩展性&#xff0c;…

【NOIP2015提高组】子串 区间DP+滚动数组优化

题意&#xff1a; 有两个仅包含小写英文字母的字符串 A 和 B。 现在要从字符串 A 中取出 k 个互不重叠的非空子串&#xff0c;然后把这 k 个子串按照其在字符串 A 中出现的顺序依次连接起来得到一个新的字符串。 请问有多少种方案可以使得这个新串与字符串 B 相等&#xff1f; …

教你如何去淘便宜机票

机票四月二十日集体变相涨价后&#xff0c;中央电视台曾经报道&#xff0c;今后没有5折以下机票&#xff0c;今后也不再叫多少折&#xff0c;而是直接报价&#xff0c;但是春秋航空不再此之列&#xff0c;原因是这次变相提价是一个叫中航信公司在操作&#xff0c;他们不代理春秋…

32位单精度浮点乘法器的FPGA实现

摘 要: 采用Verilog HDL语言, 在FPGA上实现了32位单精度浮点乘法器的设计, 通过采用改进型Booth编码&#xff0c;和Wallace 树结构, 提高了乘法器的速度。本文使用Altera Quartus II 4.1仿真软件, 采用的器件是EPF10K100EQ 240 -1, 对乘法器进行了波形仿真, 并采用0.5CMOS工艺…

我们的运动会

不久前&#xff0c;我们举办了微软中国研发集团的首届运动会。遗憾的是&#xff0c;当时我自己由于公务在身没能参加。事后同事们把许多精彩的图片与我分享&#xff0c;让我十分羡慕他们有机会大显身手&#xff0c;现在贴出来让大家看看他们的飒爽英姿&#xff0c;一睹为快。运…

性能测试工具SilkPerformer介绍

SilkPerformer 是业界最强大&#xff0c;且最易用的企业级负载和强度测试解决方案&#xff0c;用于对关键任务应用的质量进行优化。SilkPerformer使用可视化脚本生成技术和对存在成千上万的并发用户的多个应用环境进行测试的能力&#xff0c;使您能够在企业应用部署之前&#x…

Office2010试用

昨天看到了Office的下载地址&#xff0c;就安装了一个试了试&#xff0c;总体感觉和Office2007变化不大&#xff0c;外观配色上看起来非常舒服&#xff0c;Aero效果用得更多了&#xff0c;具体功能改进还没有细研究&#xff08;其实一直感觉到了2003后的更新大都只是在界面和适…

配置WINDOWS群集

配置WINDOWS群集 实验说明&#xff1a;本实验用于配置WINDOWS群集 实验名称&#xff1a;配置WINDOWS群集 实验目的&#xff1a;理解WINDOWS群集服务的工作原理&#xff0c;熟练掌握安装WINDOWS群集服务及配置WINDOWS群集 实验设备&#xff1a;windows server 2003 VM 二台 实验…

李天平×××作诞生记——《亮剑.NET:.NET深入体验与实战精要》

从开始搞.NET开发至今已经有六、七年了&#xff0c;从当初对.NET一无所知&#xff0c;到现在领导研发团队进行各种项目的开发和架构设计&#xff0c;几年里经历了各种沟沟坎坎&#xff0c;无论是技术上的&#xff0c;还是管理上的。这些经历和经验就像一笔财富&#xff0c;为自…

计组学习笔记(一):浮点数的表示和运算

最近学习计算机组成原理&#xff0c;遇到许多疑难问题&#xff0c;接下来写一写我在学习浮点数方面知识的理解&#xff0c;在巩固的同时也方便日后的复习。一、浮点数的表示1、浮点数的表示格式浮点数&#xff0c;顾名思义&#xff0c;就是小数点不固定的数。计算机中&#xff…

如何查看linux的版本

虽然用过些版本的LINUX系统&#xff0c;但是没有查看过具体的版本是多少来着&#xff0c;下午心血来潮&#xff0c;想查看下自己的版本&#xff0c;到网上收索了下&#xff0c;看到有一大堆命令出来&#xff0c;呵呵&#xff0c;1 最简单的一个uname -a2 cat /etc/issue …

JDBC批量Insert深度优化(有事务)

JDBC批量Insert深度优化&#xff08;有事务&#xff09;环境&#xff1a;MySQL 5.1RedHat Linux AS 5JavaSE 1.5DbConnectionBroker 微型数据库连接池测试的方案&#xff1a;执行10万次Insert语句&#xff0c;使用不同方式。A组&#xff1a;静态SQL&#xff0c;自动提交&#x…

ActiveBpel部署运行BPEL流程实例

本文接收使用ActiveBpel开发&#xff0c;部署和运行BPEL流程实例。本文的例子工程和服务工程请见附件。1. 安装ActiveBpel5.0.2要安装ActiveBpel5.0.2&#xff0c;需要先安装JDK1.5&#xff0c;Tomcat。注意这里是JDK1.5版本的&#xff0c;ActiveBpel5.0.2不支持JDK1.5以上的版…

活动目录实战系列五(更改域名)

在单域环境下且没有什么服务的情况的改域名还行&#xff0c;如果网络环境比较复杂或者有其他服务&#xff0c;不建议更改。以免发生错误。在实验中由于虚拟机坏掉在这里使用了两个&#xff0c;有部分图片对不上&#xff0c;请谅解。 WIN2000域不支持域重命名域重命名并不是在域…

KMP算法 Next数组详解(【洛谷3375】KMP字符串匹配 )

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/qq_30974369/article/details/74276186 </div><div id"content_views" class"markdown_views"><!-- flowchart 箭头图标 勿删 --…

转自知乎-我见过最通俗易懂的KMP算法详解

有些算法&#xff0c;适合从它产生的动机&#xff0c;如何设计与解决问题这样正向地去介绍。但KMP算法真的不适合这样去学。最好的办法是先搞清楚它所用的数据结构是什么&#xff0c;再搞清楚怎么用&#xff0c;最后为什么的问题就会有恍然大悟的感觉。我试着从这个思路再介绍一…