liunx 中断

  1. 先设置异常入口
  2. 异常向量

void __init trap_init(void) 构造了异常向量

  1. vector_irq+offset
 
 
 
按下按键:
  1. cpu自动进入异常模式
注册中断 使用request_irq(irq,handler,flags,name,dev_id)

{

分配一个irqaction

把irqaction放入irq_desc[irq]

使能设置引脚

使能中断

}

释放中断使用 free_irq(irq,dev_id)

{

将中断脱出链表

禁止中断

}

 
 
 

exec 5</dev/buttons,打开/dev/buttons这个设备,定位到文件描述符fd5,挂载到5下,会调用open

使用命令,exec 5<&-,关闭文件描述符fd5,释放中断。(会调用release)

 
 

cat /proc/interrupts 查看中断

休眠与唤醒

static DECLARE_WAIT_QUEUE_HEAD(button_waitq);

/* 中断事件标志, 中断服务程序将它置1,buttons_drv_read将它清0 */

static volatile int ev_press = 0;

 

唤醒:

ev_press = 1; /* 表示中断发生了 */

wake_up_interruptible(&button_waitq); /* 唤醒休眠的进程 */

休眠:

/*如果没有按键动作发生,休眠*/

wait_event_interruptible(button_waitq,ev_press);

/*如果没有按键有动作发生,返回*/

copy_to_user(buf,&key_val,1);

中断处理函数:buttons_irq

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_HANDLED;

}

  

read函数调用

int buttons_drv_close (struct inode *inode, struct file *file)

int buttons_drv_close (struct inode *inode, struct file *file)
{
/*释放中断 */
free_irq(IRQ_EINT0,&pins_desc[]);
free_irq(IRQ_EINT2,&pins_desc[]);
free_irq(IRQ_EINT11,&pins_desc[]);
free_irq(IRQ_EINT19,&pins_desc[]); return ;
}

创建中断:

/*创建中断*/

request_irq(IRQ_EINT0,buttons_irq,IRQT_BOTHEDGE,"S2",&pins_desc[0]);//IRQT_BOTHEDGE 双边沿触发 1设备ID IRQ_EINT0中断号

request_irq(IRQ_EINT2,buttons_irq,IRQT_BOTHEDGE,"S3",&pins_desc[1]);//IRQT_BOTHEDGE 双边沿触发 1设备ID IRQ_EINT0中断号

request_irq(IRQ_EINT11,buttons_irq,IRQT_BOTHEDGE,"S4",&pins_desc[2]);//IRQT_BOTHEDGE 双边沿触发 1设备ID IRQ_EINT0中断号

request_irq(IRQ_EINT19,buttons_irq,IRQT_BOTHEDGE,"S5",&pins_desc[3]);//IRQT_BOTHEDGE 双边沿触发 1设备ID IRQ_EINT0中断号

 

rmmod 调用 static void buttons_drv_exit(void)

insmod 调用:static int buttons_drv_init(void)

释放中断:

/*释放中断 */

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]);

