• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      基于嵌入式Linux的矩陣鍵盤(pán)驅(qū)動(dòng)程序研究與開(kāi)發(fā)

      2009-05-12 03:14楊斌斌張雪英王玉宏
      現(xiàn)代電子技術(shù) 2009年2期

      楊斌斌 張雪英 王玉宏

      摘 要:主要介紹基于嵌入式Linux的矩陣鍵盤(pán)驅(qū)動(dòng)程序設(shè)計(jì)的方法,硬件平臺(tái)基于TI提供的OMAP5912構(gòu)建的嵌入式語(yǔ)音識(shí)別系統(tǒng),充分利用OMAP5912的外圍硬件資源,矩陣鍵盤(pán)作為平臺(tái)設(shè)備和輸入設(shè)備,利用Linux內(nèi)核提供的輸入子系統(tǒng)。輸入子系統(tǒng)為輸入設(shè)備驅(qū)動(dòng)開(kāi)發(fā)提供了良好的接口,提高了驅(qū)動(dòng)程序的開(kāi)發(fā)效率。驅(qū)動(dòng)開(kāi)發(fā)完成后,在MiniGui和Qtopia下測(cè)試,結(jié)果證明驅(qū)動(dòng)程序工作高效、穩(wěn)定。

      關(guān)鍵詞:矩陣鍵盤(pán);嵌入式Linux;OMAP5912;設(shè)備驅(qū)動(dòng)

      中圖分類(lèi)號(hào):TP334.2文獻(xiàn)標(biāo)識(shí)碼:B

      文章編號(hào):1004 373X(2009)02 039 03

      Research and Development of Matrix Keyboard Device Driver Based on Embedded Linux

      YANG Binbin,ZHANG Xueying,WANG Yuhong

      (College of Information Engineering,Taiyuan University of Technology,Taiyuan,030024,China)

      Abstract:This paper mainly introduces a scheme of matrix keyboard device driver based on embedded Linux.The hardware platform is the embedded speech recognition system based on OMAP5912.Taking full advantage of the peripheral equipments of OMAP5912,the matrix keyboard is treated as platform device and input device.The Linux kernel offers input subsystem which provides interface to the developer and improves efficiency of the driver development.After the development of device driver is achieved,it is tested via MiniGui and Qtopia and the result proves that the device driver is effective and stable.

      Keywords:matrix keyboard;embedded Linux;OMAP5912;device driver

      0 引 言

      隨著以計(jì)算機(jī)技術(shù)、通信技術(shù)和軟件技術(shù)為核心的信息技術(shù)的發(fā)展,嵌入式系統(tǒng)在各個(gè)行業(yè)中得到了廣泛的應(yīng)用。嵌入式系統(tǒng)已成為當(dāng)今IT行業(yè)的焦點(diǎn)之一。而在嵌入式系統(tǒng)中,鍵盤(pán)是重要的人機(jī)交互設(shè)備之一。嵌入式Linux是一種開(kāi)放源碼、軟實(shí)時(shí)、多任務(wù)的操作系統(tǒng),是開(kāi)發(fā)嵌入式產(chǎn)品的優(yōu)秀操作系統(tǒng)平臺(tái),是在標(biāo)準(zhǔn)Linux基礎(chǔ)上針對(duì)嵌入式系統(tǒng)進(jìn)行優(yōu)化和裁剪后形成的,因此具有Linux的基本性質(zhì)。在此提出的矩陣鍵盤(pán)驅(qū)動(dòng)程序的設(shè)計(jì)方案是以嵌入式Linux和TI OMAP5912處理器為軟硬件平臺(tái)的,在設(shè)計(jì)的嵌入式語(yǔ)音識(shí)別應(yīng)用平臺(tái)中,通過(guò)測(cè)試,表明其具有良好的穩(wěn)定性和實(shí)時(shí)性。

      1 硬件原理

      OMAP5912處理器是由TI應(yīng)用最為廣泛的TMS320C55X DSP內(nèi)核與低功耗、增強(qiáng)型ARM926EJ-S微處理器組成的雙核應(yīng)用處理器[1]。用這樣一種組合方式將2個(gè)處理器整合在1個(gè)芯片后,開(kāi)發(fā)人員可以根據(jù)實(shí)際情況,利用 DSP 運(yùn)行復(fù)雜度較高的數(shù)字信號(hào)處理任務(wù),利用 ARM 運(yùn)行通信、控制和人機(jī)接口方面的任務(wù),從而使便攜式設(shè)備在保持良好人機(jī)交互環(huán)境的基礎(chǔ)上,有效地降低功耗[2]。在外設(shè)方面,OMAP5912微處理器支持常用的各種接口,其中通過(guò)MPUIO接口最多可支持8×8的矩陣鍵盤(pán),系統(tǒng)中采用這個(gè)接口擴(kuò)展了一個(gè)4×5的矩陣鍵盤(pán)[3]。其硬件連接示意圖如圖1所示,其中按鍵行陣列必須提供上拉信號(hào),列陣列加二極管,防止瞬間電流過(guò)大對(duì)MPUIO口造成沖擊。

      按照鍵盤(pán)的構(gòu)造方式人們把鍵盤(pán)劃分為線性鍵盤(pán)和矩陣鍵盤(pán)[4]。其中,線性鍵盤(pán)是指每個(gè)按鍵都占用嵌入式處理器的1個(gè)I/O端口,并通過(guò)這個(gè)I/O端口實(shí)現(xiàn)人機(jī)交互,各個(gè)按鍵之間互不影響。使用這種方案的優(yōu)點(diǎn)是簡(jiǎn)單、可靠,但是線性鍵盤(pán)對(duì)I/O端口的占用量很大。因此,嵌入式系統(tǒng)中很少采用這種方法。

      另外一種矩陣鍵盤(pán)是指當(dāng)按鍵數(shù)量過(guò)多時(shí),采用矩陣的排列方法,將按鍵設(shè)計(jì)成n行m列的矩陣形式。其中,每個(gè)按鍵占用行和列的1個(gè)交叉點(diǎn),并且以行和列為單位引出信號(hào)線。這樣只需要占用n+m個(gè)I/O端口,卻可以驅(qū)動(dòng)n×m個(gè)按鍵,大大節(jié)省了對(duì)嵌入式處理器I/O端口的占用,節(jié)省了寶貴的資源。矩陣鍵盤(pán)在減少嵌入式處理器I/O端口占用的問(wèn)題上做出了很大的貢獻(xiàn),但隨之而來(lái)的問(wèn)題是如何確定矩陣中按鍵的位置,這里采用列掃描法,其思路如下:

      在鍵盤(pán)初始化階段,所有的列信號(hào)(KBC)都被設(shè)置輸出為低電平。如果矩陣鍵盤(pán)中的1個(gè)按鍵按下,則相應(yīng)的行信號(hào)和列信號(hào)線短路,行信號(hào)線(KBR)輸入由高電平變?yōu)榈碗娖?,產(chǎn)生1個(gè)中斷,然后在驅(qū)動(dòng)的中斷服務(wù)程序中按照表1中的序列逐列掃描列信號(hào),讀取行信號(hào)的狀態(tài),根據(jù)讀回來(lái)的行信號(hào)狀態(tài)就可以判斷有那些按鍵按下[3]。

      另外,鍵盤(pán)驅(qū)動(dòng)必須解決的一個(gè)問(wèn)題是鍵盤(pán)的抖動(dòng)[4]。在按鍵按下和抬起的過(guò)程中,電壓信號(hào)會(huì)出現(xiàn)很多毛刺,這主要是由于機(jī)械按鍵的彈性作用引起的。盡管觸點(diǎn)看起來(lái)非常穩(wěn)定,而且快速地閉合,但相對(duì)于嵌入式處理器的運(yùn)行速度來(lái)說(shuō),這種動(dòng)作是比較慢的。這種脈沖在某些按鍵功能設(shè)計(jì)時(shí),如果處理不當(dāng)可能會(huì)帶來(lái)災(zāi)難性的后果。所以必須對(duì)按鍵信號(hào)進(jìn)行防抖檢測(cè)。

      按鍵防抖檢測(cè)的核心思想是在嵌入式處理器的幾個(gè)時(shí)鐘周期內(nèi),通過(guò)對(duì)按鍵信號(hào)進(jìn)行多次訪問(wèn),查看電平狀態(tài)是否保存一致[5]。如果保持一致,則說(shuō)明按鍵狀態(tài)已經(jīng)穩(wěn)定;否則,說(shuō)明之前檢測(cè)到的按鍵信號(hào)是抖動(dòng)信號(hào)或外界信號(hào)干擾,系統(tǒng)將不會(huì)對(duì)其進(jìn)行任何處理。

      2 嵌入式Linux設(shè)備驅(qū)動(dòng)程序

      在Linux內(nèi)核源代碼中,各種驅(qū)動(dòng)程序的代碼量占據(jù)了整個(gè)Linux代碼的85%[6]。可見(jiàn), Linux設(shè)備驅(qū)動(dòng)在整個(gè)操作系統(tǒng)中起著舉足輕重的作用。設(shè)備驅(qū)動(dòng)是操作系統(tǒng)內(nèi)核和機(jī)器硬件之間的接口,它們控制著設(shè)備的操作動(dòng)作,并且提供了一組API接口給應(yīng)用程序,使得應(yīng)用程序能夠與這個(gè)設(shè)備互動(dòng)[7]。而且,設(shè)備驅(qū)動(dòng)為應(yīng)用程序屏蔽了硬件的細(xì)節(jié),在應(yīng)用程序看來(lái),硬件設(shè)備只是1個(gè)設(shè)備文件,應(yīng)用程序就可以像操作普通文件一樣對(duì)硬件設(shè)備進(jìn)行操作[8]。在Linux操作系統(tǒng)中,通常將外圍設(shè)備分為3種類(lèi)型:字符設(shè)備、塊設(shè)備和網(wǎng)絡(luò)設(shè)備[6]。

      而在Linux操作系統(tǒng)中,還有一類(lèi)設(shè)備被定義為“平臺(tái)設(shè)備”,通常SoC(System on Chip)系統(tǒng)中集成的獨(dú)立的外設(shè)單元都被當(dāng)作平臺(tái)設(shè)備來(lái)處理,這里把4×5的矩陣鍵盤(pán)也定義為平臺(tái)設(shè)備。所謂的“平臺(tái)設(shè)備”并不是與字符設(shè)備、塊設(shè)備和網(wǎng)絡(luò)設(shè)備并列的概念,而是Linux系統(tǒng)提供的一種附加手段,例如,鍵盤(pán)驅(qū)動(dòng),它本身是字符設(shè)備,但也將其歸納為平臺(tái)設(shè)備。

      另外,鍵盤(pán)又屬于輸入設(shè)備,Linux內(nèi)核提供了輸入子系統(tǒng),如鍵盤(pán)、觸摸屏、鼠標(biāo)等輸入設(shè)備都可以利用輸入子系統(tǒng)的接口函數(shù)來(lái)實(shí)現(xiàn)設(shè)備驅(qū)動(dòng)[4]。輸入子系統(tǒng)由核心層(Input Core)、驅(qū)動(dòng)層和事件處理層(Event Handler)三部分組成[9]。在Linux內(nèi)核中,使用輸入子系統(tǒng)實(shí)現(xiàn)輸入設(shè)備驅(qū)動(dòng)的時(shí)候,驅(qū)動(dòng)的核心工作是向系統(tǒng)報(bào)告按鍵、觸摸屏、鼠標(biāo)等輸入事件,而不再需要關(guān)心文件操作接口,因?yàn)檩斎胱酉到y(tǒng)已經(jīng)完成了文件操作接口。通過(guò)輸入子系統(tǒng),實(shí)現(xiàn)輸入設(shè)備驅(qū)動(dòng)時(shí)只需要完成以下工作:

      (1)在模塊加載函數(shù)中告知輸入子系統(tǒng)輸入設(shè)備可以報(bào)告的事件。例如,可通過(guò)__set_bit(EV_KEY,input_dev->evbit)來(lái)告知輸入子系統(tǒng)該設(shè)備可報(bào)告按鍵事件。

      (2)在模塊加載函數(shù)中注冊(cè)輸入設(shè)備。注冊(cè)函數(shù)為:int input_register_device(struct input_dev *dev);

      (3)當(dāng)有輸入事件發(fā)生時(shí),如按鍵按下/抬起、觸摸屏被觸摸/抬起/移動(dòng)時(shí),通過(guò)input_report_xxx()報(bào)告發(fā)生的事件及對(duì)應(yīng)的鍵值、坐標(biāo)等狀態(tài)。主要的事件類(lèi)型包括EV_KEY(按鍵事件)、EV_REL(相對(duì)值,如鼠標(biāo)移動(dòng),報(bào)告相對(duì)于最后一次位置的偏移)和EV_ABS(絕對(duì)值,如觸摸屏)。用于報(bào)告EV_KEY事件的函數(shù)為:void input_report_key(struct input_dev *dev,unsigned int code,int value);

      (4)在模塊卸載函數(shù)中注銷(xiāo)輸入設(shè)備。注銷(xiāo)輸入設(shè)備的函數(shù)為:void input_unregister_device(struct input_dev *dev);

      3 矩陣鍵盤(pán)驅(qū)動(dòng)中的數(shù)據(jù)結(jié)構(gòu)

      首先,定義一個(gè)整型數(shù)組osk_keymap[]用來(lái)定義按鍵映射表,把20個(gè)按鍵返回的碼值映射成內(nèi)核中標(biāo)準(zhǔn)的鍵碼,這樣有利于與上層應(yīng)用程序的交互。通過(guò)KEY(col,row,code)宏定義來(lái)實(shí)現(xiàn)映射關(guān)系,如要把第2行第4列的按鍵映射為回車(chē)鍵,則通過(guò)KEY(3,1,KEY_ENTER)便可實(shí)現(xiàn)。其中KEY_ENTER是內(nèi)核中定義的標(biāo)準(zhǔn)的鍵碼。

      其次,定義矩陣鍵盤(pán)的設(shè)備結(jié)構(gòu)體omap_kp,其定義如下:

      struct omap_kp {

      struct input_dev *input; //定義輸入設(shè)備結(jié)構(gòu)體指針

      struct timer_list timer; //定義計(jì)時(shí)器

      int irq; //中斷號(hào)

      unsigned int rows; //行數(shù)

      unsigned int cols; //列數(shù)

      unsigned long delay; //延時(shí)

      unsigned int debounce; //去抖的間隔時(shí)間

      int suspended; //判斷設(shè)備是不是懸停

      spinlock_t suspend_lock; //自旋鎖

      };

      4 矩陣鍵盤(pán)驅(qū)動(dòng)程序設(shè)計(jì)及測(cè)試

      首先,實(shí)現(xiàn)矩陣鍵盤(pán)驅(qū)動(dòng)的加載和卸載函數(shù),分別通過(guò)調(diào)用platform_driver_register()和platform_driver_unregister()實(shí)現(xiàn)矩陣鍵盤(pán)作為一個(gè)平臺(tái)設(shè)備的注冊(cè)和注銷(xiāo)。

      其次,實(shí)現(xiàn)矩陣鍵盤(pán)驅(qū)動(dòng)的探測(cè)和移除函數(shù)。在探測(cè)函數(shù)中,初始化行數(shù)、列數(shù)、中斷號(hào)以及按鍵映射表。然后分配內(nèi)存空間和輸入設(shè)備,初始化omap_kp這個(gè)設(shè)備結(jié)構(gòu)體和輸入設(shè)備結(jié)構(gòu)體input_dev,初始化定時(shí)器,設(shè)置輸入設(shè)備可以報(bào)告的事件類(lèi)型,并注冊(cè)輸入設(shè)備。最后申請(qǐng)中斷,申請(qǐng)中斷成功后,使能中斷。移除函數(shù)則完成相反的工作。

      最后,實(shí)現(xiàn)矩陣鍵盤(pán)驅(qū)動(dòng)的核心部分,也就是中斷部分。眾所周知,在Linux的中斷處理中分為2部分,分別是頂半部(top half)和底半部(bottom half)[10]。

      頂半部完成盡可能少的比較緊急的功能,它只是簡(jiǎn)單地讀取寄存器中的中斷狀態(tài)并清除中斷標(biāo)志后就進(jìn)行“登記中斷”的工作。“登記中斷”意味著將底半部處理程序掛到該設(shè)備的底半部執(zhí)行隊(duì)列中去。這樣,頂半部執(zhí)行的速度就會(huì)很快,可以服務(wù)更多的中斷請(qǐng)求。

      底半部,是實(shí)現(xiàn)中斷處理的真正部分,它來(lái)完成一些延緩的耗時(shí)任務(wù),首先通過(guò)列掃描法檢測(cè)各個(gè)按鍵狀態(tài)有沒(méi)有變化,若有變化再判斷是哪一列哪一行發(fā)生變化,按鍵的行和列確定以后,通過(guò)鍵值映射表來(lái)查找其有沒(méi)有對(duì)應(yīng)的鍵值;若有則通過(guò)input_report_key()向內(nèi)核報(bào)告按鍵的鍵值;否則,對(duì)應(yīng)的按鍵沒(méi)有定義鍵值,向內(nèi)核報(bào)告為假按鍵(Spurious Key)。然后,延時(shí)(1/20)Hz再判斷按鍵是否抬起。

      驅(qū)動(dòng)開(kāi)發(fā)完成后,以模塊方式加入到內(nèi)核,并在MiniGui和Qtopia下進(jìn)行了測(cè)試,在Qtopia下測(cè)試結(jié)果如圖2所示,證明矩陣鍵盤(pán)驅(qū)動(dòng)工作正常、有效。

      5 結(jié) 語(yǔ)

      在此介紹了基于OMAP5912和嵌入式Linux的一種矩陣鍵盤(pán)驅(qū)動(dòng)的工作原理和開(kāi)發(fā)方案。該驅(qū)動(dòng)以靜態(tài)方式加入內(nèi)核后,通過(guò)測(cè)試證明矩陣鍵盤(pán)驅(qū)動(dòng)工作穩(wěn)定、高效,在MiniGui和Qtopia的記事本中,都能正確顯示正確的鍵值,基本上實(shí)現(xiàn)了其功能,并成功地應(yīng)用于所開(kāi)發(fā)的嵌入式語(yǔ)音識(shí)別系統(tǒng)中。

      參考文獻(xiàn)

      [1]OMAP5912 Applications Processor Data Manual[S].2004.

      [2]韓金燕,盧素鋒,王勝坤.一種基于TI OMAP的PDA的設(shè)計(jì)[J].電腦開(kāi)發(fā)與應(yīng)用,2007,20(2):47-49.

      [3]OMAP5912 Multimedia Processor Keyboard InterfaceReference Guide[S].2004.

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

      [5]李杰,曹宇,朱堅(jiān),等.基于嵌入式Linux的矩陣鍵盤(pán)設(shè)計(jì)與實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2006,24(3):81-83.[6]孫天澤.嵌入式設(shè)計(jì)及Linux驅(qū)動(dòng)開(kāi)發(fā)指南基于ARM9處理器[M].北京:電子工業(yè)出版社,2007.

      [7]祝世海.嵌入式微處理器的Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)[J].哈爾濱商業(yè)大學(xué)學(xué)報(bào):自然科學(xué)版,2007,23(3):329-331.

      [8]李世勇,肖竟華.基于Linux驅(qū)動(dòng)程序的編寫(xiě)技術(shù)[J].電腦與信息技術(shù),2006,14(3):43-45.

      [9]Alessandro Rubini,Jonathan Corbet,Gerg Kroah-Hartman.Linux Device Drivers.Third Edition.O′Reilly,2008.

      [10]王兵,王冰峰.嵌入式Linux按鍵驅(qū)動(dòng)程序的設(shè)計(jì)[J].科技資訊,2007(1):220-223.

      作者簡(jiǎn)介 楊斌斌 男,1983年出生,山西新絳人,在讀碩士研究生。研究方向?yàn)檎Z(yǔ)音信號(hào)處理與嵌入式系統(tǒng)。

      張雪英 女,太原理工大學(xué)教授、博士生導(dǎo)師。研究方向?yàn)檎Z(yǔ)音信號(hào)處理。

      南充市| 南木林县| 昌都县| 黔西| 正宁县| 吉木萨尔县| 大石桥市| 东山县| 新泰市| 乐陵市| 苍南县| 辽中县| 获嘉县| 阳谷县| 如皋市| 呼玛县| 九龙城区| 渝中区| 东乡县| 永修县| 隆回县| 浦江县| 青海省| 内乡县| 鞍山市| 武宣县| 隆化县| 攀枝花市| 鹤岗市| 益阳市| 民和| 曲水县| 南通市| 平谷区| 定陶县| 六枝特区| 鄂托克前旗| 威远县| 浪卡子县| 常熟市| 宜州市|