为什么linux外部中断驱动都没有配置相应的io寄存器,A20 GPIO中断类型差别结果迥异的问题思考...

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延时一下处理也是可以绕过去的。望哪位大侠清楚的解释一下。

stm32定时器中断类型分析

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

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

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

LPC1788的外部中断和GPIO中断

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

LPC1768外部中断与GPIO中断

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

esp8266 SDK开发之GPIO中断

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

TI-RTOS 之 GPIO中断(按键)

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

MSP430 G2553 LaunchPad GPIO中断

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

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

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

Linux Zynq GPIO中断

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

随机推荐

BOM 和DOM

BOM 1.BOM:浏览器对象模型(Browser Object Model)尚无正式标准: 2.Window 对象:所有浏览器都支持 window 对象.它表示浏览器窗口. 3.Window 尺寸 ...

推荐系统学习--cb&plus;cf 初见

对于推荐系统的推出有两个条件:1.信息过载 ,2用户没有明确的需求 推荐系统算法中常见的有基于内容推荐,协同过滤推荐,协同过滤还可以分为基于人的协同过滤,基于内容协同过滤:社会推荐等 如何理解这些推荐 ...

html focus事件小学问

focus事件千万不要有alert方法,不然在有些浏览器会进入死循环的.例如:$('#test').focus(function(){ alert('dead loop'); }); 在chrome下 ...

springmvc下使用kaptcha做验证码

http://www.open-open.com/lib/view/open1395238908947.html

C&num;基础之枚举

1.认识Enum 以前一直以为Enum是值类型,在VS中查看Enum的定义时才发现它是一个抽象的类.但是这个类很奇怪,Enum继承了ValueType这个很熟悉的值类型基类,它是唯一一个继承自Valu ...

分享25个CSS前端网页设计常用技巧

1.ul标签在Mozilla中默认是有padding值的,而在IE中只有margin有值.2.同一个的class选择符可以在一个文档中重复出现,而id选择符却只能出现一次;对一个标签同时使用class ...

&lbrack;Express&rsqb; Level 3&colon; Massaging User Data

Flexible Routes Our current route only works when the city name argument matches exactly the propert ...

wordpress chronus主题 显示文章阅读数

wordpress chronus主题 显示文章阅读数 第一步:将下面的代码拷贝到文件 /wp-content/themes/chronus/inc/template-tags.php 中 funct ...

cf351B Jeff and Furik &lpar;树状数组&rpar;

逆序对数=0的时候,这个数列是有序的 然后交换相邻的,看哪个比较大,逆序对数会加1或减1 Jeff用的是最优策略所以他肯定让逆序对数-1 设f[i]表示Jeff操作前,逆序对数为i,最终的期望次数 那 ...

在引用的laravel的&commat;include子模板中传递参数

调用传参: @include("message",['msg'=>'中国']) 在message子模板中调用msg的值: {{msg}}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值