A20 GPIO中断类型差别结果迥异的问题思考
生活随笔
收集整理的這篇文章主要介紹了
A20 GPIO中断类型差别结果迥异的问题思考
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
A20GPIO中斷類型差別結(jié)果迥異的問題思考
?
最近在使用全志A20做開發(fā)時(shí),發(fā)現(xiàn)在處理中斷的時(shí)候,用電平觸發(fā)模式,報(bào)中斷比較亂,用邊沿觸發(fā)則很穩(wěn)定,不會(huì)亂報(bào)。筆者感到比較困惑,筆者用電平觸發(fā)寫的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_NEGATIVEif(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; }?
中斷類型設(shè)置成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?
? ? ? ? ? 用邊沿觸發(fā)寫的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時(shí)還可以設(shè)置中斷類型為TRIG_EDGE_DOUBLE,筆者暫時(shí)沒有采用,中斷打印信息正常,如下:
?
root@android:/ # [ 517.116361] IRQ sw_reverseCar_irq: 0 io:188, value:1 [ 518.103095] IRQ sw_reverseCar_irq: 1 io:188, value:0root@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?
? ? ? ? ?筆者不清楚原因,懷疑是芯片驅(qū)動(dòng)的問題,但是驅(qū)動(dòng)也就那樣寫了啊,難道是芯片設(shè)計(jì)的問題,當(dāng)然這種也就是在剛有中斷時(shí)會(huì)有亂irq上來,如果用delaywork延時(shí)一下處理也是可以繞過去的。望哪位大俠清楚的解釋一下。
?
轉(zhuǎn)載于:https://www.cnblogs.com/james1207/p/3292052.html
總結(jié)
以上是生活随笔為你收集整理的A20 GPIO中断类型差别结果迥异的问题思考的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于Kb/s,KB/s的一些知识
- 下一篇: 9012教你如何使用gulp4开发项目脚