一個嵌入式Linux系統的鍵盤驅動實現(轉)
一個嵌入式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 軟體模組描述
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 驅動開發 鍵盤過濾驅動程式-- 傳統的鍵盤過濾
- win10鍵盤驅動怎麼修復_win10鍵盤驅動一鍵修復Win10
- Linux的input輸入子系統:裝置驅動之按鍵驅動Linux
- 實現一個螺旋轉盤
- 向嵌入式Linux移植實時裝置驅動程式(轉)Linux
- javascript 實現一個簡單的數字鍵盤JavaScript
- 在一個系統上編譯多個核心版本的驅動模組(轉)編譯
- 鍵盤驅動怎麼重新安裝 win10鍵盤驅動重新安裝的方法Win10
- Linux系統核心模組和驅動的編寫(轉)Linux
- win10鍵盤驅動顯示黃色感嘆號如何解決_win10系統鍵盤驅動有感嘆號解決教程Win10
- 一個檔案系統過濾驅動的demo
- 自己動手設計並實現一個linux嵌入式UI框架LinuxUI框架
- 自己動手做一個迷你 Linux 系統(轉)Linux
- 嵌入式Linux中platform平臺裝置模型的框架(實現LED驅動)LinuxPlatform模型框架
- LINUX在嵌入式系統上的實踐和探討(轉)Linux
- USB驅動程式之滑鼠用做鍵盤
- 在單個硬碟驅動器上構建雙引導Linux系統(轉)硬碟Linux
- 實現一個SSO系統
- 更改系統鍵盤
- 製作一個移動Ubuntu系統,可以做到即插即用(U盤系統,非啟動盤)Ubuntu
- 嵌入式Linux中的LED驅動控制(續)Linux
- 自己動手設計並實現一個linux嵌入式UI框架(設計)LinuxUI框架
- Holer實現外網訪問ARM嵌入式Linux系統Linux
- ArmSoM系列板卡 嵌入式Linux驅動開發實戰指南 之 字元裝置驅動Linux字元
- Linux系統哪個更好用?Linux系統盤點!Linux
- 基於Linux系統的影片點播系統的實現(轉)Linux
- win10u盤驅動異常怎麼辦 win10系統U盤驅動出現異常如何處理Win10
- windows10系統關閉軟盤驅動器的方法Windows
- js 實現多重羅盤轉動JS
- 實現一個webscoket聊天系統Web
- Linux系統中掃描、列印的實現(轉)Linux
- 嵌入式Linux中的LED驅動控制(使用多個次裝置號)Linux
- 把Iptables移植到嵌入式Linux系統(轉)Linux
- 開發Linux系統裝置驅動程式並不難(轉)Linux
- 一個數字鍵盤引發的血案——移動端H5輸入框、游標、數字鍵盤全假套件實現H5套件
- 【linux】驅動-10-pinctrl子系統Linux
- 【linux】驅動-11-gpio子系統Linux
- iOS表情鍵盤的完整實現iOS