国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于嵌入式Linux的矩陣鍵盤驅(qū)動研究與實現(xiàn)

2012-09-18 02:20:06李其珂付紅橋
關(guān)鍵詞:驅(qū)動程序內(nèi)核按鍵

李其珂,付紅橋

(重慶大學(xué)光電工程學(xué)院,重慶 400030)

隨著電子信息技術(shù)的高速發(fā)展,越來越多的工業(yè)控制設(shè)備和移動終端設(shè)備得到廣泛的應(yīng)用,這些設(shè)備通稱為嵌入式系統(tǒng)。IEEE(國際電氣和電子工程師協(xié)會)對嵌入式系統(tǒng)的定義為“用于控制、監(jiān)視或者輔助操作機器和設(shè)備的裝置”。在這些嵌入式系統(tǒng)中,鍵盤作為人機交互的重要手段,是應(yīng)用最為廣泛的輸入設(shè)備之一。當(dāng)按鍵較少時,采用獨立式鍵盤,當(dāng)按鍵較多時,采用矩陣式鍵盤。嵌入式Linux具有開源、免費、容易裁剪和良好的硬件支持等特性[1],在嵌入式計算領(lǐng)域得到了最為廣泛的應(yīng)用。

當(dāng)前,對于嵌入式系統(tǒng)中的矩陣鍵盤功能實現(xiàn),多數(shù)應(yīng)用是基于中斷方式來實現(xiàn)的[2-3]。按鍵事件在一個嵌入式系統(tǒng)中并不需要實時性很高,而采用中斷的方式來判斷按鍵是否按下的方案會把一個嵌入式系統(tǒng)中的按鍵事件的優(yōu)先級提高,系統(tǒng)中其他更需要迫切處理的事件就延遲處理了,這就降低了整個系統(tǒng)的實時性能。本研究在基于嵌入式微處理器 AT91RM9200的基礎(chǔ)上,采用輪詢的機制實現(xiàn)了一個4×4矩陣鍵盤,并設(shè)計了矩陣鍵盤的驅(qū)動程序。

1 軟硬件平臺

1.1 硬件平臺

AT91RM9200是ATMEL應(yīng)用最為廣泛的一款基于RISC架構(gòu)的工業(yè)級ARM9處理器,主頻高達(dá)200 MHz,功耗低,片內(nèi)外設(shè)非常豐富,支持嵌入式微處理器的各種常用接口,并且提供了4×32個可編程的GPIO端口[4]。本系統(tǒng)采用PB端口擴展了一個4×4矩陣鍵盤。其中鍵盤硬件連接示意圖如圖1所示。按鍵列陣列必須提供上拉信號,即通過4.7 K上拉電阻連接到+3.3 V電源電壓VDD上,行和列陣列都加了20 Ω電阻,防止瞬間電流過大對嵌入式微處理器I/O口造成沖擊。

按照鍵盤的構(gòu)造方式,常用的鍵盤接口分為獨立式鍵盤接口和矩陣式鍵盤接口。其中,獨立式鍵盤的每個按鍵都占用嵌入式微處理器的一個I/O口,各按鍵相互獨立。使用獨立式鍵盤的優(yōu)點是電路簡單、可靠,軟件編程簡單。缺點是在資源受到限制的嵌入式系統(tǒng)中,獨立式鍵盤對I/O口占用較多。因此,在嵌入式系統(tǒng)中很少使用獨立式鍵盤這種方案。

在嵌入式應(yīng)用系統(tǒng)中,大量使用矩陣式鍵盤,它能用比較少的I/O端口驅(qū)動比較多的按鍵。圖1是嵌入式系統(tǒng)中最常采用的4×4矩陣鍵盤。4×4矩陣鍵盤電路由4根行線和4根列線組成,按鍵位于行、列的交叉點上。一個4×4的行列結(jié)構(gòu)可以構(gòu)成一個16個按鍵的鍵盤。4×4矩陣鍵盤的行和列分別和AT91RM9200處理器 的4個GPIO(General Parallel Input/Output)端口相連。顯然,在按鍵數(shù)量較多的場合,矩陣鍵盤和獨立鍵盤相比可以大大節(jié)省嵌入式系統(tǒng)的I/O口資源。

圖1 鍵盤硬件連接示意圖

1.2 軟件平臺

