① request_irq函数用于注册中断

int request_irq(unsigned int irq, void(*handler)(int, void*, struct pt_reg*), unsigned long flags, const char* devname, void* dev_id);

(1)irq:中断号

(2)handler:中断处理函数

(3)flags:与中断管理有关的各种选项

(4)devname :设备名

(5)dev_id:共享中断是使用,区分不同中断

(6)返回0表示成功,或者返回一个错误码

② 在flags参数中,可以选择一些与中断管理有关的选项

(1)IRQF_DESABLED(SA_INTERRUPT):如果改位置位,表示是一个“快速”中断处理程序;如果没有置位该位,是一个“慢速”中断处理程序

(2)IRQF_SHARED(SA_SHIRQ):该位表明中断号是被多个中断源共享的

③ 快、慢速中断的主要区别在于:快速中断保证中断处理的原子性(不被打断),而慢速中断则不保证。换句话说,也就是“开启中断”标志位(处理器IF位)在运行快速中断处理程序时是关闭的,因此在服务该中断时,不会被其他类型的中断打断;而调用慢速中断处理时,其它类型的中断仍可以得到服务

④ 中断处理程序的特别之处是在中断上下文中运行的,它的行为受到某些限制:

(1)不能使用可能引起阻塞的函数

(2)不能使用可能引起调度的函数

⑤ 当设备不再需要使用中断时(通常在卸载驱动时),应当把它注销,使用函数:

void free_irq(unsigned int irq, void* dev_id);

⑥ 进程上下文和中断上下文

(1)进程上下文:用户空间的应用程序,通过系统调用,进入内核空间。这个时候用户空间的进程要传递很多变量、参数的值给内核,内核态运行的时候也要保存用户进程的一些寄存器的值、变量等。所谓的“进程上下文”,可以看做是用户传递给内核的这些参数以及内核要保存的那一整套变量和寄存器的值以及当时的环境。

(2)中断上下文:用户通过触发信号,导致内核调用中断处理程序,进入内核空间。这个过程中,硬件的一些变量和参数也要传递给内核,内核通过这些参数进行中断处理。所谓的“中断上下文”,其实可以看做就是硬件传递过来的这些参数和内核需要保存的一些其他环境(主要是当前被打断执行的进程环境)

⑦ 简单示例

#include <linux/module.h>
#include <linux/init.h>
#include <linux/miscdevice.h>
#include <linux/interrupt.h>
#include <linux/fs.h>
#include <linux/io.h>

#define GPGCON 0x56000060

irqreturn_t key_int(int irq, void *dev_id)
{
    //1. 检测是否发生了按键中断

    //2. 清除已经发生的按键中断

    //3. 打印按键值
    printk("key down!\n");

    ;
}

void key_hw_init(void)
{
    unsigned short data;
    unsigned int *gpio_config;

    gpio_config = ioremap(GPGCON, );

    data = readw(gpio_config);
    data &= ~0b11;
    data |= 0b10;

    writew(data, gpio_config);
}

int key_open(struct inode *node, struct file *filp)
{
    ;
}

struct file_operations key_fops =
{
    .open = key_open,
};

struct miscdevice key_miscdev = {
    .minor = ,
    .name = "Mini2440Key",
    .fops = &key_fops,
};

static int button_init(void)
{
    misc_register(&key_miscdev);

    //按键硬件初始化
    key_hw_init();

    //注册中断处理程序
    request_irq(IRQ_EINT8, key_int, IRQF_TRIGGER_LOW, );

    ;
}

static void button_exit(void)
{
   free_irq(IRQ_EINT8, 0);   misc_deregister(&key_miscdev);
}

module_init(button_init);
module_exit(button_exit);

