A20GPIO中断类型差别结果迥异的问题思考

最近在使用全志A20做开发时,发现在处理中断的时候,用电平触发模式,报中断比较乱,用边沿触发则很稳定,不会乱报。笔者感到比较困惑,笔者用电平触发写的code如下:

   reverseHandle = sw_gpio_irq_request(gReverseCar_gpio_hdle.gpio, TRIG_LEVL_HIGH, \
&sw_reverseCar_irq_Handle, &privateData);
if (!reverseHandle) {
printk("Failed to get gpio irq for reverse car detection\n");
} privateData.trigtype = TRIG_LEVL_HIGH; static int sw_reverseCar_irq_Handle(void *para){
printk("IRQ sw_reverseCar_irq: %d ", privateData.trigtype); printk("IO:%d, value:%d\n",gReverseCar_gpio_hdle.gpio, \
__gpio_get_value(gReverseCar_gpio_hdle.gpio)); sw_gpio_eint_set_enable(gReverseCar_gpio_hdle.gpio, 0);
sw_gpio_eint_clr_irqpd_sta(gReverseCar_gpio_hdle.gpio);
//TRIG_LEVL_LOW TRIG_LEVL_HIGH TRIG_EDGE_POSITIVE TRIG_EDGE_NEGATIVE
if(privateData.trigtype == TRIG_LEVL_HIGH) {
if(0 == sw_gpio_eint_set_trigtype(gReverseCar_gpio_hdle.gpio,TRIG_LEVL_LOW))
privateData.trigtype = TRIG_LEVL_LOW;
} else if(privateData.trigtype == TRIG_LEVL_LOW) {
if(0 == sw_gpio_eint_set_trigtype(gReverseCar_gpio_hdle.gpio,TRIG_LEVL_HIGH))
privateData.trigtype = TRIG_LEVL_HIGH; } sw_gpio_eint_set_enable(gReverseCar_gpio_hdle.gpio, 1); return 0;
}

中断类型设置成DEBO中断打印信息有问题,具体如下:

root@android:/ # [  519.018955] IRQ sw_reverseCar_irq: 2 IO:188, value:1
[ 519.024773] IRQ sw_reverseCar_irq: 3 IO:188, value:1
[ 519.030576] IRQ sw_reverseCar_irq: 2 IO:188, value:1
[ 519.036378] IRQ sw_reverseCar_irq: 3 IO:188, value:1
[ 519.042169] IRQ sw_reverseCar_irq: 2 IO:188, value:1 [ 520.898643] IRQ sw_reverseCar_irq: 3 IO:188, value:0
[ 520.904456] IRQ sw_reverseCar_irq: 2 IO:188, value:0
[ 520.910363] IRQ sw_reverseCar_irq: 3 IO:188, value:0
[ 520.916215] IRQ sw_reverseCar_irq: 2 IO:188, value:0
[ 520.921995] IRQ sw_reverseCar_irq: 3 IO:188, value:0
[ 520.927832] IRQ sw_reverseCar_irq: 2 IO:188, value:0
[ 520.933612] IRQ sw_reverseCar_irq: 3 IO:188, value:0
[ 520.939432] IRQ sw_reverseCar_irq: 2 IO:188, value:0
[ 520.945317] IRQ sw_reverseCar_irq: 3 IO:188, value:0

用边沿触发写的code如下,

   gPrivData.trigtype = TRIG_EDGE_POSITIVE;
