基于嵌入式Linux系統的鍵盤驅動設計
摘要:為了適應嵌入式設備外設的多樣性,本文以特殊矩陣鍵盤為例,設計了一套完整的驅動控制模塊。硬件電路設計采用外擴3片SN74HC 164芯片的方式,節省了GPIO引腳的使用,大大提高了利用效率。同時,在此基礎上引出了Linux內核中input子系統的特性和工作機制,呈現了較為完整的輸入事件由內核空間傳遞到用戶空間進程的過程。實驗結果表明,設計的驅動模塊具有良好的實時性和準確性。
關鍵詞:SN74HC164;矩陣鍵盤;驅動控制模塊;Linux內核;input子系統
引言
隨著微處理器技術的不斷發展和數字化產品的普及,嵌入式系統的研究開發逐漸成為熱點,Linux也以其開源、穩定、可裁剪的優勢成為嵌入式操作系統的主流。在眾多的嵌入式系統中,鍵盤成為一種應用最為廣泛的輸入設備。然而,嵌入式設備的功能差異性又決定了為其提供一種通用性鍵盤是不可行的,往往需要根據系統的實際功能設計所需的特殊鍵盤,并實現相應的驅動程序。
S3C6410是三星公司高性能的32位RISC微處理器,內部集成了多種強大的硬件加速器,適合進行視頻和圖像處理,成為了目前嵌入式處理器領域的主流產品。本文以在S3C6410微處理器基礎上實現一個24鍵矩陣鍵盤為例,呈現了在嵌入式系統中開發設備驅動程序的整體流程,并對Linux系統下輸入事件的底層傳遞機制進行了研究和分析。
1 接口電路的設計
在嵌入式設備上擴展鍵盤的常用方式是通過對CPU的GPIO端口進行掃描實現的,顯然這種方式在鍵盤按鍵數目較多的情況下,會占用過多的GPIO資源,增加了GPIO端口資源較為緊張的嵌入式處理器的負擔。
本系統的硬件設計通過增加3片SN74HC164芯片來達到節約GPIO資源的目的。SN74HC164是一種8位的串行輸入、并行輸出移位寄存器,它的內部由8個D觸發器串聯而成。每當時鐘信號由低電平變為高電平時,兩個輸入端將當前輸入信號傳送到并行輸出端,并實現移位操作。系統硬件原理圖如圖1所示。
3個SN74HC164芯片串聯后,將它們的CLK引腳接到S3C6410開發板的GPE4端口上。第一個SN74HC164芯片的A、B輸入引腳共同接到開發板的GPE3端口上,并且將這兩個GPIO端口配置成輸出模式。GPE2端口與鍵盤按鍵的上拉端連接,系統運行時在中斷模式和輸入模式之間切換,以達到觸發中斷和對鍵盤掃描的目的。這樣我們就借助于3個SN74HC164移位寄存器,只占用3個GPIO端口,給掃描鍵盤的24個按鍵提供輸入信號,既節約了成本,又避免了GPIO資源的浪費。
2 掃描工作原理
擴展硬件電路的同時給鍵盤驅動程序的實現帶來了一定的麻煩,驅動程序首先要將SN74HC164驅動起來,然后才能對電路進行控制。該電路的輸出引腳被接到S3C6410的GPE2端口上,并且這個端口被配置成中斷源,無鍵按下時直接讀為高電位。鍵盤掃描時通過SN74HC164芯片先將鍵盤的24個鍵置低電平,任何一個鍵被按下,GPE2端口就會有從高電平到低電平的跳變,從而觸發一次中斷。
在中斷處理過程中,將GPE2端口置為輸入狀態。然后根據SN74HC164芯片的輸入/輸出特性,給串聯的3個SN74HC164芯片發送24個高電平信號,使得鍵盤的各鍵位均為高電平。在隨后的24個時鐘脈沖下,給SN74HC164芯片送入1個0和23個1,使得0在每個鍵位的輸入端都只出現一次,同時在GPE2端口進行掃描。當被按下鍵處于0輸入狀態時,其所在行就會讀到一個低電平,也就可以確定出鍵盤上哪個鍵被按下了。
3 驅動模塊結構
在Linux2.6的版本中新加入了input子系統,給驅動編寫者提供了一個完整的輸入事件——從底層設備傳遞到用戶進程的模型。本文基于input子系統架構,設計了一個較為完善的特殊鍵盤驅動模塊。鍵盤驅動模塊結構如圖2所示。
在input子系統的設備內核模型中,最重要的數據結構體是struct input_dev,作為驅動的主體,每個structinput_dev代表一個輸入設備。該結構體中既包含了設備所能響應的輸入事件類型、響應按鍵種類、鍵盤碼表,以及坐標范嗣等字段,同時還包含了設備打開、關閉以及回調函數等字段,能夠完整地記錄和標識整個設備的功能與行為。在向內核注冊input_dev之前,需要進行input_dev結構的初始化,同時向內核申請鍵盤中斷。
評論