本研究采用Linux 2.6內(nèi)核作為設(shè)計的軟件平臺。隨著信息技術(shù)的不斷進步,系統(tǒng)的拓?fù)浣Y(jié)構(gòu)越來越復(fù)雜,操作系統(tǒng)對智能電源管理、熱插拔以及即插即用的支持要求也越來越高,Linux 2.4內(nèi)核已經(jīng)難以滿足這些需求。為了滿足這些新的需求,Linux 2.6內(nèi)核開發(fā)了全新的總線、類、設(shè)備和驅(qū)動環(huán)環(huán)相扣的設(shè)備模型[5]。

Linux 2.6內(nèi)核的設(shè)備模型如圖2所示。它是基于總線、設(shè)備和驅(qū)動的。設(shè)備掛在總線上,驅(qū)動和設(shè)備進行分離。

Linux系統(tǒng)將設(shè)備分成3種基本類型:字符設(shè)備、塊設(shè)備和網(wǎng)絡(luò)設(shè)備[6]。鍵盤屬于字符設(shè)備。許多設(shè)備都掛在總線上,但是也有設(shè)備沒有掛在總線上,本系統(tǒng)的矩陣鍵盤設(shè)備就沒有掛在總線上。Linux 2.6內(nèi)核提供了一種platform總線機制,它是一種虛擬的總線。沒有掛在總線上的設(shè)備都可以掛在platform總線上。這種機制完全符合Linux 2.6內(nèi)核的總線、設(shè)備和驅(qū)動的設(shè)備模型,并將設(shè)備和驅(qū)動進行了分離。

在Linux內(nèi)核源代碼中,各種驅(qū)動程序的代碼量占據(jù)了整個Linux內(nèi)核代碼的85%,這足以說明Linux設(shè)備驅(qū)動在內(nèi)核代碼中的重要作用。設(shè)備驅(qū)動不僅為應(yīng)用程序提供了訪問設(shè)備的機制,還為應(yīng)用程序屏蔽了硬件的具體細(xì)節(jié)。在應(yīng)用程序看來,硬件設(shè)備只是一個設(shè)備文件,用戶可以像操作普通的文件一樣應(yīng)用程序操作硬件。

圖2 Linux設(shè)備模型

2 4×4矩陣鍵盤的驅(qū)動模塊設(shè)計

在完成4×4矩陣鍵盤接口電路的設(shè)計和掌握Linux 2.6的設(shè)備模型的基礎(chǔ)上,還需要編寫相應(yīng)的矩陣鍵盤驅(qū)動程序。本研究采用的基于AT91RM9200處理器的平臺已經(jīng)成功移植并運行了嵌入式Linux操作系統(tǒng)[7],因此鍵盤的驅(qū)動模塊開發(fā)就變得簡單了許多。嵌入式Linux中的驅(qū)動程序運行在內(nèi)核態(tài),屬于操作系統(tǒng)的范疇。驅(qū)動程序可以靜態(tài)編譯到內(nèi)核,也可以以模塊方式動態(tài)加載到內(nèi)核。為了方便調(diào)試,本研究選擇將按鍵驅(qū)動以動態(tài)模式加載到內(nèi)核中。矩陣鍵盤驅(qū)動程序的編寫主要可分為驅(qū)動程序初始化、文件操作接口實現(xiàn)以及鍵盤掃描3部分。

2.1 驅(qū)動程序初始化

鍵盤驅(qū)動程序?qū)儆谧址O(shè)備驅(qū)動程序的范疇。鍵盤驅(qū)動模塊主要由模塊加載函數(shù)、模塊卸載函數(shù)和模塊許可證聲明3部分組成。模塊加載函數(shù)除了完成鍵盤設(shè)備主、次設(shè)備號的申請和鍵盤設(shè)備的注冊外,還應(yīng)包括硬件的初始化。下面是本文根據(jù)AT91RM9200處理器的特性[4]編寫了硬件初始化的偽代碼。

2.2 文件操作接口的實現(xiàn)

