這兩天在研究linux中的input-polldev.c ,這是kernel提供的一個新的架構,該架構基於linux原有的input子系統,在input裝置外增加了一層輪詢裝置的封裝。這個架構允許我們註冊一個poll-dev。我們只要提供給這個poll-dev一個輪詢時間間隔,一個輪詢的回呼函數即可,而後該系統會為我們註冊一個input裝置並在我們開啟該input裝置時啟動輪詢(當輪詢時間大於0時),輪詢啟動後會按照設定好的時間間隔調用我們前面提到的那個回呼函數。當我們關閉該input裝置時輪詢會自動終止。另外該架構還建立了一些sys-fs節點,一個比較有用的就是poll節點,我們可以cat該節點得到當前的輪詢頻率,也可以echo一個值進去從而更新輪詢頻率。總之這比我們自己製造一個輪詢系統來的更方便更直接。
在研究代碼時還發現當開啟這個基於poll-dev的input裝置時還會調用該輪詢裝置的open函數(代碼見 input_open_polled_device函數。當然前提是你在註冊poll-dev時提供了自己的open函數),因為目前在做mma8452q的驅動,所以我想,為了省電起見,我希望在這個基於poll-dev的input裝置在開啟時再給8452供電,在關閉input裝置時自動給8452斷電。所以可以自己實現一個open和close函數,在註冊poll-dev之前賦值給input_polled_dev對象的open和close指標。
這個想法很不錯,可是奇怪的是我發現我的這個open函數只在android啟動後被調用了一次,而且沒有看到close被調用的跡象。為了確認這個問題。我自己寫了一個測試的應用程式,在這個測試中我會連續兩次open /dev/input/event2.。但是依然看到的是我的那個掛在poll-dev中的open只在第一次open /dev/input/event2時 被調用了一次,同樣我在兩次調用close /dev/input/event2時也只是在最後一次調用中看到我的對應的close被調用了一次。
如此看來,對於input裝置來說可能它的open函數只有第一次open 裝置是才會調用,開啟input.c查看了一把,在函數input_open_device()中果然看到了就是這樣的。只有第一次open input裝置時對應的input裝置的open函數才會被調用,以後如果對一個input裝置進行多次開啟的話只能讓input裝置的users成員自增,而不會調用open函數。