WINCE下SOS驱动开发
********************************LoongEmbedded************************
作者:LoongEmbedded(kandi)
時間:2011.03.30
類別:WINCE驅動開發
********************************LoongEmbedded************************
?
備注:系統是WINCE4.2移植過來的BSP包+S3C2440A
?
1.?????? SOS
S.O.S.是國際莫爾斯電碼救難信號,并非任何單字的縮寫。鑒于當時海難事件頻繁發生,往往由于不能及時發出求救信號和最快組織施救,結果造成很大的人員傷亡和財產損失,國際無線電報公約組織于1908年正式將它確定為國際通用海難求救信號。這三個字母組合沒有任何實際意義,只是因為它的電碼“ ...---...”(三個圓點,三個破折號,然后再加三個圓點)在電報中是發報方最容易發出,接報方最容易辨識的電碼。
?
???????? 我們產品的SOS的需求是用戶(比如說司機)在需要求救的時候,按下SOS鍵(按下3s),然后驅動告訴應用程序,而應用程序這時候就可以撥號求救(那對應的號碼可以預先設定),這就是我們產品SOS的需求和設計思想。
?
2.?????? SOS的硬件檢測
SOS按鍵的設計部分:
?
圖1
CPU的GPG10作為SOS檢測引腳
?
圖2
?
3.?????? SOS軟件的實現
3.1?? SOS中斷檢測的實現
?
因為GPG10是作為SOS按鍵檢測引腳的,所以可以利用GPG10的中斷功能來檢查到是否按下SOS按鍵,因為SOS鍵沒有按下時,引腳SOS_DET是低電平,按下SOS鍵后事高電平,大概2.95V左右,所以可以把GPG10配置為EINT18中斷功能引腳,并且設置為上升沿觸發,也即按下SOS按鍵時觸發,相應的實現代碼:
?
⑴ SMDK2440/SRC/INC/oalintr.h靜態定義EINT18對應的邏輯中斷號
?
圖3
⑵ 把GPG10配置為上升沿觸發的中斷引腳
?
圖4
⑶ SMDK2440/SRC/KERNEL/HAL/ARM/armint.c下的OEMInterruptHandler()添加對EINT18中斷處理的支持
?
圖5
?
⑷ SMDK2440/SRC/KERNEL/HAL/ARM/armint.c下的OEMInterruptEnable ()添加對EINT18中斷處理的支持
?
圖6
⑸ SMDK2440/SRC/KERNEL/HAL/ARM/armint.c下的OEMInterruptDisable ()添加對EINT18中斷處理的支持
?
圖7
?
⑹ SMDK2440/SRC/KERNEL/HAL/ARM/armint.c下的OEMInterruptDone ()添加對EINT18中斷處理的支持
?
圖8
?
?
3.2?? SOS中斷IST線程
?
圖9
在此學習一下IsAPIReady函數的功能
?
圖10
?
3.3?? ?
4.?????? SOS驅動調試遇到的問題
4.1?? 沒有按下SOS按鍵的時候SOS_DET引腳的電平是1.3V左右
根據圖1和圖2的設計思路,在沒有按下SOS鍵的時候,SOS_DET引腳的電平應該是接近0v的,但實際用萬用表測出來時1.3v左右,這樣CPU就認為此時為高電平,而按下按鍵的時候SOS_DET引腳的電平時2.95V左右,那么就會出現不管是否按下SOS按鍵,CPU都認為是高電平,也就是認為SOS鍵一直處于按下的狀態,這樣就不能使用EINT18的上升沿中斷觸發功能。
剛開始我一直以為是硬件設計的問題,可是硬件同事一時也不知道問題在哪里,我就試著在SOS_EnableInterrupt函數中把GPG10的上拉功能關閉掉,然后再來測試SOS鍵沒有按下時的電壓,此時是0.01V,這才是我想要的電平,可是為什么把GPG10的上拉功能關閉掉后可以拉低SOS_DET引腳的電壓為0V呢?而之前是使能GPG10的上拉功能的,也就是使能GPG10上拉功能的時候,CPU內部中GPG10的上拉電阻(一般是75K左右)和圖1的R173形成回路,這樣根據分壓原理就可以知道SOS_DET引腳的電源為1.3V左右,所以我們需要把GPG10的上拉功能關閉掉,這是我的理解,不知是否有誤,而且我的理解還不夠深入,在此忘大家賜教,謝謝了。
?
4.2?? 接入sd卡啟動之后SOS按鍵中斷沒有被觸發
但如果沒有接入SD卡啟動,那么就可以正常相應SOS按鍵中斷,帶SD卡啟動之后再按下SOS按鍵OEMInterruptHandler函數都沒有進入圖5的代碼處理段,為什么呢?見圖2可知用于檢測SD卡是否插入的引腳nCD_SD連接到EINT16/GPG8的,見下圖
?
圖11
后來仔細看看了SD卡驅動部分,雖然把GPG8初始化為中斷功能EINT16,但實際是用查詢的模式,下圖是CSDIOControllerBase::Initialize()函數相關部分
?
圖12
這樣在帶SD卡驅動的時候,就會檢查到nCD_SD引腳對應的EINT16中斷進來,自然而然就
執行了圖5的檢查SD卡插入的處理部分,可以看到其中執行了下面語句
s2440INT->rSRCPND? = BIT_EINT8_23;
這表示中斷源EINT16的已經插入中斷請求,等待中斷處理,可是系統起來后SD卡驅動并沒有實際用到EINT16的中斷處理,也沒有清除中斷相關寄存器的對應位,也就是沒有一直處于外部擴展中斷EINT8到EINT23的中斷請求這時候就進不來,認識到這一點之后,在CSDIOControllerBase::Initialize()函數的后面添加下面的代碼就解決了這個問題:
?
圖13
圖13中調用InterruptDone函數,從而內核調用了OEMInterruptDone函數的相關部分,見
圖8,這樣就解決了這個問題。
?
?
總結
以上是生活随笔為你收集整理的WINCE下SOS驱动开发的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开机启动加载驱动过程中调用PostMes
- 下一篇: 建立Windows Embedded C