Linux按键设备驱动一的更多相关文章

  1. Linux混杂设备驱动

    1. Linux混杂设备驱动模型 ① 在Linux系统中,存在一类字符设备,它们拥有相同的主设备号(10),但次设备号不同,我们称这类设备为混杂设备(miscdevice).所有混杂设备形成一个链表, ...

  2. 蜕变成蝶~Linux设备驱动之按键设备驱动

    在上述的驱动系列博客中,我们已经了解了关于阻塞和非阻塞.异步通知.轮询.内存和I/O口访问.并发控制等知识,按键设备驱动相对来说是比较简单的,本章内容可以加深我们对字符设备驱动架构.阻塞与非阻塞.中断 ...

  3. linux块设备驱动之实例

    1.注册:向内核注册个块设备驱动,其实就是用主设备号告诉内核这个代表块设备驱动 sbull_major  =  register_blkdev(sbull_major, "sbull&quo ...

  4. Linux 视频设备驱动V4L2最常用的控制命令

    http://blog.csdn.net/shaolyh/article/details/6583226 Linux 视频设备驱动V4L2最常用的控制命令使用说明(1.02) 命令 功能 VIDIOC ...

  5. 深入理解Linux字符设备驱动

    文章从上层应用访问字符设备驱动开始,一步步地深入分析Linux字符设备的软件层次.组成框架和交互.如何编写驱动.设备文件的创建和mdev原理,对Linux字符设备驱动有全面的讲解.本文整合之前发表的& ...

  6. Linux字符设备驱动结构(一)--cdev结构体、设备号相关知识机械【转】

    本文转载自:http://blog.csdn.net/zqixiao_09/article/details/50839042 一.字符设备基础知识 1.设备驱动分类 linux系统将设备分为3类:字符 ...

  7. Smart210学习记录----beep linux字符设备驱动

    今天搞定了beep linux字符设备驱动,心里还是很开心的,哈哈...但在完成的过程中却遇到了一个非常棘手的问题,花费了我大量的时间,,,, 还是把问题描述一下吧,好像这个问题很普遍的,网上许多解决 ...

  8. Linux块设备驱动详解

    <机械硬盘> a:磁盘结构 -----传统的机械硬盘一般为3.5英寸硬盘,并由多个圆形蝶片组成,每个蝶片拥有独立的机械臂和磁头,每个堞片的圆形平面被划分了不同的同心圆,每一个同心圆称为一个 ...

  9. linux lcd设备驱动剖析四

    在"linux lcd设备驱动剖析二"文章中,我们详细分析了s3c24xxfb_probe函数. 文章链接:http://blog.csdn.net/lwj103862095/ar ...

随机推荐

  1. ESP8266文档阅读2A-SDK-Espressif IoT SDK 使用手册v1.0.1.pdf

    2A-SDK-Espressif IoT SDK 使用手册v1.0.1.pdf 1.前言 本⽂文主要介绍基于ESP8266物联⺴⽹网模块的SDK相关使⽤用⽅方法,包括开发⼯工具使⽤用以及SDK软件包架 ...

  2. HDU 3729 I'm Telling the Truth (二分匹配)

    题意:给定 n 个人成绩排名区间,然后问你最多有多少人成绩是真实的. 析:真是没想到二分匹配,....后来看到,一下子就明白了,原来是水题,二分匹配,只要把每个人和他对应的区间连起来就好,跑一次二分匹 ...

  3. 关于IIS配置SimpleHandlerFactory-Integrated在其模块列表中有一个错误模块ManagedPipelineHandler的错误处理

    解决方法: 使用管理员运行aspnet_regiis.exe 命令:%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i v ...

  4. 转换汉子首字母类 CreatChinaSpell

    public class CreatChinaSpell { public static string GetChineseFirstChar(string chineseStr) { StringB ...

  5. 将“100px” 转换为100

    parseInt("100px") //结果是100

  6. 【转】快速开发移动医疗App!开源框架mHealthDroid

    原文地址:http://www.csdn.net/article/2014-12-12/2823096-mHealhDroid mHealthDroid是一款开源的移动框架,主要用于帮助开发者快速而又 ...

  7. React Relay 实现

    React客户端调用GraphQL 一.通过Relay框架中的QueryRenderer组件实现数据交互,有2点需要注意一下: 1.query的命名: 注意query前缀保持和js文件名一致,ex: ...

  8. Delphi XE8中开发DataSnap程序常见问题和解决方法 (二)想对DBExpress的TSQLDataSet写对数据库操作的SQL语句出错了!

    当我们搞定DataSnap后,我们进入客户端程序开发阶段了,我们建立了客户端模块后,打算按照刚才开发服务器的步骤开发客户端程序,随后加入了DBExpress的TSQLDataSet,设定数据库连接后, ...

  9. Duration Assertion(持续时间)

    Duration Assertion用来测试每一个响应的时间是否小于给定的值,任何超过给定毫秒数的响应都会标记为失败. Duration in milliseconds:响应的持续时间是否在给定的值范 ...

  10. SpringMVC中静态文件的引用

    1.在WebRoot目录下创建 resources文件,里面可以放入css文件 2.在SpringMVC中的配置文件dispatcherServlet-servlet.xml中加入 <!-- 将 ...