李澤銀,龔 俊,吳昌昊
(中國兵器工業(yè)第五八研究所 特種電子技術(shù)部,四川 綿陽621000)
基于龍芯2H的Linux矩陣鍵盤驅(qū)動(dòng)的研究與實(shí)現(xiàn)
李澤銀,龔 俊,吳昌昊
(中國兵器工業(yè)第五八研究所 特種電子技術(shù)部,四川 綿陽621000)
針對(duì)某龍芯2H主板擴(kuò)展的4乘4矩陣鍵盤的需求,分析了鍵盤硬件電路及串行通信接口。在Linux 2.6.32的輸入子系統(tǒng)模型的基礎(chǔ)之上,設(shè)計(jì)了矩陣鍵盤輸入設(shè)備的驅(qū)動(dòng)程序并給出了驅(qū)動(dòng)程序?qū)崿F(xiàn)的過程。測(cè)試結(jié)果證明,該驅(qū)動(dòng)滿足了設(shè)計(jì)的需求,工作穩(wěn)定、高效,并且通用性較強(qiáng),在以后的項(xiàng)目中只需更改少量接口就可以使用。
龍芯2H;CH456;矩陣鍵盤;Linux驅(qū)動(dòng)
鍵盤在個(gè)人電腦中是標(biāo)準(zhǔn)配置,在嵌入式系統(tǒng)中也是非常重要的配置,是嵌入式系統(tǒng)最重要的人機(jī)交互手段之一。嵌入式系統(tǒng)普遍是針對(duì)特定的應(yīng)用而設(shè)計(jì)的,不同的應(yīng)用對(duì)輸入設(shè)備的要求也各不相同,因此需要根據(jù)具體應(yīng)用在系統(tǒng)中配置自己的鍵盤。Linux可應(yīng)用于各種硬件平臺(tái)、內(nèi)核穩(wěn)定高效、源代碼開放和網(wǎng)絡(luò)通信驅(qū)動(dòng)齊全等優(yōu)良特性,成為嵌入式系統(tǒng)領(lǐng)域中的一個(gè)研究熱點(diǎn)[1]。在此提出以Linux操作系統(tǒng)和龍芯2H處理器為軟硬件平臺(tái)的矩陣鍵盤驅(qū)動(dòng)程序的設(shè)計(jì)方案。
1.1硬件平臺(tái)
本系統(tǒng)采用的主處理器為龍芯2H,龍芯2H是龍芯2G處理器與龍芯1A(2F南橋)的后繼產(chǎn)品,其目標(biāo)是為安全適用計(jì)算機(jī)提供單片解決方案。龍芯2H采用65 nm工藝實(shí)現(xiàn),主頻達(dá)1 GHz。片內(nèi)集成定點(diǎn)處理器、浮點(diǎn)處理器、流媒體處理和圖形圖像處理功能,以及南橋、北橋等配套芯片組功能。龍芯2H內(nèi)部采用多級(jí)總線,低速外設(shè)(I2C、UART等)作為一個(gè)集合加在南橋總線上[2-3]。
本系統(tǒng)采用了擴(kuò)展一片沁恒公司的CH456芯片來實(shí)現(xiàn)鍵盤的功能,其中芯片連接示意圖如圖1所示。
該芯片可以進(jìn)行64鍵的掃描,通過兼容I2C線路2線串行接口和龍芯 2H進(jìn)行數(shù)據(jù)交換。INT#連接到龍芯2H的 GPIO13,SCL和SDA連接到龍芯2H的IIC1_SCL和IIC1_SDA。

圖1 CH456連接示意圖
芯片最大支持8×8鍵盤,本項(xiàng)目使用的是4×4鍵盤是可以兼容的。將矩陣鍵盤的4跟行線連接到XKI0-3,4跟列線連接到XKO0-3。插座示意圖如圖2所示。

