linux设备驱动之按键外部中断

老习惯先贴一波代码再仔细分析消化。

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/irq.h>
#include <asm/uaccess.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <asm/arch/regs-gpio.h>
#include <asm/hardware.h>static struct class *thirddrv_class;
static struct class_device	*thirddrv_class_dev;volatile unsigned long *gpfcon;
volatile unsigned long *gpfdat;volatile unsigned long *gpgcon;
volatile unsigned long *gpgdat;static DECLARE_WAIT_QUEUE_HEAD(button_waitq);/* 中断事件标志, 中断服务程序将它置1,third_drv_read将它清0 */
static volatile int ev_press = 0;struct pin_desc{unsigned int pin;unsigned int key_val;
};/* 键值: 按下时, 0x01, 0x02, 0x03, 0x04 */
/* 键值: 松开时, 0x81, 0x82, 0x83, 0x84 */
static unsigned char key_val;struct pin_desc pins_desc[4] = {{S3C2410_GPF0, 0x01},{S3C2410_GPF2, 0x02},{S3C2410_GPG3, 0x03},{S3C2410_GPG11, 0x04},
};/** 确定按键值*/
static irqreturn_t buttons_irq(int irq, void *dev_id)
{struct pin_desc * pindesc = (struct pin_desc *)dev_id;unsigned int pinval;pinval = s3c2410_gpio_getpin(pindesc->pin);if (pinval){/* 松开 */key_val = 0x80 | pindesc->key_val;}else{/* 按下 */key_val = pindesc->key_val;}ev_press = 1;                  /* 表示中断发生了 */wake_up_interruptible(&button_waitq);   /* 唤醒休眠的进程 */return IRQ_RETVAL(IRQ_HANDLED);
}static int third_drv_open(struct inode *inode, struct file *file)
{/* 配置GPF0,2为输入引脚 *//* 配置GPG3,11为输入引脚 */request_irq(IRQ_EINT0,  buttons_irq, IRQT_BOTHEDGE, "S2", &pins_desc[0]);request_irq(IRQ_EINT2,  buttons_irq, IRQT_BOTHEDGE, "S3", &pins_desc[1]);request_irq(IRQ_EINT11, buttons_irq, IRQT_BOTHEDGE, "S4", &pins_desc[2]);request_irq(IRQ_EINT19, buttons_irq, IRQT_BOTHEDGE, "S5", &pins_desc[3]);	return 0;
}ssize_t third_drv_read(struct file *file, char __user *buf, size_t size, loff_t *ppos)
{if (size != 1)return -EINVAL;/* 如果没有按键动作, 休眠 */wait_event_interruptible(button_waitq, ev_press);/* 如果有按键动作, 返回键值 */copy_to_user(buf, &key_val, 1);ev_press = 0;return 1;
}int third_drv_close(struct inode *inode, struct file *file)
{free_irq(IRQ_EINT0, &pins_desc[0]);free_irq(IRQ_EINT2, &pins_desc[1]);free_irq(IRQ_EINT11, &pins_desc[2]);free_irq(IRQ_EINT19, &pins_desc[3]);return 0;
}static struct file_operations sencod_drv_fops = {.owner   =  THIS_MODULE,    /* 这是一个宏,推向编译模块时自动创建的__this_module变量 */.open    =  third_drv_open,     .read	 =	third_drv_read,	   .release =  third_drv_close,	   
};int major;
static int third_drv_init(void)
{major = register_chrdev(0, "third_drv", &sencod_drv_fops);thirddrv_class = class_create(THIS_MODULE, "third_drv");thirddrv_class_dev = class_device_create(thirddrv_class, NULL, MKDEV(major, 0), NULL, "buttons"); /* /dev/buttons */gpfcon = (volatile unsigned long *)ioremap(0x56000050, 16);gpfdat = gpfcon + 1;gpgcon = (volatile unsigned long *)ioremap(0x56000060, 16);gpgdat = gpgcon + 1;return 0;
}static void third_drv_exit(void)
{unregister_chrdev(major, "third_drv");class_device_unregister(thirddrv_class_dev);class_destroy(thirddrv_class);iounmap(gpfcon);iounmap(gpgcon);return 0;
}module_init(third_drv_init);module_exit(third_drv_exit);MODULE_LICENSE("GPL");