gPrivData.irqReqHandle = sw_gpio_irq_request(gPrivData.gpio_hdle.gpio, TRIG_EDGE_POSITIVE, \
(peint_handle)&sw_reverseCar_irq_Handle, (void *)&gPrivData);
static int sw_reverseCar_irq_Handle(void *para){
//printk("IRQ sw_reverseCar_irq: %d ", gPrivData.trigtype); gPrivData.CarStatus = __gpio_get_value(gPrivData.gpio_hdle.gpio);
//printk("io:%d, value:%d\n",gPrivData.gpio_hdle.gpio, gPrivData.CarStatus); /*if app has no capacity for handle reverse event, system need reboot*/
if(1 == gPrivData.needRebootFlag) {
printk("Reboot for handle reverse in boot now!\n");
*(volatile __u32 *)(0xf1c20c94) = 0x3;
} up(&gPrivData.sem_lock); sw_gpio_eint_set_enable(gPrivData.gpio_hdle.gpio, 0);
sw_gpio_eint_clr_irqpd_sta(gPrivData.gpio_hdle.gpio); if(gPrivData.trigtype == TRIG_EDGE_POSITIVE) {
if(0 == sw_gpio_eint_set_trigtype(gPrivData.gpio_hdle.gpio,TRIG_EDGE_NEGATIVE))
gPrivData.trigtype = TRIG_EDGE_NEGATIVE;
} else if(gPrivData.trigtype == TRIG_EDGE_NEGATIVE) {
if(0 == sw_gpio_eint_set_trigtype(gPrivData.gpio_hdle.gpio,TRIG_EDGE_POSITIVE))
gPrivData.trigtype = TRIG_EDGE_POSITIVE; } sw_gpio_eint_set_enable(gPrivData.gpio_hdle.gpio, 1); return 0;
}

EDGE时还可以设置中断类型为TRIG_EDGE_DOUBLE,笔者暂时没有采用,中断打印信息正常,如下:

root@android:/ # [  517.116361] IRQ sw_reverseCar_irq: 0 io:188, value:1
[ 518.103095] IRQ sw_reverseCar_irq: 1 io:188, value:0 root@android:/ # [ 520.918512] IRQ sw_reverseCar_irq: 0 io:188, value:1
[ 521.876038] IRQ sw_reverseCar_irq: 1 io:188, value:0
[ 527.796107] IRQ sw_reverseCar_irq: 0 io:188, value:1
[ 528.843397] IRQ sw_reverseCar_irq: 1 io:188, value:0
[ 531.335858] IRQ sw_reverseCar_irq: 0 io:188, value:1
[ 532.306660] IRQ sw_reverseCar_irq: 1 io:188, value:0
[ 534.552011] IRQ sw_reverseCar_irq: 0 io:188, value:1
[ 535.101586] IRQ sw_reverseCar_irq: 1 io:188, value:0

笔者不清楚原因,怀疑是芯片驱动的问题,但是驱动也就那样写了啊,难道是芯片设计的问题,当然这种也就是在刚有中断时会有乱irq上来,如果用delaywork延时一下处理也是可以绕过去的。望哪位大侠清楚的解释一下。