liunx驱动----按键中断的更多相关文章

  1. S3C2440—12.按键中断

    文章目录 一. 总体 二. CPSR设置 三. 中断源设置 四. 中断控制器设置 五. C中断处理函数 六. 汇编IRQ异常处理程序 七. 源码 一. 总体 要驱动按键中断控制LED亮灭,程序要进行如 ...

  2. 2、CC2541芯片中级教程-OSAL操作系统(进一步了解-OLED && 普通按键和5方向按键-中断!!!)这个系统驱动层和应用层不一样~

    本文根据一周CC2541笔记汇总得来—— 适合概览和知识快速索引—— 全部链接: 中级教程-OSAL操作系统\OSAL操作系统-实验01 OSAL初探 [插入]SourceInsight-工程建立方法 ...

  3. Linux驱动设计—— 中断与时钟

    中断和时钟技术可以提升驱动程序的效率 中断 中断在Linux中的实现 通常情况下,一个驱动程序只需要申请中断,并添加中断处理函数就可以了,中断的到达和中断函数的调用都是内核实现框架完成的.所以程序员只 ...

  4. linux驱动之中断方式获取键值

    linux驱动之中断方式获取键值 ----------------------------------------------------------------------------------- ...

  5. ZigBee按键中断

    何为按键中断? 在了解按键中断之前,我们先来了解一下什么是中断?中断就是程序执行当前代码,当前任务的时候: 突然有自身函数或外部的影响,而使程序执行到别的任务再回来. 举个栗子: 当你在做饭的时候,电 ...

  6. nios II--实验4——按键中断硬件部分

    按键中断 硬件开发 新建原理图 1.打开Quartus II 11.0,新建一个工程,File -> New Project Wizard…,忽略Introduction,之间单击 Next&g ...

  7. ok6410按键中断编程,linux按键裸机

    6410按键中断编程 一.流程分析 外部中断控制寄存器(s3c6410x  359页) 1.EINTxCONy: 外部中断组x的第y个控制器.这个就是设置中断的触发方式.有5种触发方式. 2.EINT ...

  8. Linux kernel的中断子系统之(五):驱动申请中断API

    返回目录:<ARM-Linux中断系统>. 总结:二重点区分了抢占式内核和非抢占式内核的区别:抢占式内核可以在内核空间进行抢占,通过对中断处理进行线程化可以提高Linux内核实时性. 三介 ...

  9. liunx驱动----系统滴答时钟的使用

    2019-3-12系统滴答定时器中断使用 定义一个timer ​​ 其实就是使用系统的滴答定时器产生一个中断. 初始化timer init_timer函数 实现如下 void fastcall ini ...

随机推荐

  1. debian包的补丁管理工具:quilt

    最近项目是改pam软件包,给里面添加一些功能.其中遇到了更改后,代码提交方式的问题.这里转载的文章介绍了使用quilt管理补丁的详细方法: 转自:http://blog.csdn.net/fmddlm ...

  2. maven入门概念及使用

    Maven 一.Maven概念 1.maven是什么:Maven 是一个项目管理工具.它负责管理项目开发过程中的几乎所有的东西. 版本.构建.输出物管理.依赖关系.文档和构建结果.项目关系.移植性管理 ...

  3. IPV6配置

    云友“学渣王 ”在帖子里提到需要为阿里云ECS配置IP6地址,根据网上的一些信息,写此例.  如果要求是FQDN地址,请登录到您的域名控制面板,设置一条AAAA记录到新设置的IPv6隧道地址.  在阿 ...

  4. Kali 2.0使用SSH进行远程登录

    注:此文为转载他人博客,不用做商业用途,如有侵权,请联系我删除 一.配置SSH参数 修改sshd_config文件,命令为: vi /etc/ssh/sshd_config 将#PasswordAut ...

  5. 12生成器,send,推导式

    # 1.生成器的本质就是迭代器 # 2.通过函数变成一个生成器 # def func(): # print(1) # yield 5 # 我的函数走到这了 # print(2) # yield 9 # ...

  6. LeetCode 96 - 不同的二叉搜索树 - [DP]

    假定 $f[n]$ 表示有 $n$ 个节点的二叉树,有多少种不同结构. 因此 $f[n] = \sum_{i=0}^{n-1} (f[i] \times f[n-1-i])$,选一个节点作为根节点,那 ...

  7. 学习ActiveMQ(三):发布/订阅模式(topic)演示

    1.在这个项目中新增两个java类,主题生产者和主题消费者: 2.和点对点的代码差别并不大,所以将消费者和生产者的分别代码拷入新增的java类中,再修改就好了. appProducerTopic代码: ...

  8. Jmeter正则表达式提取器

    https://www.cnblogs.com/tudou-22/p/9566894.html Jmeter中关联是通过“添加—后置处理器—正则表达式提取器”来获取数据 一.获取单个数据

  9. PySe-007-解决“Chrome正在受到自动软件的控制”

    python使用selenium启动chrome的代码如下所示: #!/usr/local/bin/python # -*- coding: utf-8 -*- from selenium impor ...

  10. mysql实现开窗函数

    mysql实现开窗函数 http://blog.itpub.net/29989552/viewspace-2123077/ 学习过oracle的应该知道,oracle中的分析函数功能十分强大,包括ms ...