圖2 鍵盤插座連接示意圖
1.1.1龍芯2H的I2C接口
龍芯2H集成了兩個(gè)I2C控制器,在Linux下通過內(nèi)存映射直接訪問芯片的寄存器。I2C-1模塊寄存器物理地址基址為:0x1fe91000,地址空間16 kB。在鍵盤驅(qū)動(dòng)中需要對(duì)龍芯I2C-1的發(fā)送數(shù)據(jù)寄存器(TXR)、接受數(shù)據(jù)寄存器(RXR)、命令控制寄存器(CR)和狀態(tài)寄存器(SR)4個(gè)寄存器進(jìn)行讀寫操作。
1.1.2鍵盤工作原理
CH456芯片會(huì)定期對(duì)鍵盤進(jìn)行掃描,在鍵盤掃描期間,XKO7~XKO0引腳按照XKO0至XKO7的順序依次輸出高電壓,其余引腳輸出低電壓;KI7~KI0引腳的輸出被禁止,當(dāng)沒有鍵被按下時(shí),XKI7~XKI0都被下拉為低電壓;當(dāng)有按鍵被按下時(shí),例如連接XKO3與XKI4的按鍵被按下,則當(dāng)XKO3輸出高電壓時(shí)XKI4檢測(cè)到高電壓。經(jīng)過抗干擾處理后,如果CH456確認(rèn)檢測(cè)到有效的按鍵,則記錄下該按鍵代碼,并通過INT#引腳(即XKO7)產(chǎn)生低電平有效的鍵盤中斷,此時(shí)龍芯2H可以通過I2C接口讀取按鍵代碼;在沒有檢測(cè)到新的有效按鍵之前,CH456不再產(chǎn)生任何鍵盤中斷。另外CH456不支持組合鍵,同一時(shí)刻不能有兩個(gè)或者更多的鍵被按下[4]。
1.2軟件平臺(tái)
本系統(tǒng)采用Linux 2.6.32內(nèi)核作為操作系統(tǒng)。Linux內(nèi)核提供了良好的驅(qū)動(dòng)框架,輸入子系統(tǒng)部分非常利于鍵盤、鼠標(biāo)等驅(qū)動(dòng)的開發(fā)。設(shè)備驅(qū)動(dòng)的意義是為上層應(yīng)用程序提供了訪問設(shè)備的方法,還屏蔽了硬件的具體細(xì)節(jié),便于軟件的開發(fā)與維護(hù)[5]。
鍵盤在系統(tǒng)中屬于輸入設(shè)備,Linux內(nèi)核的輸入子系統(tǒng),不僅支持鍵盤和鼠標(biāo)等常規(guī)輸入設(shè)備,而且還支持蜂鳴器、觸摸屏等設(shè)備,這些輸入設(shè)備都可以利用系統(tǒng)的接口函數(shù)來實(shí)現(xiàn)設(shè)備驅(qū)動(dòng)。輸入子系統(tǒng)由設(shè)備驅(qū)動(dòng)層、核心層和事件層3部分組成如圖3所示。
在Linux內(nèi)核中,使用輸入子系統(tǒng)實(shí)現(xiàn)輸入設(shè)備驅(qū)動(dòng)的時(shí)候,驅(qū)動(dòng)的工作目的是向系統(tǒng)報(bào)告按鍵等輸入事件,不需要關(guān)心文件系統(tǒng)的接口,因?yàn)長inux的輸入子系統(tǒng)已經(jīng)幫驅(qū)動(dòng)完成了文件操作[6]。在本系統(tǒng)中,設(shè)備驅(qū)動(dòng)層的工作就是當(dāng)矩陣鍵盤的按鍵被按下時(shí),芯片CH456產(chǎn)生一個(gè)中斷,內(nèi)核檢測(cè)到這個(gè)中斷并對(duì)其進(jìn)行處理,這也是本次需要設(shè)計(jì)的驅(qū)動(dòng)。核心層和事件層在Linux內(nèi)核中已經(jīng)幫我們實(shí)現(xiàn),只需要調(diào)用需要的函數(shù)即可。

圖3 輸入子系統(tǒng)結(jié)構(gòu)圖
CH456芯片通過兼容I2C的串行接口與龍芯2H進(jìn)行數(shù)據(jù)通信,當(dāng)有按鍵被按下時(shí),芯片提供低電平有效的中斷,Linux進(jìn)入中斷處理程序,再通過輸入子系統(tǒng)上報(bào)按鍵的信息。驅(qū)動(dòng)的流程圖如圖4所示。
3.1數(shù)據(jù)通信的實(shí)現(xiàn)
由于CH456芯片沒有使用標(biāo)準(zhǔn)的I2C接口,故不能使用I2C驅(qū)動(dòng)進(jìn)行通信,需要自己操作龍芯2H內(nèi)相關(guān)寄存器來進(jìn)行通信。通信參考I2C分為start、write、read和stop 4個(gè)函數(shù)。例如start函數(shù)實(shí)現(xiàn)如下:


由于CH456不是標(biāo)準(zhǔn)I2C設(shè)備,沒有固定的地址,所以需要每次通信的start部分都需要發(fā)送對(duì)應(yīng)的地址位。先向發(fā)送寄存器寫入地址,再向控制寄存器寫入產(chǎn)生Start信號(hào)與寫信號(hào)的命令。程序嘗試5次發(fā)送,如果沒有收到ACK則返回-1告知驅(qū)動(dòng)發(fā)生了通信錯(cuò)誤。
3.2鍵盤中斷的實(shí)現(xiàn)
CH456的INT#用于鍵盤中斷輸出,默認(rèn)是高電平。當(dāng)CH456檢測(cè)到有效按鍵時(shí),INT#輸出低電平有效的鍵盤中斷;龍芯2H收到中斷信號(hào)后,由Linux處理中斷進(jìn)入中斷處理程序?qū)H456執(zhí)行讀操作。當(dāng)CH456收到讀指令后,芯片會(huì)自動(dòng)將INT#恢復(fù)為高電平,并從SDA輸出按鍵代碼。龍芯2H從SDA獲得一個(gè)字節(jié)的數(shù)據(jù),其中低7位是按鍵代碼。
中斷處理函數(shù)的實(shí)現(xiàn)如下:

