標籤: input子系統
tslib
linux驅動開發
linux軟體層次
linux輸入子系統
2015-08-23 10:49
2808人閱讀收藏
舉報
s5pv210(cortex a8)(11)
linux核心、驅動(17)
輸入輸出是使用者和產品互動的手段,因此輸入驅動開發在linux驅動開發中很常見。同時,input子系統的分層架構思想在linux驅動設計中極具代表性和先進性,因此對linux input子系統進行深入分析很有意義。
一、input子系統知識點
完整的input子系統分析包括以下幾方面:
1) 軟體層次
2) 輸入子系統分層(input_handler,input_core, input_device)
3) 輸入裝置(ts)驅動開發
4) evdev handler分析
5) input裝置模型檢視(sysfs)和執行映象(procfs)
6) tslib分析
7) 應用框架的事件處理分析
二、軟體層次分析
linux輸入所涉及的軟體層次如下圖:
基於linux核心的應用框架常見於android和qt。由於android4.2對觸屏驅動的支援發生過重大的變化(將tslib完成的任務拋給驅動層來完成),所以我們以較為簡單的qt框架來說明linux輸入的呼叫過程。假設有以下基於qt的通訊錄應用場景,我們重點分析查詢這個button控制項的輸入響應過程。
3.tslib,從名稱來看就可明確其是觸控螢幕ts場景的乙個中間庫。其主要完成觸控座標訊息的去抖、濾波和校準等功能。其最核心的功能是從觸控螢幕座標系到lcd顯示屏座標系的線性轉換。電子產品的觸控螢幕一般包括觸控螢幕和顯示屏兩個部分,觸控螢幕在顯示屏之上,有電阻和電容分壓原理之分。在ts驅動實現中,觸控螢幕的座標原點是在螢幕的左下角,即驅動向tslib提供的基於左下角為原點的座標系座標,而tslib需要向qt應用框架提供基於左上角為原點的座標系統座標,因此tslib需要完成座標系的轉換。如下圖:
另外,觸控螢幕的解析度和lcd顯示屏的解析度也有可能不一樣,因此座標的轉換還要考慮解析度的因素。
4.c library,tslib必須通過open,read這些標準c介面訪問核心層驅動,而這些介面最終都會使用syscall指令跳轉到核心態。
5.vfs,open、read等介面通過syscall系統呼叫層最終會呼叫到vfs_open、vfs_read等介面。open所帶引數為輸入裝置檔名,如/dev/input/event1,vfs_open通過lookup在dentry鍊錶中找到該裝置檔案對應的inode,進而分析出該檔案是乙個字元裝置檔案,交由字元裝置驅動框架的chardev_open進行處理,最終獲得輸入子系統(主裝置號都是13)對應的input-core層定義的file_operations,並封裝到所在程序的file結構中,最後向應用層返回file對應的控制代碼fd,而read則是通過該file_operations進行讀**和訪問操作。
6.字元裝置驅動框架層。chardev_open通過裝置檔案對應的inode讀出對應的主裝置號是13,並在字元裝置驅動全域性鍊錶cdev_map中找到主裝置號13對應的file_operations, 即輸入子系統初始化時向系統註冊的input_fops。如下圖:
如何訪問不同的輸入裝置,如觸控螢幕和按鍵等等,是由input_fops的open來負責。input_fops即為input-core的組成部分。
7.輸入子系統,輸入子系統對linux的輸入裝置驅動進行了高度抽象,最終分成了三層,包括input核心層、input事件處理層和input裝置驅動層。如下圖:
1)所有的輸入裝置的主裝置號都是13,其通過次裝置來將輸入裝置進行分類,如下圖:
2)對於應用層來說,其並不關心輸入裝置驅動層,其只關心輸入事件處理層,即關注哪種型別的輸入裝置。
3)系統初始化時,事件處理層(input-handler)向input-core註冊自己,並告知input-core其能處理底層裝置驅動的型別和能力,例如event_handler事件處理(evdev.c)能夠處理觸控螢幕和按鍵驅動。
4)當輸入裝置驅動input-device向input-core註冊時,input-core會給其匹配合適的事件處理層input-handler,最終用input-handle來關聯兩者,並在input-handler的控制下生成使用者訪問的字元裝置檔案,如如/dev/input/event0對應的次裝置號即是64。
8.input核心層,有了以上的分析,我們再繼續分析input-core的input_open_file,假如裝置檔名為/dev/input/event0,那次裝置號即64,input_open_file通過次裝置號得到對應的事件處理層event_handler,並交給該handler進行管理。
9.input事件處理層,event_handler根據次裝置號可以得到該輸入驅動在其管理裝置陣列中evdev_table的偏移(為0),進而得到對應的input_handle,最終找到關聯的輸入裝置驅動input-device。
10.input裝置驅動層,輸入裝置驅動層的open會進行硬體初始化等。
11.vfs層以下我們著重分析了驅動的open過程,接下來我們來分析一下觸屏訊息的產生和讀取過程。
1)可以想象出在qt應用框架中會有乙個高優先順序的執行緒一直在等待讀取觸控和按鍵訊息。當沒有訊息產生時,該執行緒處於休眠狀態。
2)當使用者觸屏時,觸控螢幕會產生乙個外部硬體中斷,在輸入裝置驅動的中斷處理中會讀取觸屏座標,並向其對應的input-handler匯報,而input-handler在分析該訊息是否是重複訊息等過程後向開啟該handler的執行緒傳送訊號量進行喚醒,並將該觸屏訊息填入執行緒的訊息佇列。
3)qt應用框架執行緒會通過tslib的介面來讀取該訊息,最終獲得lcd座標系座標,並進行後續處理。
備註:輸入子系統分層(input_handler, input_core, input_device)、輸入裝置(ts)驅動開發、evdev handler分析、input裝置模型檢視(sysfs)和執行映象(procfs)、tslib機制分析、應用框架的事件處理分析等系列知識待後續補充。謝謝!
同時,我們還應該看到,觸控螢幕可能是i2c匯流排介面、uart介面、usb介面等等,因此觸控螢幕裝置驅動層不僅作為乙個input_device存在,還有可能作為乙個i2c裝置而存在等等。而i2c裝置驅動又需要對i2c子系統進行分析。繼續努力吧~~
Linux input子系統分析 5 事件傳遞過程
三.事件傳遞過程 以s3c2410 ts為例 1.事件產生 當按下觸控螢幕時,進入觸控螢幕按下中斷,開始ad轉換,ad轉換完成進入ad完成中斷,在這個中斷中將事件傳送出去,呼叫input report abs dev,abs x,xp static inline void input report ...
framebuffer 子系統分析
fb info screen base dma alloc writecombine fbi dev,map size,map dma,gfp kernel fb info screen base 是framebuffer起始虛擬位址,也就是mmap後程式寫入fb的位址,該位址會直接寫入到fb in...
framebuffer 子系統分析
come from struct fb info ranges 0 apertures struct fb var screeninfo struct fb fix screeninfo 這兩個結構體分別記錄了顯示器可以修改和不可修改的資訊,這些資料成員需要在驅動程式中初始化。其中fix.visua...