從今天開始我們進行linux input子系統內容的分析,針對linux子系統,涉及字符設備、input device、input handler,還可能涉及我們之前介紹的tty子系統。針對input子系統專欄,我們大致劃分如下幾個方面:
一、linux input子系統軟件架構說明
二、input相關字符設備驅動分析
三、input device分析
四、input handler分析
五、input device開發流程說明
六、虛擬input device實現
input子系統框架
本章我們主要介紹input子系統框架,針對input子系統而言,對上層而言主要提供字符設備文件節點,以便應用程序通過vfs完成對input device的訪問操作。
如下圖所示,input子系統主要包括input_handler、input_device、input_handle這三個部分;
其中:
- input_handler可以理解為一個input 設備的驅動;
- input_device即代表一個input設備的抽象;
- 而input_handle則表示完成了input device與input handler的綁定操作,通過input_handle完成了input_handler、input_device的關聯。針對input_device而言,若其接收到數據(如按鍵按下、鼠標點擊等),則將針對該input_device上所有的input_handle,均調用該input_handle所關聯的input_handler的event接口,從而將該input_device接收的事件發送給所有該input_device綁定的input_handler;
- 其實input_handler、input_device的匹配及探測過程和linux設備驅動模型中bus_type、device、device_driver的匹配及探測過程是類似的,在input子系統中,當進行input_handler/input_device註冊時,均會遍歷當前系統中已註冊的input_device/input_handler,並調用匹配函數進行匹配檢測,若input_device與input_handler完成匹配後,則創建input_handle作為input_device與input_handler匹配的關係紐帶(即input_handler可以通過input_handle找到其匹配的input_device,實現向input_device發送數據;而input_device也可以通過input_handle找到其匹配的input_handler,實現向input_handler中發送數據);而input_handler與input_device匹配後,則調用input_handler的connect函數進行探測操作(與設備驅動模型中的probe函數是一樣的);而在該connect函數中,則可以進行該input_device對應的字符設備的創建(這點和我們在設備驅動的probe函數中創建字符設備是一樣的)。而有些input_handler的connect函數中,則不需要創建字符設備文件,如key board handler,則不需要創建字符設備文件,只需要將接收的數據發送給對應tty子系統對應的tty_port緩存中,然後再喚醒tty_ldisc的讀接口,最終實現將數據發送到tty_port對應的字符設備文件中去。
- input子系統最下層的input_device,可以是鍵盤、鼠標、led、按鍵等,而這些設備可以是uart、usb等設備;
如上便是input子系統的框架,其實input子系統相對來說比較簡單,如果理解設備驅動模型的話,基本上對input子系統就比較熟悉了。雖然input子系統框架並不複雜,但是input子系統中也涉及多個內核子系統,比如字符設備驅動、tty子系統、iic子系統、spi子系統、uart子系統、usb2uart子系統等等;讀者可以多看看input device相關的驅動程序,對驅動能力的提高會有好處。
以上便是本章的主要內容,內容相對比較簡單,主要讓大家對input子系統有個感性的認知,後續幾章我們將對input子系統的實現進行分析。