嵌入式系統的SD控制器設計實現
系統初始化時,SD_nCD檢測引腳被設置為上升沿和下降沿觸發,因此引腳電平發生變化時,都會有中斷產生。當硬件產生中斷時,系統進入核心ISR,對SD_nCD進行檢測,返回相應的中斷標識碼,對于是SD插入還是拔出,則由驅動程序的IST來處理。
由于SD卡插槽采用的是機械式開關,在插拔卡的時候,機械開關斷開、閉合時會有抖動,導致SD卡檢測引腳的電平不穩定,從而有可能引起對卡的狀態的誤判。這樣會導致加載上層驅動,初始化失敗造成系統宕機。為了使每次插拔只響應一次,必須要采用相應的方法來防止抖動,避開按鍵按下的抖動時間。
在驅動程序IST里采用延時采樣的方法來避免抖動,同時也嘗試了多次采樣的檢測方法來避開用戶按鍵的抖動時間。
延時采樣是IST在收到SD卡檢測事件以后,并不是立刻進行引腳信號判斷,而是延時一段時間采樣,延遲時間要根據系統電路特性而定,然后檢測引腳信號,判斷插槽的狀態是卡插入還是拔出。多次采樣方法是IST在收到SD卡檢測事件以后,要對引腳進行多次等間隔采樣,根據采樣出的多數電平信號的值來決定插槽卡的狀態。多次采樣的方法可以有更短的響應時間,當采樣出的電平信號多數值不能決定卡的狀態時,需要進行重新采樣判斷。
對于延時采樣的防抖動方法,必須考慮到實現的效率。
ISR運行于系統核心態,它的延時會影響整個系統,導致用戶的輸入響應時間過長,造成整體性能的下降。而WindowsCE的驅動程序是用戶態的DLL,作為用戶進程來調度,因此在SDHost的驅動程序里實現防抖動,可保證系統整體性能不下降。
對于上述兩種防抖動方法,我們進行了連續插拔的測試,結果如圖3所示。測試結果表明,這兩種方法都取得了較好的效果,基本上解決了SD卡檢測的抖動問題。

圖3 SD卡插拔宕機次數測試
4 結語
本文介紹的SDHost控制器已經應用在工程實踐中,結果表明設計是靈活有效的,防抖動設計對于類似的設計也具有一定的借鑒意義。
linux操作系統文章專題:linux操作系統詳解(linux不再難懂)
評論