鍵盤在嵌入式系統(tǒng)中起到輸入作用,所以在矩陣鍵盤驅(qū)動程序的文件操作結(jié)構(gòu)體中,最重要的文件操作函數(shù)是文件讀函數(shù)。在鍵盤設(shè)備文件讀函數(shù)中加入自旋鎖,確保矩陣鍵盤文件在同一時刻只被一個進程打開。因為多次按鍵可能無法被及時處理,結(jié)合實際項目的應(yīng)用需求,可以利用緩沖區(qū)緩存被按下鍵的鍵碼值,直到用戶應(yīng)用程序處理這一按鍵事件。本研究中的緩沖區(qū)是用一個環(huán)形隊列來實現(xiàn)的。緩沖區(qū)的大小可以根據(jù)具體的應(yīng)用來調(diào)整,本研究設(shè)定緩沖區(qū)的大小為10個字節(jié)。當(dāng)按鍵被按下后,鍵碼值就緩存到緩沖區(qū)的下一個空閑位置處,并更新緩沖區(qū)位置指針。當(dāng)緩沖區(qū)滿時,丟棄此次按鍵的鍵碼值。用戶應(yīng)用程序通過系統(tǒng)調(diào)用read()函數(shù)來讀取緩沖區(qū)的鍵碼值,驅(qū)動程序根據(jù)實際讀取鍵碼值的多少調(diào)整緩沖區(qū)的位置指針。以下是實現(xiàn)鍵盤讀函數(shù)keyboard_read()的偽代碼:個數(shù);

2.3 鍵盤掃描

鍵盤掃描程序是用來判斷被按下鍵的位置并取得相應(yīng)的鍵碼值,然后存放到鍵碼緩沖區(qū)中。鍵盤掃描程序的實現(xiàn)有中斷方式和輪詢方式。本研究中利用嵌入式Linux操作系統(tǒng)的內(nèi)核定時器實現(xiàn)了輪詢矩陣鍵盤的掃描方案,主要基于以下原因:一是AT91RM9200的一組GPIO端口只有一條中斷信號線,如果采用中斷方式,對于圖1的硬件設(shè)計方案必須使用4條中斷信號線才能滿足設(shè)計要求;二是因為鍵盤是嵌入式系統(tǒng)中的一種低速輸入設(shè)備,采用輪詢掃描鍵盤的方式就可以滿足矩陣鍵盤的輸入要求。

嵌入式Linux操作系統(tǒng)提供了良好的內(nèi)核定時器機制,只要通過對內(nèi)核定時器接口函數(shù)和數(shù)據(jù)結(jié)構(gòu)進行簡單的操作,就可以實現(xiàn)周期性地輪詢矩陣鍵盤的狀態(tài),并對按鍵事件進程進行處理。這一周期性時間間隔本研究指定為10 ms。本文給出的4×4矩陣鍵盤輪詢掃描程序算法流程如圖3所示。

3 鍵盤問題的處理方法

3.1 消除按鍵抖動

對于消除按鍵抖動,本研究采用軟件消抖的方法。鍵盤作為輸入設(shè)備,也是共享設(shè)備。本文采用了“自旋鎖(spinlock)”機制來對共享的鍵盤實現(xiàn)互斥訪問。因為自旋鎖保護的代碼不能睡眠,否則就有可能發(fā)生死鎖,造成系統(tǒng)死機,因此消除按鍵抖動的思路是在第1次檢測到有鍵按下時,調(diào)用mdelay(KBD_JITTER)函數(shù)實現(xiàn)2 ms的短延時后,再次確認(rèn)該鍵是否被按下,從而達(dá)到消除按鍵抖動的目的。

圖3 矩陣鍵盤掃描算法流程

3.2 重鍵

利用按鍵按下抬起標(biāo)志(按鍵抬起的鍵碼值是按下的鍵碼值加上0xA0),把一次完整的按鍵事件分成按下和抬起2部分。當(dāng)有鍵按下未抬起的同時又有其他鍵按下,這時線程就會一直循環(huán)掃描鍵盤事件,所以能把其他的按鍵事件捕捉到并加入到環(huán)形等待隊列中。

4 鍵盤驅(qū)動測試