A20 GPIO中断类型差别结果迥异的问题思考的更多相关文章

  1. stm32定时器中断类型分析

    一直在用的stm32定时器的中断都是TIM_IT_Update更新中断,也没问为什么,直到碰到有人使用TIM_IT_CC1中断,才想到这定时器的中断类型究竟有什么区别,都怪当时学习stm32的时候不够 ...

  2. 在xilinxFPGA上使用microblaze及自写GPIO中断

    很久很久没有更新过博客了,今天来扒一扒FPGA上CPU软核的使用. 主要完成的功能:使用的开发板是nexys 4 DDR,板上有16个switch以及16个LED,需要完成microblaze对led ...

  3. LPC1788的外部中断和GPIO中断

    首先是gpio中断,这一点和1768不同,1768使用的中断时和eint3共用中断通道,到了1788,专门为gpio开辟了中断 #ifndef __JOYPAD_H_ #define __JOYPAD ...

  4. LPC1768外部中断与GPIO中断

    LPC1768的外部中断严格来说只有四个,分别是EINT0,EINT1,EINT2,EINT3,技术手册上有如下说明 控制这四个外部中断靠以下寄存器 这三个寄存器的0 1 2 3位分别代表中断的0 1 ...

  5. esp8266 SDK开发之GPIO中断

    先秀一下自己焊的板子,黑的开关用于复位,蓝的开关用于烧录程序. 首先要明确的是esp8622的大多数管脚都有多个功能, 比如可以用来当做GPIO管脚,还可以用来当做SPI管脚. 如下图所示 使用PIN ...

  6. TI-RTOS 之 GPIO中断(按键)

    TI-RTOS 之 GPIO中断(按键) 前面已经用过LED, 定时器,这次来了解GPIO的中断是怎么用的,从CC1310+TI-RTOS的例程可以直接找到相应的例子程序,它的关键是在于要使能中断,也 ...

  7. MSP430 G2553 LaunchPad GPIO中断

    P1.P2端口上的每个管脚都支持外部中断.P1端口的所有管脚都对应同一个中断向量(Interrupt Vector),类似的,P2端口的所有管脚都对应另一个中断向量:通过PxIFG寄存器来判断中断来源 ...

  8. tiny4412学习(四)之移植linux-设备树(1)设备树基础知识及GPIO中断【转】

    本文转载自:http://blog.csdn.net/fengyuwuzu0519/article/details/74177978 版权声明:本文为博主原创文章,转载请注明http://blog.c ...

  9. Linux Zynq GPIO中断

    注册中断:对每个pin进行循环遍历for (pin_num = 0; pin_num < min_t(int, ZYNQ_GPIO_NR_GPIOS,  (int)chip->ngpio) ...

随机推荐

  1. Docker的C/S模式详解

    Docker的C/S模式 Docker的C/S模式 Docker Client通过Remote API与Docker Server通信: RESTful风格API STDIN.STDOUT.STDER ...

  2. STRUTS2核心控制器:FilterDispatcher

    1. 在 struts1.x 系列中 , 所有的请求是通过一个 servlet(ActionServlet) 来管理控制的 , 在 Struts2.X 而是经过一个 Filter 来处理请求的. St ...

  3. 关系数据库标准语言SQL的基本问答

    1 .试述 sQL 语言的特点. 答: (l)综合统一. sQL 语言集数据定义语言 DDL .数据操纵语言 DML .数据控制语言 DCL 的功能于一体. (2)高度非过程化.用 sQL 语言进行数 ...

  4. private、 protected、 public、 internal 修饰符的访问权限

    private : 私有成员, 在类的内部才可以访问. protected : 保护成员,该类内部和继承类中可以访问. public : 公共成员,完全公开,没有访问限制. internal: 当前程 ...

  5. linux修改文本模式下的分辨率(CentOS6.4)

    root登录 vi /boot/grub/menu.lst 看到如下界面: 红框全出位置为分辨率设置,设置参数如下: 保存 shutdown -r now

  6. JS---DOM概述

    DOM DOM:文档对象模型document object model DOM三层模型: DOM1:将HTML文档封装成对象 DOM2:将XML文档封装成对象 DOM3:将XML文档封装成对象 DOM ...

  7. linux搭建php

    http://www.cnblogs.com/wubaiqing/archive/2011/11/08/2241195.html 四,启动php-fpm & Nginx /usr/local/ ...

  8. 计算机世界的道(C/ASM)生一(OS),一生二(API),二生万象(MFC/COM)——学包装技术的程序员将来会损失比较大,因为不了解本质,一旦包装过时就会被淘汰

    道生一,一生二,二生万象.OO的思想就是抽象,万象归宗,化繁为简.99%的程序员使用OO,或者所谓的类库的目的就是好用,不必了解内部实现就可以直接达到所期望的结果.这时一种生产力的进步,一种流水线式半 ...

  9. iOS6和iOS7代码的适配(1)

    苹果的iOS7推出后,对于所有的应用来说都提出了一个天然的需求--适配不同版本的SDK.目前来说,用iOS6的SDK生成的应用,可以在iOS7的系统上跑,UI上也保持了原来的风格样式,这是苹果做的向下 ...

  10. rgbdslam_v2安装并使用

    rgbdslam_v2安装并使用 此文档为原创,转载请注明来自CSDN Jasmine_shine的专栏 网址:http://blog.csdn.net/jasmine_shine/article/d ...