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_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;
}

?

中斷類型設置成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: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

?

? ? ? ? ?筆者不清楚原因,懷疑是芯片驅動的問題,但是驅動也就那樣寫了啊,難道是芯片設計的問題,當然這種也就是在剛有中斷時會有亂irq上來,如果用delaywork延時一下處理也是可以繞過去的。望哪位大俠清楚的解釋一下。


?

轉載于:https://www.cnblogs.com/james1207/p/3292052.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/247620.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/247620.shtml
英文地址,請注明出處:http://en.pswp.cn/news/247620.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

div內圖片和文字水平垂直居中

大小不固定的圖片、多行文字的水平垂直居中 本文綜述 想必寫css的都知道如何讓單行文字在高度固定的容器內垂直居中,但是您知道或者想過讓行數不固定的文字在高度固定的容器內垂直居中呢?本文將會告訴你如何實現多行文字的垂直居中顯示。 關于圖片垂直居…

sticky-footer實現記錄

sticky-footer是css中的一個經典問題: 當頁面內容超出屏幕,頁腳模塊會像正常頁面一樣,被推到內容下方,需要拖動滾動條才能看到。 而當頁面內容小于屏幕高度,頁腳模塊會固定在屏幕底部,就像是底邊距為零的…

敏友的【敏捷個人】有感(3): 有感于“敏捷個人”討論與練習

2010年我對個人管理進行了自己的一些思考,在2011年提出敏捷個人概念,并且在線上、線下進行了多次交流,在一些大會上也做過分享。現在,已經有很 多IT和非IT的敏友們知道并在踐行敏捷個人,幫助自己更快的成長。我收到大家…

jQuery編寫插件

引言: 在項目中不同頁面經常要用到已經寫好的交互,比如彈窗,比如下拉菜單,比如選項卡,比如刪除... 此時如果每次都把代碼copy一份無疑是一件比較麻煩并且無趣的事情,而且個人認為有些low了,我們…

webstorm中nodejs代碼提示

preferences->languages&frameworks->Node.js and Npm中選擇一個本地的node版本 preferences->languages&frameworks->JavaScript->Libraries 勾選node.js Core 回到代碼

9012教你如何使用gulp4開發項目腳手架

本文將會介紹如何使用gulp4來搭建項目腳手架,如果您還在使用gulp3或更老的版本,您也以通過本文的一些思想將之前的項目進行完善,更新。如果gulp不是你們團隊的重點,也可以移步我的另一篇文章:用 webpack 4.0 擼單頁/多頁腳手架 (j…

nodejs模塊

nodejs模塊遵循commonJS規范,但并不是完全實現規范,主要使用require引入模塊、使用exports導出模塊。 導出屬性或方法 使用exports mouduleA.js: var say function(world){console.info("say: "world); }var sing function(wo…

Array.prototype.slice.call(arguments)

Array.prototype.slice.call(arguments)能將具有length屬性的對象轉成數組,除了IE下的節點集合(因為ie下的dom對象是以com對象的形式實現的,js對象與com對象不能進行轉換)如:1 var a{length:2,0:first,1:second}; 2 Ar…

動態內存分配導致內存泄漏之處

摘要:舉了幾個動態內存分配過程中,發生內存泄漏的例子 1. 分配了內存,卻沒有及時刪除,導致泄漏 1: void doSomething() 2: { 3: int *pnValue new int; 4: } 2. 為指針變量分配了一個內存,然后又讓指針變量指向其他的值,導致…

nodejs常用模塊-url

URL nodejs中針對url的常用方法。 node下打印url,結果: 引入url模塊 var url require(url) 1、parse方法 將url解析成對象,parse方法原型: url.parse(urlStr[, parseQueryString][, slashesDenoteHost]) 可傳遞三個參數…

常用的javascript設計模式

請堅持 什么是設計模式 百度百科: 設計模式(Design pattern)是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。 使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。 毫無疑問,設計模式…

express項目創建

1、安裝項目生成器 cnpm i express-generator -g express4.0以后,express與express-generator包分離,全局使用express命令生成項目骨架時應該安裝express-generator包。 2、生成項目骨架 express server 默認使用的是jade模板,使用ejs模…

設置Jexus開機啟動

把jexus做成系統服務,就像windows服務一樣,可以設置開機啟動就可以了。 第一、進入目錄 /lib/systemd/system/ 第二、新建文件 vi jexus.service 文件內容 [Unit] Descriptionjexus Afternetwork.target[Service] Typeforking ExecStart/usr/jexus/jw…

iOS警告-This block declaration is not a prototype

關于警告 我們定義一個不帶參數的block,通常是如下的方式 1typedefvoid (^UpdateSwichBtnBlock)();在xcode9中會提示一個警告 12This block declaration is not a prototypeInsert ‘void解決方式可以是如下的幾種 1typedefvoid (^UpdateSwichBtnBlock)(void);但是這樣,很多第三…

mac環境mongodb安裝與配置

一、安裝 MAC環境安裝mongodb有兩種方式,一種方式是通過下載安裝包,另一種方式是通過homebrew。 1、安裝包方式 從mongodb官網可以下載MAC安裝包:https://www.mongodb.com/download-center#community 或者使用curl下載 # 進入 /usr/loca…

用兩個棧來實現一個隊列,完成隊列的Push和Pop操作。 隊列中的元素為int類型...

以下為借鑒 var stack1 [], stack2[]; function push(node){stack1.push(node);}function pop(){if(stack2.length){return stack2.pop();}else{if(stack1.length){var len stack1.length;for(var i0;i<len;i){stack2.push(stack1.pop());}return stack2.pop()}else{retur…

使用CocoaPods導入百度地圖SDK所遇到的坑

執行pod install遇到的問題:解決方安:百度了下,發現pod install命令被墻了,換成pod install --verbose --no-repo-update

NSTimer不準確與GCDTimer詳解

NSTimer不準&#xff0c;scheduleTimer放在runloop里面&#xff0c;受runloop模式影響會不準// [NSTimer scheduledTimerWithTimeInterval:<#(NSTimeInterval)#> target:<#(nonnull id)#> selector:<#(nonnull SEL)#> userInfo:<#(nullable id)#> r…

flex的12個屬性

容器&#xff08;父元素&#xff09;的屬性&#xff1a; flex-direction屬性決定主軸的方向 flex-wrap 屬性決定項目在一行排不下的情況下是否換行 flex-flow flex-flow屬性是flex-direction屬性和flex-wrap屬性的簡寫形式&#xff0c;默認值為row nowrap。 jstify-content …

vue圖片懶加載插件vue-lazyload

插件地址&#xff1a;https://github.com/hilongjw/vue-lazyload demo&#xff1a;http://hilongjw.github.io/vue-lazyload/ 1、安裝 cnpm i vue-lazyload -S 2、使用 main.js import VueLazyLoad from vue-lazyloadVue.use(VueLazyLoad, {error:/static/error.png,loadin…