Linux驱动编程day6-外部中断处理

原创 2016年08月28日 23:06:58

最基本的中断:外部高低电平中断
中断源:中断号60,PIO中断,
选择有中断输入功能的GPIO口作为中断输入
设置PIN脚功能为EINT(110)
定义PI12、PI13脚作为中断输入脚

#define D11     PI12
#define D12     PI13

设置PI12、PI13脚的功能为EINT功能(对应不同的中断编号)

#define PI12_13_SELECT_MASK (0xff<<16)
#define PI12_13_SELECT_EINT (0x66<<16)

不同功能,引脚内部的电路连接不同,通过改变寄存器Bit位的值,来改变引脚的功能(查看寄存器功能手册)
配置PI_CFG1寄存器:

regval = readl(PI_CFG1);
regval &= ~PI12_13_SELECT_MASK;
regval |= PI12_13_SELECT_EINT;
writel(regval, PI_CFG1); 

配置中断配置寄存器:(选择触发方式)

#define PIO_INT_CFG3        (PIO_BASE_REMAP + 0x20C)
#define CFG3_EINT24_25_MASK (0xff)
#define CFG3_EINT24_25_N_EDGE   (0x11)

//配置触发方式
regval = readl(PIO_INT_CFG3);
regval &= ~CFG3_EINT24_25_MASK; //先清零
regval |= CFG3_EINT24_25_N_EDGE; //相应位置位
writel(regval, PIO_INT_CFG3); 

打开中断使能

#define PIO_INT_CTL         (PIO_BASE_REMAP + 0x210)
//打开24、25中断
regval = readl(PIO_INT_CTL);
regval |= 3<<24;
writel(regval, PIO_INT_CTL);

注册中断处理程序:

重要函数:request_irq();
向内核出册中断号和中断函数的关系

#define PIO_IRQ     60  //中断源序号
//注册成功,中断名字“eint_drv”会出现在/proc/interrupts中
//参数0表示不共享中断源号,若设为IRQF_SHARED表示和其他设备共享这个中断,但要求其他设备也设为共享方式
err = request_irq(PIO_IRQ, eint_irq, 0, "eint_drv", NULL);
    if(err)
    {
         printk("request_irq 60 fail\n");
    }

中断处理函数:

//中断状态寄存器,哪个中断产生,哪一位被置1
#define PIO_INT_STATUS      (PIO_BASE_REMAP + 0x214)

unsigned int eint_status = 0;
irqreturn_t eint_irq(int irq, void *dev_id)
{
    //处理动作
    eint_status = readl(PIO_INT_STATUS); //读出寄存器的值
    if(eint_status & (1 << 24)){ //11脚产生中断
        ev_press = 1;
        writel(1 << 24, PIO_INT_STATUS); //写“1”清中断
    }
    if(eint_status & (1 << 25)){
        ev_press = 1;
        writel(1 << 25, PIO_INT_STATUS);
    }
    return IRQ_HANDLED;
}

释放中断号:

free_irq(PIO_IRQ, NULL);

配置所有的寄存器通常都是用过位运算进行写入,具体设置的值需要查看技术手册

关于_linux外部中断驱动异步通知应用程序

1,file 1,-> ent_test.c /* * file ent_test.c * Copyright by jiangdou QQ:344283973 * * RK3188 ENT...
  • u010402372
  • u010402372
  • 2015年11月26日 18:09
  • 1616

linux字符驱动之中断按键

在上一节中,我们讲解了如何自动创建设备节点,实现一个查询方式的按键驱动。测试的时候,大家都看到了,使用查询式的方法,占用CPU的利用率高达99%,那么有没有好的办法来取代这惨不忍睹的方法呢?答案当然是...
  • lwj103862095
  • lwj103862095
  • 2013年12月23日 21:53
  • 7965

深入理解Linux网络技术内幕——中断与网络驱动程序

接收到帧时通知驱动程序     在网络环境中,设备(网卡)接收到一个数据帧时,需要通知驱动程序进行处理。有一下几种通知机制: 轮询:     内核不断检查设备是否有话要说。(比较耗资源,但在一些...
  • Windeal
  • Windeal
  • 2015年03月19日 14:12
  • 1936

[Linux驱动入门]中断处理

中断处理程序是被内核调用来响应中断的,运行在中断上下文,中断处理程序是上半部,当接收到一个中断时,它就立即开始执行,但只做有严格时限的工作。 中断处理程序的注册是通过request_irq函数完成的,...
  • wzhCAlex
  • wzhCAlex
  • 2016年09月12日 21:26
  • 278

Linux设备驱动编程之中断处理

与Linux设备驱动中中断处理相关的首先是申请与释放IRQ的API request_irq()和free_irq(),request_irq()的原型为: int request_i...
  • mrwangwang
  • mrwangwang
  • 2012年11月17日 14:34
  • 251

[读书笔记]30 天自制操作系统 day6 分割编译与中断处理

1. 分割源文件 由于原先的bootpack.c 太过冗长, 将他分割成几个部分 同时为了节省声明所占空间, 使用 头文件 2. 整理Makefile 将多个类似的编译规则, 使用一般规则进行合并, ...
  • zhyh1435589631
  • zhyh1435589631
  • 2016年12月06日 12:44
  • 204

Linux驱动编程day5-驱动自动加载,编译进内核以及自动执行

驱动提供一种机制(实现什么功能), 应用程序提供一种策略(如何使用这些功能) 1、linux驱动自动加载ko和应用 (1)在自动执行脚本中添加应用程序 cd /etc/ 里有一个profile文...
  • qq_32266237
  • qq_32266237
  • 2016年08月27日 16:55
  • 81

Linux中断处理驱动程序编写

Linux中断处理驱动程序编写 中断与定时器: 中断的概念:指CPU在执行过程中,出现某些突发事件急待处理,CPU暂停执行当前程序,转去处理突发事件,处理完后CPU又返回原程序被中断的位...
  • jwc2436
  • jwc2436
  • 2014年12月23日 21:54
  • 1034

【Linux 驱动】第十章 中断处理

一,概念        1)什么是中断?             1>引入:                我们知道,处理器的处理速度比硬件来说要快上N个数量级,那么由处理器向硬件发出请求并...
  • tianshuai11
  • tianshuai11
  • 2012年04月20日 12:32
  • 1421

Linux设备驱动程序学习(11)-中断处理

Linux设备驱动程序学习(11)-中断处理 可以让设备在产生某个事件时通知处理器的方法就是中断。一个“中断”仅是一个信号,当硬件需要获得处理器对它的关注时,就可以发送这个信号。 Linux 处...
  • tigerly
  • tigerly
  • 2014年04月03日 15:28
  • 312
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux驱动编程day6-外部中断处理
举报原因:
原因补充:

(最多只允许输入30个字)