首頁 >php教程 >PHP开发 >一個嵌入式Linux系統的鍵盤驅動實作 (1)

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

黄舟
黄舟原創
2016-12-23 13:45:161285瀏覽

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 軟體模組描述

 以上就是一個嵌入式Linux系統的鍵盤驅動實作 (1)的內容,更多相關內容請關注PHP中文網(www.php.cn)!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn