一個嵌入式Linux系統的鍵盤驅動實現(轉)

BSDLite發表於2007-08-15
一個嵌入式Linux系統的鍵盤驅動實現(轉)[@more@]  1 引言

  Linux由於其具有核心強大且穩定,易於擴充套件和裁減,豐富的硬體支援等諸多優點,在嵌入式系統中得到了廣泛的應用。很多嵌入式Linux系統,特別是一些具有與使用者強互動的嵌入式系統,往往需要配備一個特殊鍵盤,此時開發者需要根據實際情況,為自己的特殊鍵盤編寫驅動程式。

  2 Linux鍵盤驅動簡介

  Linux中的大多數驅動程式都採用了層次型的體系結構,鍵盤驅動程式也不例外。在Linux中,鍵盤驅動被劃分成兩層來實現。其中,上層是一個通用的鍵盤抽象層,完成鍵盤驅動中不依賴於底層具體硬體的一些功能,並且負責為底層提供服務;下層則是硬體處理層,與具體硬體密切相關,主要負責對硬體進行直接操作。鍵盤驅動程式的上層公共部分都在driver/keyboard.c中。該檔案中最重要的就是核心用EXPORT_SYMBOL這個宏匯出的handle_scancode函式。handle_scancode完成的功能是:首先將掃描碼轉換成鍵碼,接著根據shift, alt等擴充套件鍵的按下情況將鍵碼轉換成目標碼,一般情況下是ASCII碼,最後將該ASCII碼放到終端裝置的緩衝區中,並且排程一個tasklet負責將其在顯示器上回顯出來。可以看出,這個函式完成的是鍵盤驅動程式中最核心的一些工作,而這些核心的邏輯功能是不依賴於底層硬體的,所以可以將其獨立出來,並且匯出給底層的硬體處理函式呼叫。在這個檔案中還定義了其它幾個回撥函式,它們由鍵盤驅動程式中的上層公共部分呼叫,並由底層硬體處理函式實現。比如kbd_init_hw, kbd_translate, kbd_unexpected_up等等。其中kbd_translate由handle_scancode呼叫,負責將掃描碼轉換成鍵碼;鍵盤驅動程式的底層硬體處理部分則根據不同的硬體有不同的實現。例如PC平臺上標準鍵盤的底層硬體處理函式都集中在driver/Pc_keyb.c中。這個檔案包括了鍵盤中斷處理函式keyboard_interrupt,掃描碼到鍵碼轉換函式pckbd_translate等其他一些與底層硬體密切相關的函式。

  在這種體系結構下,要新增一塊特殊鍵盤到系統中就顯得格外清晰。開發者只需為其編寫驅動程式中的底層硬體處理函式,就可以將該鍵盤驅動起來。一般說來,底層硬體處理函式中最重要的工作就是在鍵盤中斷處理中獲取被按下鍵的掃描碼,並且以它為引數呼叫handle_scancode,該掃描碼可以自己定義,但它必須唯一地標識出被按下鍵在鍵盤上的位置。此外,開發者還需要提供對應的從自定義掃描碼到鍵碼的轉換函式kbd_translate。具體的鍵碼轉換,將目標碼放到終端的輸入緩衝區,以及回顯等工作都由handle_scancode負責完成。在此我們也可以看出,核心匯出函式handle_scancode在整個鍵盤驅動程式中,起著將上層通用抽象層和底層硬體處理層粘和起來的關鍵作用。

  3 應用例項

  下面我們將以一個具體的應用例項來說明在嵌入式Linux系統中給一個特殊鍵盤編寫驅動程式的具體過程。

  3.1 硬體模組描述

  本系統的構建選用了三星公司的S3C2410開發板作為硬體平臺。特殊鍵盤的硬體模組主要由兩個SN74hc164晶片和一個4行16列的矩陣掃描電路構成。SN74hc164是一個8位的串形輸入並形輸出移位暫存器,它的內部由8個D觸發器串聯而成。其工作原理簡單說來是這樣的,SN74hc164晶片在時鐘CLK脈衝的上升沿將A,B引腳上的串形輸入在8個時鐘脈衝以後並行輸出到輸出引腳QA到QH。其真值表見圖1所示。

  兩個SN74hc164晶片先串聯後,將它們的CLK引腳和CLR引腳分別接到S3C2410開發板的GPB2和GPB4埠上,並且將第一個SN74hc164晶片的A,B引腳接到開發板的GPB1埠上,這三個GPIO埠配置成輸出埠。這樣我們就藉助於兩個SN74hc164暫存器,實現了只佔用3個GPIO埠,給矩陣掃描電路的16列提供輸入,從而既節約了成本,又避免了GPIO資源的浪費。但這同時也給鍵盤驅動程式的實現帶來了一定的麻煩,驅動程式首先要將SN74hc164驅動起來,然後才能對矩陣電路的16列進行控制。該矩陣電路的4個行引腳分別被接到S3C2410的GPG6,GPG7,GPG8,GPG9埠上,並且這四個埠被配置成中斷源。無鍵按下時直接讀為高電位,使用時透過SN74hc164晶片先將鍵盤的16列置低電位,任何一個鍵被按下,相應的行GPG埠就會有從高到低的電壓跳變,從而觸發一次中斷。

  3.2 軟體模組描述

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-959882/,如需轉載,請註明出處,否則將追究法律責任。

相關文章