MiniGUI中開發(fā)實現(xiàn)鍵盤輸入設備方案解析
3.2 編寫小鍵盤輸入引擎
3.2.1 底層輸入操作函數(shù)實現(xiàn)
對于小鍵盤輸入,鼠標操作接口函數(shù)不用進行任何操作,直接返回即可,主要需要編寫的是keyboard_update及wait_event函數(shù)。當。 MiniCUI應用程序運行時,相關的底層事件處理例程會不斷調(diào)用wait_event函數(shù)查詢是否有輸入事件發(fā)生,故在該函數(shù)中調(diào)用小鍵盤驅(qū)動的 read函數(shù),獲取用戶輸入的按鍵信息。若有鍵盤事件發(fā)生,則返回IAL_KEYEVENT,底層事件處理例程就會調(diào)用keyboard_update函數(shù)進行處理,獲取當前鍵盤狀態(tài)。
需要注意的是,由于系統(tǒng)以很高的頻率不斷調(diào)用wait_event函數(shù),因此當該函數(shù)捕捉到鍵按下事件時,需要一定時間(如100 ms)延時再返回,以避免一次按鍵產(chǎn)生多次鍵盤事件。
MiniGUI使用一個一維數(shù)組state[128]記錄按鍵的狀態(tài)。該數(shù)組定義在include/common.h中。State[128]中每個元素均對應一特定的按鍵,如果某一元素為l,說明它所對應的鍵被按下,否則該鍵未被按下。因此,key-board_update函數(shù)要做的工作就是,根據(jù)鍵盤掃描驅(qū)動程序的返回值,更新state[128]數(shù)組的元素值,從而向上層驅(qū)動程序和應用程序反映按鍵狀態(tài)??梢姡粝雽崿F(xiàn)任意標準鍵盤按鍵功能,只需修改keyboard_update函數(shù)里相應的鍵值映射,或直接修改鍵盤驅(qū)動里的鍵值映射數(shù)組為對應的標準鍵盤按鍵的系統(tǒng)掃描碼。
3.2.2 初始化及終止函數(shù)實現(xiàn)
在初始化函數(shù)中先打開小鍵盤輸入設備,成功以后對輸入引擎的其他成員(底層輸入操作接口函數(shù))賦值,返回TRUE。終止清除函數(shù)的主要工作是關閉鍵盤輸入文件。輸入引擎相關內(nèi)容的格式可參照src/ial/目錄下的其他輸入引擎。至此,完成了小鍵盤輸入引擎(mykbd.c文件)的開發(fā)。
3.3 輸入引擎的使用原理
在 src/ial/ial. c中,用inputs結(jié)構(gòu)數(shù)組定義了MiniGUI支持的所有輸入引擎信息。系統(tǒng)啟動后,將根據(jù)MiniGUI.cfg配置文件,在inputs結(jié)構(gòu)中尋找特定的輸入引擎作為當前的輸入引擎。然后,調(diào)用該引擎的初始化函數(shù),對全局變量cur_input(表當前使用的輸入引擎)的其他成員函數(shù)進行賦值。
在src/sever/server.c中,函數(shù)IdleHandler4Server凋用輸入引擎中IAL_WaitEvent成員函數(shù),檢查是否有底層輸入事件發(fā)生。當有事件發(fā)生時,檢查是鼠標(觸摸屏)事件還是鍵盤事件發(fā)生,并分別用parseEvent(msg_que, event)處理這些事件。parseEvent函數(shù)中首先調(diào)用Getl-wevent(event,1we)函數(shù)。該函數(shù)利用IAL引擎中相應底層操作函數(shù)收集底層輸入事件1we(該結(jié)構(gòu)定義在paxseEverlt函數(shù)中),parseEvent再將收集到的這些事件轉(zhuǎn)化為上層能理解的消息。具體實現(xiàn)細節(jié)可參考server.c文件。
4 鍵盤輸入在MiniGuI中的實現(xiàn)步驟
4.1 加載小鍵盤驅(qū)動
有兩種方法加載:一是把該驅(qū)動加載入內(nèi)核;二是可以將編譯的*.o文件拷貝到目標板根文件系統(tǒng)巾,目標板啟動后用insmod命令動態(tài)加載。
DIY機械鍵盤相關社區(qū):機械鍵盤DIY
評論