基于ARM9的多行列鍵盤設(shè)計(jì)及其驅(qū)動(dòng)實(shí)現(xiàn)
1 引 言
本文引用地址:http://www.ex-cimer.com/article/171626.htm許多嵌入式系統(tǒng),尤其是一些人機(jī)交互(HMI)較頻繁的嵌入式系統(tǒng),鍵盤是一種應(yīng)用最為廣泛的輸入設(shè)備。由于嵌入式設(shè)備的功能互異性,為其提供一種通用性鍵盤是不可行的,一般都需要根據(jù)嵌入式系統(tǒng)的實(shí)際功能來(lái)設(shè)計(jì)所需的特殊鍵盤,并實(shí)現(xiàn)相應(yīng)的驅(qū)動(dòng)程序。
在嵌入式設(shè)備上擴(kuò)展鍵盤的常用方式是通過(guò)使用CPU的GPIO端口掃描實(shí)現(xiàn)的,顯然,這種方式會(huì)占用系統(tǒng)的GPIO資源,特別是在GPIO資源比較緊張而按鍵又較多的系統(tǒng),這個(gè)問(wèn)題就特別突出。當(dāng)然,也可以通過(guò)外擴(kuò)GPIO(如8255等)或外擴(kuò)專用的鍵盤接口(如8279等)方式實(shí)現(xiàn),但這種方式顯然增加了系統(tǒng)的復(fù)雜度,在實(shí)際系統(tǒng)設(shè)計(jì)中頗感不便。
本文以在ARM9(AT91RM9200)嵌入式微處理器上實(shí)現(xiàn)一個(gè)POS機(jī)鍵盤(8×8)為例,呈現(xiàn)了一種在嵌入式設(shè)備上擴(kuò)展多行列鍵盤的新設(shè)計(jì)思路,并在ARM-Linux系統(tǒng)實(shí)現(xiàn)了鍵盤的驅(qū)動(dòng)程序。
2、接口電路的硬件設(shè)計(jì)
本文通過(guò)一個(gè)設(shè)計(jì)實(shí)例,說(shuō)明如何使用一種比較簡(jiǎn)單的方式,來(lái)實(shí)現(xiàn)一個(gè)8×8的POS機(jī)矩陣鍵盤,POS機(jī)所采用的微處理器是AT91RM9200芯片。AT91RM9200是ATMEL公司生產(chǎn)的一款高性能的32位ARM9處理器,它是一款通用工業(yè)級(jí)ARM芯片,在工業(yè)控制、智能儀器儀表等領(lǐng)域內(nèi)得到了大量的應(yīng)用[3,4],其詳細(xì)芯片特性可參見(jiàn)文獻(xiàn)[2]。
在AT91RM9200上擴(kuò)展鍵盤,一般都是通過(guò)其GPIO端口來(lái)實(shí)現(xiàn)。AT91RM9200雖提供了4×32個(gè)可編程的GPIO端口。但為減小芯片體積和功耗,其許多GPIO端口都是與系統(tǒng)的外圍設(shè)備控制器端口或地址線、數(shù)據(jù)線進(jìn)行復(fù)用的,所以實(shí)際可用于擴(kuò)展的GPIO端口是很少的。而對(duì)于一個(gè) 8×8鍵盤,若采用傳統(tǒng)的GPIO端口擴(kuò)展方式,則需要16個(gè)GPIO,這在一個(gè)比較復(fù)雜的POS系統(tǒng)中是很難滿足的,因此需要采用其他方式來(lái)解決這個(gè)問(wèn)題。
圖1 鍵盤接口原理圖
本文通過(guò)數(shù)據(jù)鎖存的方式,充分利用32位處理器的數(shù)據(jù)寬度優(yōu)勢(shì),使用數(shù)據(jù)線來(lái)替代鍵盤擴(kuò)展所需的GPIO端口,從而減少對(duì)系統(tǒng)GPIO資源的占用。鍵盤接口的實(shí)現(xiàn)原理如圖1所示。在圖1所示的電路中,U1301(74LVCC4245)為三態(tài)緩沖器,U1302(74HC574)為鎖存器,系統(tǒng)工作原理描述如下:
U1301的nOE端連接系統(tǒng)的譯碼輸出nKey_CS,部件地址由系統(tǒng)譯碼電路決定,當(dāng)向該地址寫數(shù)據(jù)時(shí),nKey_CS信號(hào)為低電平,數(shù)據(jù)可以通過(guò)U1301,同時(shí),nKey_CS信號(hào)經(jīng)兩級(jí)反相器延時(shí)后作為鎖存信號(hào)將數(shù)據(jù)鎖存到U1302的輸出端,作為鍵盤的行掃描信號(hào),而鍵盤的列掃描信號(hào)則仍然使用系統(tǒng)的GPIO。依次向每行送出低電平信號(hào),同時(shí)檢測(cè)連接在GPIO的列信號(hào),即可實(shí)現(xiàn)對(duì)鍵盤的掃描。在本系統(tǒng)中,只使用了系統(tǒng)32位數(shù)據(jù)的低8 位作為行掃描信號(hào),在實(shí)現(xiàn)8×8矩陣鍵盤掃描的情況下,僅需要占用8個(gè)GPIO口,如果采用同樣的方式,分別使用16位數(shù)據(jù)或32位數(shù)據(jù)作為行掃描信號(hào),則只需要占用4個(gè)或2個(gè)GPIO,顯然,與傳統(tǒng)的方式相比較,該方式可以大大節(jié)省系統(tǒng)的GPIO資源。
3、鍵盤的驅(qū)動(dòng)模塊設(shè)計(jì)
完成接口電路的設(shè)計(jì)之后,還需要編寫相應(yīng)的鍵盤驅(qū)動(dòng)模塊。本文采用AT91RM9200芯片中已經(jīng)運(yùn)行了ARM-Linux操作系統(tǒng),因此給鍵盤的驅(qū)動(dòng)程序開(kāi)發(fā)提供了很大的方便。鍵盤的驅(qū)動(dòng)模塊可分為硬件初始化、文件操作函數(shù)的實(shí)現(xiàn)以及鍵盤掃描程序三個(gè)部分。
3.1 硬件初始化
鍵盤驅(qū)動(dòng)程序的開(kāi)發(fā)模式與Linux系統(tǒng)中一般字符設(shè)備的驅(qū)動(dòng)開(kāi)發(fā)步驟相似,關(guān)于Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)的詳細(xì)分析可參考文獻(xiàn)[1]。首先需完成的是驅(qū)動(dòng)程序模塊的初始化函數(shù)和清除函數(shù)。在初始化函數(shù)中,除完成模塊注冊(cè)外,還應(yīng)進(jìn)行硬件初始化,下面是本文根據(jù)AT91RM9200芯片的GPIO控制器的特性[2],在模塊的初始化函數(shù)中的硬件初始化的偽代碼。
……
設(shè)置所使用GPIO端口為GPIO控制器控制
設(shè)置所使用GPIO端口的類型為輸入
使能所使用GPIO端口的輸入毛刺濾波功能
使能相應(yīng)的GPIO控制器時(shí)鐘
取指定地址的虛擬地址并向地址寫入數(shù)據(jù)0x0
……
3.2 文件操作函數(shù)的實(shí)現(xiàn)
因?yàn)殒I盤在系統(tǒng)中一般只起輸入作用,因此在鍵盤驅(qū)動(dòng)程序的file_operations結(jié)構(gòu)中,必須實(shí)現(xiàn)的文件操作函數(shù)只有文件讀函數(shù)。
另外在實(shí)際應(yīng)用中,為防止鍵盤按鍵的丟失,被按下鍵的掃描代碼通常都放置在一個(gè)緩沖區(qū)內(nèi),直到應(yīng)用程序準(zhǔn)備處理一個(gè)按鍵為止。緩沖區(qū)大小一般視應(yīng)用系統(tǒng)的需求而定,本例中緩沖區(qū)大小取為20個(gè)按鍵代碼。而緩沖區(qū)的實(shí)現(xiàn)是以一個(gè)環(huán)形隊(duì)列的形式實(shí)現(xiàn)。當(dāng)按鍵按下后,掃描代碼將被放置在隊(duì)列的下一個(gè)空位置,若緩沖區(qū)已滿,則下一按鍵將會(huì)被丟棄。應(yīng)用程序則通過(guò)鍵盤的讀函數(shù)read()從緩沖區(qū)的位置指針處起,讀取所需個(gè)數(shù)的鍵碼;完成讀取操作后,還需將已被讀取的鍵碼從緩沖隊(duì)列中刪除,并更新緩沖區(qū)的位置指針。下面給出了本例中,實(shí)現(xiàn)的鍵盤讀函數(shù)key_read()的偽代碼:
ssize_t key_read(……)
{
定義并初始化變量;
if 緩沖區(qū)中可被讀取的鍵碼數(shù)大于0;
取得鍵碼放置緩沖區(qū)的自旋鎖;
計(jì)算此次讀操作可讀取的代碼個(gè)數(shù)M(緩沖區(qū)中可讀取的代碼個(gè)數(shù)與程序要求個(gè)數(shù)之間的較小者);
從緩沖區(qū)位置指針開(kāi)始,從緩沖區(qū)中拷貝M個(gè)的鍵碼到用戶空間緩沖區(qū)內(nèi);
更新緩沖區(qū)的位置指針和緩沖區(qū)中還剩余的鍵碼個(gè)數(shù);
釋放自旋鎖
返回此次讀操作成功讀取的代碼個(gè)數(shù)。
Else
返回-1
}
DIY機(jī)械鍵盤相關(guān)社區(qū):機(jī)械鍵盤DIY
pos機(jī)相關(guān)文章:pos機(jī)原理
評(píng)論