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延时一下处理也是可以绕过去的。望哪位大侠清楚的解释一下。
A20 GPIO中断类型差别结果迥异的问题思考的更多相关文章
- 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) ...
随机推荐
- ajax重复提交到相同url时出现的问题
如 $.ajax({ url : url, success : function(ret) { if (!noProgress){cniia.closeProgress();} i ...
- listview 点击条目 自动置顶或者自动置底部
关于Listview点击条目,自动滑动到点击条目实现: map_searchresult_list.post(new Runnable() { @Override public void run() ...
- cookie记录用户的浏览商品的路径
在电子商务的网站中,经常要记录用户的浏览路径,以判断用户到底对哪些商品感兴趣,或者哪些商品之间存在关联. 下面将使用cookie记录用户的浏览过的历史页面.该网站将每个页面的标题保存在该页面的$TIT ...
- cad移动图案
1.键盘按快捷键M,鼠标变成小方块,选中图案,右击,左击拖动图像 2.选中图像,键盘按m,拖动图像 3.选中图像,右击,图像移动
- intent传对象
intent还有一个很好用的地方,就是传输对象,但要注意的是这里的传输只是将对象复制了一份通过intent进行传递,并不能达到实时更新的效果,也就是这个对象等偏重于“读”.intent对这个对象有着严 ...
- 使用C#开发Metro 风格应用的路线图 -- 触屏操作
原文 http://www.cnblogs.com/icuit/archive/2012/05/01/2478312.html win8支持多点触摸技术,而我们在屏幕上所做的各种操作,也最终转换为输入 ...
- Puppet的执行过程
图1 Puppet工作流程 1. 客户端Puppetd向Master发起认证请求,或使用带签名的证书. 2. Master告诉Client你是合法的. 3. 客户端Puppetd调用Facter,Fa ...
- Linux-storage-stack-diagram
just a diagram 一目了然. 对于isci 只是用过LIO和STGT 两种后端. 这里有各种后端的比较. http://scst.sourceforge.net/comparison.ht ...
- openNebula dubug
lowest common denominator convenient way to manage virtual machines
- _.remove的用法
var array = [1, 2, 3, 4]; var evens = _.remove(array, function(n) { return n % 2 == 0; }); console.l ...