李澤銀,龔 俊,吳昌昊
(中國兵器工業(yè)第五八研究所 特種電子技術(shù)部,四川 綿陽621000)
基于龍芯2H的Linux矩陣鍵盤驅(qū)動的研究與實現(xiàn)
李澤銀,龔 俊,吳昌昊
(中國兵器工業(yè)第五八研究所 特種電子技術(shù)部,四川 綿陽621000)
針對某龍芯2H主板擴展的4乘4矩陣鍵盤的需求,分析了鍵盤硬件電路及串行通信接口。在Linux 2.6.32的輸入子系統(tǒng)模型的基礎(chǔ)之上,設(shè)計了矩陣鍵盤輸入設(shè)備的驅(qū)動程序并給出了驅(qū)動程序?qū)崿F(xiàn)的過程。測試結(jié)果證明,該驅(qū)動滿足了設(shè)計的需求,工作穩(wěn)定、高效,并且通用性較強,在以后的項目中只需更改少量接口就可以使用。
龍芯2H;CH456;矩陣鍵盤;Linux驅(qū)動
鍵盤在個人電腦中是標準配置,在嵌入式系統(tǒng)中也是非常重要的配置,是嵌入式系統(tǒng)最重要的人機交互手段之一。嵌入式系統(tǒng)普遍是針對特定的應(yīng)用而設(shè)計的,不同的應(yīng)用對輸入設(shè)備的要求也各不相同,因此需要根據(jù)具體應(yīng)用在系統(tǒng)中配置自己的鍵盤。Linux可應(yīng)用于各種硬件平臺、內(nèi)核穩(wěn)定高效、源代碼開放和網(wǎng)絡(luò)通信驅(qū)動齊全等優(yōu)良特性,成為嵌入式系統(tǒng)領(lǐng)域中的一個研究熱點[1]。在此提出以Linux操作系統(tǒng)和龍芯2H處理器為軟硬件平臺的矩陣鍵盤驅(qū)動程序的設(shè)計方案。
1.1硬件平臺
本系統(tǒng)采用的主處理器為龍芯2H,龍芯2H是龍芯2G處理器與龍芯1A(2F南橋)的后繼產(chǎn)品,其目標是為安全適用計算機提供單片解決方案。龍芯2H采用65 nm工藝實現(xiàn),主頻達1 GHz。片內(nèi)集成定點處理器、浮點處理器、流媒體處理和圖形圖像處理功能,以及南橋、北橋等配套芯片組功能。龍芯2H內(nèi)部采用多級總線,低速外設(shè)(I2C、UART等)作為一個集合加在南橋總線上[2-3]。
本系統(tǒng)采用了擴展一片沁恒公司的CH456芯片來實現(xiàn)鍵盤的功能,其中芯片連接示意圖如圖1所示。
該芯片可以進行64鍵的掃描,通過兼容I2C線路2線串行接口和龍芯 2H進行數(shù)據(jù)交換。INT#連接到龍芯2H的 GPIO13,SCL和SDA連接到龍芯2H的IIC1_SCL和IIC1_SDA。
圖1 CH456連接示意圖
芯片最大支持8×8鍵盤,本項目使用的是4×4鍵盤是可以兼容的。將矩陣鍵盤的4跟行線連接到XKI0-3,4跟列線連接到XKO0-3。插座示意圖如圖2所示。
圖2 鍵盤插座連接示意圖
1.1.1龍芯2H的I2C接口
龍芯2H集成了兩個I2C控制器,在Linux下通過內(nèi)存映射直接訪問芯片的寄存器。I2C-1模塊寄存器物理地址基址為:0x1fe91000,地址空間16 kB。在鍵盤驅(qū)動中需要對龍芯I2C-1的發(fā)送數(shù)據(jù)寄存器(TXR)、接受數(shù)據(jù)寄存器(RXR)、命令控制寄存器(CR)和狀態(tài)寄存器(SR)4個寄存器進行讀寫操作。
1.1.2鍵盤工作原理
CH456芯片會定期對鍵盤進行掃描,在鍵盤掃描期間,XKO7~XKO0引腳按照XKO0至XKO7的順序依次輸出高電壓,其余引腳輸出低電壓;KI7~KI0引腳的輸出被禁止,當(dāng)沒有鍵被按下時,XKI7~XKI0都被下拉為低電壓;當(dāng)有按鍵被按下時,例如連接XKO3與XKI4的按鍵被按下,則當(dāng)XKO3輸出高電壓時XKI4檢測到高電壓。經(jīng)過抗干擾處理后,如果CH456確認檢測到有效的按鍵,則記錄下該按鍵代碼,并通過INT#引腳(即XKO7)產(chǎn)生低電平有效的鍵盤中斷,此時龍芯2H可以通過I2C接口讀取按鍵代碼;在沒有檢測到新的有效按鍵之前,CH456不再產(chǎn)生任何鍵盤中斷。另外CH456不支持組合鍵,同一時刻不能有兩個或者更多的鍵被按下[4]。
1.2軟件平臺
本系統(tǒng)采用Linux 2.6.32內(nèi)核作為操作系統(tǒng)。Linux內(nèi)核提供了良好的驅(qū)動框架,輸入子系統(tǒng)部分非常利于鍵盤、鼠標等驅(qū)動的開發(fā)。設(shè)備驅(qū)動的意義是為上層應(yīng)用程序提供了訪問設(shè)備的方法,還屏蔽了硬件的具體細節(jié),便于軟件的開發(fā)與維護[5]。
鍵盤在系統(tǒng)中屬于輸入設(shè)備,Linux內(nèi)核的輸入子系統(tǒng),不僅支持鍵盤和鼠標等常規(guī)輸入設(shè)備,而且還支持蜂鳴器、觸摸屏等設(shè)備,這些輸入設(shè)備都可以利用系統(tǒng)的接口函數(shù)來實現(xiàn)設(shè)備驅(qū)動。輸入子系統(tǒng)由設(shè)備驅(qū)動層、核心層和事件層3部分組成如圖3所示。
在Linux內(nèi)核中,使用輸入子系統(tǒng)實現(xiàn)輸入設(shè)備驅(qū)動的時候,驅(qū)動的工作目的是向系統(tǒng)報告按鍵等輸入事件,不需要關(guān)心文件系統(tǒng)的接口,因為Linux的輸入子系統(tǒng)已經(jīng)幫驅(qū)動完成了文件操作[6]。在本系統(tǒng)中,設(shè)備驅(qū)動層的工作就是當(dāng)矩陣鍵盤的按鍵被按下時,芯片CH456產(chǎn)生一個中斷,內(nèi)核檢測到這個中斷并對其進行處理,這也是本次需要設(shè)計的驅(qū)動。核心層和事件層在Linux內(nèi)核中已經(jīng)幫我們實現(xiàn),只需要調(diào)用需要的函數(shù)即可。
圖3 輸入子系統(tǒng)結(jié)構(gòu)圖
CH456芯片通過兼容I2C的串行接口與龍芯2H進行數(shù)據(jù)通信,當(dāng)有按鍵被按下時,芯片提供低電平有效的中斷,Linux進入中斷處理程序,再通過輸入子系統(tǒng)上報按鍵的信息。驅(qū)動的流程圖如圖4所示。
3.1數(shù)據(jù)通信的實現(xiàn)
由于CH456芯片沒有使用標準的I2C接口,故不能使用I2C驅(qū)動進行通信,需要自己操作龍芯2H內(nèi)相關(guān)寄存器來進行通信。通信參考I2C分為start、write、read和stop 4個函數(shù)。例如start函數(shù)實現(xiàn)如下:
由于CH456不是標準I2C設(shè)備,沒有固定的地址,所以需要每次通信的start部分都需要發(fā)送對應(yīng)的地址位。先向發(fā)送寄存器寫入地址,再向控制寄存器寫入產(chǎn)生Start信號與寫信號的命令。程序嘗試5次發(fā)送,如果沒有收到ACK則返回-1告知驅(qū)動發(fā)生了通信錯誤。
3.2鍵盤中斷的實現(xiàn)
CH456的INT#用于鍵盤中斷輸出,默認是高電平。當(dāng)CH456檢測到有效按鍵時,INT#輸出低電平有效的鍵盤中斷;龍芯2H收到中斷信號后,由Linux處理中斷進入中斷處理程序?qū)H456執(zhí)行讀操作。當(dāng)CH456收到讀指令后,芯片會自動將INT#恢復(fù)為高電平,并從SDA輸出按鍵代碼。龍芯2H從SDA獲得一個字節(jié)的數(shù)據(jù),其中低7位是按鍵代碼。
中斷處理函數(shù)的實現(xiàn)如下:
為了消除鍵盤抖動,在進入中斷5毫秒后才開始讀取按鍵的值。首先判斷按鍵是否被按下,按鍵代碼的第6位為1時代表按鍵被按下,本系統(tǒng)的設(shè)計不考慮連續(xù)按住鍵盤不放的情況,所以不需要對按下的時間進行監(jiān)測,如果讀取到按下,先后通過輸入子系統(tǒng)上報按下與彈起的鍵值。
3.3鍵盤驅(qū)動的初始化
在probe函數(shù)內(nèi)對鍵盤驅(qū)動進行初始化,首先檢查結(jié)構(gòu)體 platform_data各個參數(shù)是否存在,然后通過 input_ allocate_device()分配 input設(shè)備并設(shè)置事件類型為EV_KEY,另外設(shè)置好其他參數(shù)后用input_register_device()注冊輸入設(shè)備。
在注冊完設(shè)備后對中斷進行初始化:
error=request_threaded_irq(client->irq,NULL,ch456_irq,IRQF_TRIGGER_LOW|IRQF_ONESHOT,client-> dev.driver->name,kpad);
在實現(xiàn)CH456的中斷之前,需要在龍芯2H中斷寄存器的初始化處手動添加龍芯2H中斷的配置,包括配置GPIOOE輸入輸出配置寄存器將復(fù)用為中斷的GPIO位設(shè)成輸入,配置INTIEN中斷使能寄存器寄存器使能中斷,配置INTPOL中斷極性寄存器寄存器設(shè)置為電平觸發(fā),配置INTEDGE中斷模式寄存器設(shè)置為低電平觸發(fā)。
3.4鍵盤芯片的配置
CH456芯片可以用來控制數(shù)碼管顯示,當(dāng)做鍵盤芯片時也可以不使用中斷而使用查詢,所以在驅(qū)動初始化之后,按鍵使用之前還需要對芯片進行初始化配置:
ch456_write(CH456_SYSTEM,CH456_XINT_ON);
ch456_write(CH456_CONFIG,0x00);
首先配置system寄存器,設(shè)置參數(shù)為支持顯示驅(qū)動、鍵盤驅(qū)動和中斷(配置的數(shù)值為0x0B),再配置config寄存器,配置參數(shù)X15作為鍵盤中斷輸出引腳,禁止GPO引腳(配置的數(shù)值為0x00)。
3.5驅(qū)動的加載與測試
在/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ū)動如圖5所示。
圖5 驅(qū)動編譯示意圖
然后編譯內(nèi)核,重啟加載鏡像。
經(jīng)過系統(tǒng)測試,在Linux的控制臺下手動按鍵進行測試,按下按鍵后即出現(xiàn)所按字母,未出現(xiàn)鍵盤雙擊或者未響應(yīng)等錯誤狀態(tài),也沒有按鍵錯誤的情況,多次測試后可以證明該驅(qū)動穩(wěn)定可靠。
最終龍芯主板與鍵盤的連接如圖6所示。
圖6 主板照片
本文介紹了基于龍芯2H和CH456芯片的4乘4矩陣鍵盤Linux驅(qū)動的實現(xiàn)方案。該驅(qū)動以靜態(tài)編譯的方式加入內(nèi)核后,通過輸入測試證明了矩陣鍵盤驅(qū)動工作穩(wěn)定、高效。在未來的項目中,這一驅(qū)動設(shè)計方案也具有參考價值,只需要修改I2C通信接口和中斷引腳即可方便移植。
[1]董志國,李式巨.嵌入式 Linux設(shè)備驅(qū)動程序開發(fā) [J].計算機工程與設(shè)計,2006,27(20):3737-3740.
[2]龍芯中科技術(shù)有限公司.龍芯2H處理器用戶手冊[EB/OL].(2015)[2015-11-03].http://www.loongson.cn/uploadfile/cpumanual/Loongson2H_Processor_User_Manual.pdf.
[3]龍芯中科技術(shù)有限公司.龍芯2H處理器數(shù)據(jù)手冊[EB/OL].(2015)[2015-11-03].]http://www.loongson.cn/uploadfile/cpumanual/Loongson2H_processor_data_sheet.pdf.
[4]江蘇沁恒股份有限公司.16位數(shù)碼管驅(qū)動及鍵盤控制芯CH456.[EB/OL].(2013)[2015-11-03].http://www.wch.cn/downfile/182
[5]李其珂,付紅橋.基于嵌入式Linux的矩陣鍵盤驅(qū)動研究與實現(xiàn) [J].重慶理工大學(xué)學(xué)報:自然科學(xué),2012,26(12): 88-92.
[6]楊斌斌,張雪英,王玉宏.基于嵌入式Linux的矩陣鍵盤驅(qū)動程序研究與開發(fā)[J].現(xiàn)代電子技術(shù),2009(2):39-41.
【相關(guān)參考文獻鏈接】
童凱,張紅雨.基于Linux與Qt4的網(wǎng)絡(luò)數(shù)碼相框?qū)崿F(xiàn)[J]. 2014,22(2):130-133.
田苗,馮進良,文琴,等.基于Linux系統(tǒng)的指紋識別門禁系統(tǒng)的研究[J].2014,22(2):134-136,139.
李梅.Linux實時性能優(yōu)化算法分析與研究[J].2014,22(5):56-58.
王明緒,靳果,桂博.基于ARM-LINUX的物流復(fù)檢系統(tǒng)設(shè)計[J].2014,22(6):162-164.
裴歐亞,康慕寧,張磊.基于SystemTap的Linux服務(wù)器性能分析系統(tǒng)的設(shè)計與實現(xiàn)[J].2014,22(10):28-31.
許文明.基于ARM-Linux嵌入式系統(tǒng)的多進程并發(fā)服務(wù)器設(shè)計[J].2014,22(13):1-3.
張龍,殷亞玲.Linux內(nèi)存管理圖形化的研究與實現(xiàn)[J].2014,22(13):72-74.
王騰飛,馬志峰,王昊,等.基于ARM-Linux的數(shù)據(jù)采集和網(wǎng)絡(luò)傳輸系統(tǒng)設(shè)計[J].2014,22(16):21-24.
徐海寶,杜偉龍,曹江濤.基于ARM-Linux多功能機器人的設(shè)計[J].2014,22(17):19-21.
劉青,楊勇.基于嵌入式LINUX的智能車載終端系統(tǒng)的設(shè)計[J]. 2014,22(23):81-83.
楊鵬.基于Linux系統(tǒng)的FPGA芯片在線加載的設(shè)計和實現(xiàn)[J]. 2015,23(6):161-164.
蔣琳嬌,劉淼,金星.基于嵌入式Linux系統(tǒng)的Qt Quick應(yī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稿件編號:201510203
李澤銀(1990—),男,四川綿陽人,助理工程師。研究方向:嵌入式編程。