另外,鍵盤又屬于輸入設(shè)備,Linux內(nèi)核提供了輸入子系統(tǒng),如鍵盤、觸摸屏、鼠標等輸入設(shè)備都可以利用輸入子系統(tǒng)的接口函數(shù)來實現(xiàn)設(shè)備驅(qū)動[4]。輸入子系統(tǒng)由核心層(Input Core)、驅(qū)動層和事件處理層(Event Handler)三部分組成[9]。在Linux內(nèi)核中,使用輸入子系統(tǒng)實現(xiàn)輸入設(shè)備驅(qū)動的時候,驅(qū)動的核心工作是向系統(tǒng)報告按鍵、觸摸屏、鼠標等輸入事件,而不再需要關(guān)心文件操作接口,因為輸入子系統(tǒng)已經(jīng)完成了文件操作接口。通過輸入子系統(tǒng),實現(xiàn)輸入設(shè)備驅(qū)動時只需要完成以下工作:
(1)在模塊加載函數(shù)中告知輸入子系統(tǒng)輸入設(shè)備可以報告的事件。例如,可通過__set_bit(EV_KEY,input_dev->evbit)來告知輸入子系統(tǒng)該設(shè)備可報告按鍵事件。
(2)在模塊加載函數(shù)中注冊輸入設(shè)備。注冊函數(shù)為:int input_register_device(struct input_dev *dev);
(3)當有輸入事件發(fā)生時,如按鍵按下/抬起、觸摸屏被觸摸/抬起/移動時,通過input_report_xxx()報告發(fā)生的事件及對應(yīng)的鍵值、坐標等狀態(tài)。主要的事件類型包括EV_KEY(按鍵事件)、EV_REL(相對值,如鼠標移動,報告相對于最后一次位置的偏移)和EV_ABS(絕對值,如觸摸屏)。