鍵盤驅(qū)動測試主要測試鍵盤驅(qū)動能否正確地判斷被按下鍵的位置并取得相應(yīng)的鍵碼值。在硬件方面,首先將PB0~PB7端口與矩陣鍵盤的行列線如圖1所示連接。然后用串口線把PC機的COM口和以AT91RM9200為核心的嵌入式目標(biāo)系統(tǒng)的調(diào)試串口相連。在軟件方面,保證嵌入式目標(biāo)系統(tǒng)已經(jīng)能穩(wěn)定運行Linux操作系統(tǒng)。然后利用PC機上的串口控制臺來控制嵌入式目標(biāo)系統(tǒng)[8]。用insmod命令將編譯好的矩陣驅(qū)動模塊動態(tài)加載到內(nèi)核,然后執(zhí)行矩陣鍵盤測試應(yīng)用程序。

當(dāng)有按鍵被按下時,就會有被按下鍵的鍵碼值立即回顯在串口控制臺;當(dāng)按鍵抬起時,就會有相應(yīng)按鍵的鍵碼值加上0xA0立即回顯在串口控制臺。測試表明,此矩陣鍵盤驅(qū)動程序能實時、正確地判斷被按下鍵的位置。

5 結(jié)束語

本文介紹了基于ATMEL AT91RM9200和嵌入式Linux的4×4矩陣鍵盤驅(qū)動程序的實現(xiàn)方案。該驅(qū)動程序以動態(tài)模塊的方式加入內(nèi)核后,通過應(yīng)用程序測試證明矩陣鍵盤驅(qū)動工作準(zhǔn)確、穩(wěn)定。這一方案也對在其他嵌入式設(shè)備上擴展矩陣鍵盤具有參考價值和意義。

[1]Alex Lentnon.Embedded Linux[J].Embedded Systems,2001(5):125-128.

[2]孟桂芳.基于嵌入式Linux的矩陣鍵盤設(shè)備驅(qū)動的設(shè)計[J].蘇州大學(xué)學(xué)報:工科版,2011(4):71 -74.

[3]楊斌斌,張雪英,王玉宏.基于嵌入式Linux的矩陣鍵盤驅(qū)動程序研究與開發(fā)[J].現(xiàn)代電子技術(shù),2009(2):39-41.

[4]ATMEL.AT91RM9200 User Manual[S].

[5]宋寶華.Linux設(shè)備驅(qū)動開發(fā)詳解[M].北京:人民郵電出版社,2008.

[6]Jonathan Corbet,Alessandro Rubini,Greg Kroah-Hartman.Linux設(shè)備驅(qū)動程序[M].魏永明,耿岳,鐘書毅,譯.北京:中國電力出版社,2005.

[7]陳陽,徐曉光,陳躍東.基于嵌入式系統(tǒng)的電能采集終端設(shè)計與實現(xiàn)[J].重慶理工大學(xué)學(xué)報:自然科學(xué)版,2011(3):97-101.

[8]王森林,莊圣賢.基于嵌入式Linux的MP3播放器設(shè)計[J].重慶工學(xué)院學(xué)報:自然科學(xué)版,2007(3):65-68.

猜你喜歡
驅(qū)動程序內(nèi)核按鍵
萬物皆可IP的時代,我們當(dāng)夯實的IP內(nèi)核是什么?
強化『高新』內(nèi)核 打造農(nóng)業(yè)『硅谷』
基于有限狀態(tài)機的按鍵檢測程序設(shè)計
電子制作(2021年3期)2021-06-16 03:14:26
基于嵌入式Linux內(nèi)核的自恢復(fù)設(shè)計
Linux內(nèi)核mmap保護機制研究
一種多方向?qū)Ч獍存I結(jié)構(gòu)設(shè)計
電子制作(2016年1期)2016-11-07 08:43:05
按鍵的多種狀態(tài)檢測及消抖處理方法
家電科技(2013年4期)2013-07-09 10:55:08
解析某型號手機按鍵檢測程序的缺陷
驅(qū)動程序更新與推薦
驅(qū)動程序更新與推薦
镇远县| 沁阳市| 泸西县| 边坝县| 夏津县| 永吉县| 安多县| 海盐县| 海原县| 太康县| 通海县| 大丰市| 滕州市| 龙里县| 甘洛县| 广元市| 兴文县| 喜德县| 盐城市| 孝义市| 乾安县| 吴江市| 怀柔区| 六枝特区| 沙坪坝区| 大足县| 上犹县| 怀来县| 天柱县| 东海县| 波密县| 湖州市| 鲁甸县| 江城| 阿城市| 平武县| 旬阳县| 苏尼特左旗| 枣庄市| 贵港市| 南召县|