為了消除鍵盤抖動(dòng),在進(jìn)入中斷5毫秒后才開始讀取按鍵的值。首先判斷按鍵是否被按下,按鍵代碼的第6位為1時(shí)代表按鍵被按下,本系統(tǒng)的設(shè)計(jì)不考慮連續(xù)按住鍵盤不放的情況,所以不需要對(duì)按下的時(shí)間進(jìn)行監(jiān)測(cè),如果讀取到按下,先后通過輸入子系統(tǒng)上報(bào)按下與彈起的鍵值。
3.3鍵盤驅(qū)動(dòng)的初始化
在probe函數(shù)內(nèi)對(duì)鍵盤驅(qū)動(dòng)進(jìn)行初始化,首先檢查結(jié)構(gòu)體 platform_data各個(gè)參數(shù)是否存在,然后通過 input_ allocate_device()分配 input設(shè)備并設(shè)置事件類型為EV_KEY,另外設(shè)置好其他參數(shù)后用input_register_device()注冊(cè)輸入設(shè)備。
在注冊(cè)完設(shè)備后對(duì)中斷進(jìn)行初始化:
error=request_threaded_irq(client->irq,NULL,ch456_irq,IRQF_TRIGGER_LOW|IRQF_ONESHOT,client-> dev.driver->name,kpad);
在實(shí)現(xiàn)CH456的中斷之前,需要在龍芯2H中斷寄存器的初始化處手動(dòng)添加龍芯2H中斷的配置,包括配置GPIOOE輸入輸出配置寄存器將復(fù)用為中斷的GPIO位設(shè)成輸入,配置INTIEN中斷使能寄存器寄存器使能中斷,配置INTPOL中斷極性寄存器寄存器設(shè)置為電平觸發(fā),配置INTEDGE中斷模式寄存器設(shè)置為低電平觸發(fā)。
3.4鍵盤芯片的配置
CH456芯片可以用來控制數(shù)碼管顯示,當(dāng)做鍵盤芯片時(shí)也可以不使用中斷而使用查詢,所以在驅(qū)動(dòng)初始化之后,按鍵使用之前還需要對(duì)芯片進(jìn)行初始化配置:
ch456_write(CH456_SYSTEM,CH456_XINT_ON);
ch456_write(CH456_CONFIG,0x00);
首先配置system寄存器,設(shè)置參數(shù)為支持顯示驅(qū)動(dòng)、鍵盤驅(qū)動(dòng)和中斷(配置的數(shù)值為0x0B),再配置config寄存器,配置參數(shù)X15作為鍵盤中斷輸出引腳,禁止GPO引腳(配置的數(shù)值為0x00)。
3.5驅(qū)動(dòng)的加載與測(cè)試
在/drivers/input/keyboard/Kconfig內(nèi)添加:
config KEYBOARD_CH456
tristate"CH456 I2C 8*8 Keypad and IO Expander"
depends on I2C
在/drivers/input/keyboard/Makefile內(nèi)添加:
obj-$(CONFIG_KEYBOARD_CH456)+=ch456.o
編譯menuconfig,在Device Drivers-Input device support -Keyboards下選擇CH456驅(qū)動(dòng)如圖5所示。

圖5 驅(qū)動(dòng)編譯示意圖
然后編譯內(nèi)核,重啟加載鏡像。
經(jīng)過系統(tǒng)測(cè)試,在Linux的控制臺(tái)下手動(dòng)按鍵進(jìn)行測(cè)試,按下按鍵后即出現(xiàn)所按字母,未出現(xiàn)鍵盤雙擊或者未響應(yīng)等錯(cuò)誤狀態(tài),也沒有按鍵錯(cuò)誤的情況,多次測(cè)試后可以證明該驅(qū)動(dòng)穩(wěn)定可靠。
最終龍芯主板與鍵盤的連接如圖6所示。

