close

在Linux下對鍵盤進行直接控制,需要首先搞清楚一些概念,如terminal、console、scancode、keycode等。我理解Linux下的鍵盤處理的基本過程應該是這樣的:

keyboard-->kbd controller-------->keyboard driver------>tty processing---

 按鍵 生成掃描碼 根據鍵盤模式轉換

----tty processing------->console--------->application

 處理canonical模式等 處理Esc序列等

關於keyboard、console的基本處理可參考《The Linux keyboard and console HOWTO》中2和3兩節。關於tty的處理可參考《Advanced Programming in Unix Environment》中的11章Terminal I/O。

理解了這個過程,要直接獲得鍵盤輸入就比較清晰了:

首先,需要將tty的模式設置為noncanonical,參考Advanced Programming中的例子就可以了。

其次,需要設置鍵盤轉換模式,通常的模式下是轉換為ASCII碼,也可以轉換為scancode(不轉換)、keycode和Unicode。關於scancode的定義比較麻煩,一個鍵可能會產生1個、2個、4個甚至5個scancode,具體可以參考微軟的文檔《Keyboard Scan Code Specification》。關於keycode,Linux下有一個程序叫showkey,可以顯示一個鍵對應的代碼,由於一個鍵只對應於一個代碼,處理起來比較簡單。具體的設置使用參數為KDSKBMODE的ioctl調用即可,參考man文檔console_ioctl。

最後,可以將console設置為KD_GRAPHICS模式(用參數KDSETMODE的ioctl調用),console就進入了圖形模式,不顯示文本光標也不回顯,同時sdtout的輸出也只有返回文本模式後才會顯示。

搞清楚了過程就好辦了,剩下的就是打開設備、讀數據。一般的stdin就是一個tty,當然也可以打開/dev/console設備或者/dev/tty、/dev/tty1、/dev/tty2等。對於/dev/console和tty們有什麽區別,我就搞不清了。至少打開console和tty後都可以用。而stdin一般就是當前的tty,如果沒有重定向的話。

當然要註意的是,一旦切換了鍵盤轉換模式,所有給應用軟件的鍵盤代碼都會改變,可能連Ctrl-C等都不認了,所以一定要記得切換回來,調試起來也要小心,否則可能就要重新啟動了:-(

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 多層分類 的頭像
    多層分類

    多層分類的部落格

    多層分類 發表在 痞客邦 留言(0) 人氣()