应用层代码如下

——————————————————————————————————————我是漂亮的分割线—————————————————————————

 

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>/* thirddrvtest */
int main(int argc, char **argv)
{int fd;unsigned char key_val;fd = open("/dev/buttons", O_RDWR);if (fd < 0){printf("can't open!\n");}while (1){//read(fd, &key_val, 1);//printf("key_val = 0x%x\n", key_val);sleep(5);}return 0;
}

 

 

 

 

 

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

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

相关文章

C语言实现ICMP协议Ping命令

From: http://www.360doc.com/content/12/0429/19/1317564_207540510.shtml 大部分人用ping命令只是作为查看另一个系统的网络连接是否正常的一种简单方法。在这篇文章中&#xff0c;作者将介绍如何用C语言编写一个模拟ping命令功能的程序。ping命令是用来查看网络上另一个主机…

Ubuntu 时间同步

1. 安装ntpdate工具# sudo apt-get install ntpdate2. 设置系统时间与网络时间同步# ntpdate cn.pool.ntp.org

vscode tab键快捷生成元素html标签

按照上图在设置中找到对应的文件夹&#xff0c; 直接加上"emmet.triggerExpansionOnTab": true,这段代码保存 重新打开vscode即可

Linux用ICMP协议实现简单Ping网络监测功能

From: http://www.linuxidc.com/Linux/2012-05/61073.htm ICMP是&#xff08;Internet Control Message Protocol&#xff09;Internet控制报文协议。它是TCP/IP协议族的一个子协议&#xff0c;用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路…

解决vscode格式化代码html属性换行问题; ctrl+s格式化去除分号,格式化自动单引号;解决js格式化换行问题;mac上的settings.json完整配置

右键格式化文档或者ctrl s保存 html不换行 1.安装两个插件①vetur ②Prettier - Code formatter 2.在vetur的settings.json中设置 配置ctrls触发格式化去除分号和单引号&#xff1b;配置格式化js换行&#xff1b;配置解决html属性换行 将最后一部分的设置&#xff0c;修改…

微信分享接口

看着微信分享的 demo 好纠结啊。。。不知道怎么去触发他。哪位大神可以指点一下。。。点击按钮弹出分享js不太懂。。搞了半天也没搞出来。。请教大家。wx.ready(function () {wx.onMenuShareTimeline({title: window.shareData.tTitle,link: window.shareData.timeLineLink,img…

OSI网络七层简义

OSI网络七层 1:物理层:如网卡,光纤,线览 2.数据链路层:交换机,记录MAC地址与内网IP 3.网络层:路由器,负责记录公网IP,如PPPOE拨号,固定IP 4.传输层:代理软件,如Apache代理80端口,SVN 3690端口等等 5.会话层,6.表现层是由第7层应用层决定转载于:https://blog.51cto.com/kongdq/9…

uniapp使用iconfont字体图标

vue引入字体图标看这篇 本文介绍两种方案&#xff1a;一、使用iconfont字体图标 二、使用icon图片 情景1&#xff1a;使用灰色的字体图标 方案一&#xff1a;使用iconfont字体图标 步骤1&#xff1a;下载iconfont 步骤2&#xff1a;解压后只需要将ifonfont.css这一个文件 &am…

linux中断pollselcet按键处理机制

在上一篇linux按键中断处理中&#xff0c;我们采用按键中断处理获取按键&#xff0c;在read函数中阻塞读取&#xff0c;当按键发生时&#xff0c;read自动解除阻塞&#xff0c;实现应用层读取到相应的按键值。在上一节中如果没有按键到来&#xff0c;应用层会一直阻塞等待在rea…

04:求整数的和与均值

总时间限制: 1000ms内存限制: 65536kB描述读入n&#xff08;1 < n < 10000&#xff09;个整数&#xff0c;求它们的和与均值。 输入输入第一行是一个整数n&#xff0c;表示有n个整数。第2~n1行每行包含1个整数。每个整数的绝对值均不超过10000。输出输出一行&#xff0c;…

Yeslab现任明教教主ISE课程前七部分免费发布

Yeslab现任明教教主ISE课程1-7部分免费发布 网盘&#xff1a;http://ref.so/p63jl转载于:https://blog.51cto.com/ielab/967536

socket选项: SO_REUSEADDR, SO_RCVBUF, SO_SNDBUF

From: http://blog.csdn.net/jasonliuvip/article/details/22591531 最近在看《linux高性能服务器编程》&#xff0c;在此做个日记&#xff0c;以激励自己&#xff0c;同时分享于有需要的朋友。 1. 读取和设置socket文件描述符属性&#xff1a; [cpp] view plaincopy#include …

linux 文件按照大小排列

从大往小排列 ls -lhS 从小往大排列 ls -lhSr 来源&#xff1a; http://www.shuaizhu.com/wordpress/linux%E7%B3%BB%E7%BB%9F%E4%B8%8B%EF%BC%8C%E6%8C%89%E6%96%87%E4%BB%B6%E7%9A%84%E5%A4%A7%E5%B0%8F%E8%BF%9B%E8%A1%8C%E6%8E%92%E5%BA%8F%E7%9A%84%E5%91%BD%E4%BB%A4…

Media所有参数汇总

Media所有参数汇总 我们最常需要用到的媒体查询器的三个特性&#xff0c;大于&#xff0c;等于&#xff0c;小于的写法。媒体查询器的全部功能肯定不止这三个功能&#xff0c;下面是我总结的它的一些参数用法解释&#xff1a; width:浏览器可视宽度。 height:浏览器可视高度。…

jni中native通过adb输出

本文主要实践了如何在jni中打印log&#xff0c;贴源码&#xff1a; Android.mk主要是巴拉的android源码中的app LOCAL_PATH : $(call my-dir) include $(CLEAR_VARS) #TARGET_PLATFORM : android-3 #LOCAL_SDK_VERSION : 19 LOCAL_MODULE : libnative LOCAL_SRC_FILES : …

[Windows]7种网络编程I/O模型代码实现实例

From: http://blog.csdn.net/woshinia/article/details/8585930 部分代码参考《[WINDOWS网络与通信程序设计].王艳平》&#xff0c;网络中一些I/O模型的代码都没有对socket是否可写做过深入研究&#xff0c;我这边会提供一些解决方法。 阻塞模式下&#xff0c;send会发生阻塞…

VScode配置eslint保存自动格式化,eslint格式化去掉分号和双引号。vscode自动保存去掉分号和双引号;““

本文是开启eslint检验和配置eslint格式化&#xff1b;如果想要关闭eslint&#xff0c;查看这篇关闭eslint方法&#xff1b; 1.必须安装的三个插件eslint&#xff0c; prettier-Code formatter &#xff0c;vetur 2.配置setting.json 3.直接将下方代码复制&#xff0c;黏…

不要手贱自己去通过Javascript画html界面

IE就是一坨屎 不要使用原生的Javascript去画HTML. 使用类库&#xff0c;比如Juqery. 千万别手贱&#xff01; 原因之一 JS 通过CreateElement 动态生成的代码&#xff0c;使用setAttribute插入已有CSS样式不起作用 &#xff08;IE 6 - 8&#xff09;. 转载于:https://www.cnbl…

C#获取存储过程的 Return返回值和Output输出参数值

一、不用SQLHelper.cs等帮助类 1.获取Return返回值 程序代码 存储过程Create PROCEDURE MYSQL a int, b intAS return a bGOSqlConnection conn new SqlConnection(ConfigurationManager.ConnectionStrings["LocalSqlServer"].ToString());conn.Open();SqlComma…

uniapp网络请求封装;小程序请求接口封装;uni.request接口封装

另一篇全面封装文章 资源文章下载地址 1.正常使用uni.request()发送请求(未封装) get() {uni.request({url: http://192.168.1.191/abc//main/jiekouming/abclist?workType2,data: {},header: {Token: b042b36fwq909qwe9iiidsai2323sd232dw3},method: GET,success: (res) &…