圖6 主板照片
本文介紹了基于龍芯2H和CH456芯片的4乘4矩陣鍵盤Linux驅(qū)動(dòng)的實(shí)現(xiàn)方案。該驅(qū)動(dòng)以靜態(tài)編譯的方式加入內(nèi)核后,通過輸入測(cè)試證明了矩陣鍵盤驅(qū)動(dòng)工作穩(wěn)定、高效。在未來的項(xiàng)目中,這一驅(qū)動(dòng)設(shè)計(jì)方案也具有參考價(jià)值,只需要修改I2C通信接口和中斷引腳即可方便移植。
[1]董志國,李式巨.嵌入式 Linux設(shè)備驅(qū)動(dòng)程序開發(fā) [J].計(jì)算機(jī)工程與設(shè)計(jì),2006,27(20):3737-3740.
[2]龍芯中科技術(shù)有限公司.龍芯2H處理器用戶手冊(cè)[EB/OL].(2015)[2015-11-03].http://www.loongson.cn/uploadfile/cpumanual/Loongson2H_Processor_User_Manual.pdf.
[3]龍芯中科技術(shù)有限公司.龍芯2H處理器數(shù)據(jù)手冊(cè)[EB/OL].(2015)[2015-11-03].]http://www.loongson.cn/uploadfile/cpumanual/Loongson2H_processor_data_sheet.pdf.
[4]江蘇沁恒股份有限公司.16位數(shù)碼管驅(qū)動(dòng)及鍵盤控制芯CH456.[EB/OL].(2013)[2015-11-03].http://www.wch.cn/downfile/182
[5]李其珂,付紅橋.基于嵌入式Linux的矩陣鍵盤驅(qū)動(dòng)研究與實(shí)現(xiàn) [J].重慶理工大學(xué)學(xué)報(bào):自然科學(xué),2012,26(12): 88-92.
[6]楊斌斌,張雪英,王玉宏.基于嵌入式Linux的矩陣鍵盤驅(qū)動(dòng)程序研究與開發(fā)[J].現(xiàn)代電子技術(shù),2009(2):39-41.
【相關(guān)參考文獻(xiàn)鏈接】
童凱,張紅雨.基于Linux與Qt4的網(wǎng)絡(luò)數(shù)碼相框?qū)崿F(xiàn)[J]. 2014,22(2):130-133.
田苗,馮進(jìn)良,文琴,等.基于Linux系統(tǒng)的指紋識(shí)別門禁系統(tǒng)的研究[J].2014,22(2):134-136,139.
李梅.Linux實(shí)時(shí)性能優(yōu)化算法分析與研究[J].2014,22(5):56-58.
王明緒,靳果,桂博.基于ARM-LINUX的物流復(fù)檢系統(tǒng)設(shè)計(jì)[J].2014,22(6):162-164.
裴歐亞,康慕寧,張磊.基于SystemTap的Linux服務(wù)器性能分析系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].2014,22(10):28-31.
許文明.基于ARM-Linux嵌入式系統(tǒng)的多進(jìn)程并發(fā)服務(wù)器設(shè)計(jì)[J].2014,22(13):1-3.
張龍,殷亞玲.Linux內(nèi)存管理圖形化的研究與實(shí)現(xiàn)[J].2014,22(13):72-74.
王騰飛,馬志峰,王昊,等.基于ARM-Linux的數(shù)據(jù)采集和網(wǎng)絡(luò)傳輸系統(tǒng)設(shè)計(jì)[J].2014,22(16):21-24.
徐海寶,杜偉龍,曹江濤.基于ARM-Linux多功能機(jī)器人的設(shè)計(jì)[J].2014,22(17):19-21.
劉青,楊勇.基于嵌入式LINUX的智能車載終端系統(tǒng)的設(shè)計(jì)[J]. 2014,22(23):81-83.
楊鵬.基于Linux系統(tǒng)的FPGA芯片在線加載的設(shè)計(jì)和實(shí)現(xiàn)[J]. 2015,23(6):161-164.
蔣琳嬌,劉淼,金星.基于嵌入式Linux系統(tǒng)的Qt Quick應(yīng)用啟動(dòng)優(yōu)化[J].2015,23(7):151-154.
張蒙.基于LINUX的PBOC3.0關(guān)鍵讀卡技術(shù)的研究與應(yīng)用[J]. 2015,23(8):188-192.
Research and implementation ofmatrix keyboard driver of Linux on Loongson2H
LIZe-yin,GONG Jun,WU Chang-hao
(1.Department of Special Electronics Technology,No.58 Research Institute of China Ordnance Industries,Mianyang 621000,China)
For the Loongson2H board 4×4matrix keyboard extension requirements,analyzed the keyboard hardware and serial communication interface.Designed matrix keyboard input device driver based on Linux 2.6.32 input subsystem model and showed the driver implementation process.The test results showed that the driver meets the design requirements,stable,efficientand versatile.In the later project,the driver can be used directlywith littlemodification.
loongson2H;CH456;matrix keyboard;Linux driver
TN492
A
1674-6236(2016)19-0180-04
2015-10-28稿件編號(hào):201510203
李澤銀(1990—),男,四川綿陽人,助理工程師。研究方向:嵌入式編程。