?
一種新型液晶顯示系統(tǒng)的設計
0引言
隨著現(xiàn)代電子技術的不斷發(fā)展,嵌入式技術已經(jīng)廣泛地滲透到人們生活的各個方面,各種新型的嵌入式設備在應用數(shù)量和應用場合上已經(jīng)遠遠超過了通用計算機。在一些需要交互性和內(nèi)存空間的場合,傳統(tǒng)的基于微處理控制單元(MCU)+液晶顯示模塊的解決方案就不能很好地滿足要求。此外,ARM技術的發(fā)展已經(jīng)趨于成熟,內(nèi)部采用的Linux操作系統(tǒng)由于擁有性能優(yōu)良、源碼開放、內(nèi)核定制、運行速度快等優(yōu)點[1],逐漸在對傳統(tǒng)解決方案的更新?lián)Q代中突顯優(yōu)勢。
本文設計了一種新型的基于ARM+LCD顯示系統(tǒng)的解決方案,其中采用性價比較高的STN-LCD代替常見但較貴的TFT-LCD作為顯示模塊。系統(tǒng)中編寫的基于GPIO的液晶屏驅動程序的移植性很強,可將其移植到類似的液晶屏顯示系統(tǒng)中,并為一些對性價比要求較高的場合提供參考和實踐價值。
1硬件平臺搭建
系統(tǒng)以OMAP-L138中的ARM9為核心搭建硬件平臺,將采集到的數(shù)據(jù)通過內(nèi)嵌的TCP/IP通信鏈路傳送給基于STN-LCD的液晶屏,并實時顯示。此系統(tǒng)采用模塊化獨立設計,從功能上可以分成三個模塊:數(shù)據(jù)采集模塊、數(shù)據(jù)轉發(fā)模塊和數(shù)據(jù)顯示模塊。其系統(tǒng)結構框圖如圖1所示。
圖1 系統(tǒng)結構框圖
其中,數(shù)據(jù)采集模塊可以根據(jù)需要和實際情況進行設計(包括ARM端的程序實現(xiàn)和DSP端的程序實現(xiàn))。本實驗中,采用在ARM核運行的示例程序進行模擬實現(xiàn)。
1.1OMAP-L138介紹
核心處理模塊采用TI公司推出的雙核低功耗處理器OMAP-L138,其芯片內(nèi)部集成了300 MHz的ARM926EJ和300 MHz的TMS320C674X浮點DSP,片上資源也相當豐富,包括多種通信接口,芯片的集成度非常高[2]。本實驗主要介紹基于ARM核實現(xiàn)的顯示系統(tǒng),包括采集、轉發(fā)和顯示。此外,系統(tǒng)的數(shù)據(jù)采集模塊也可使用DSP實現(xiàn)。
1.2液晶屏顯示
液晶顯示器(liquid crystal display,LCD)是一種采用了液晶控制透光度技術來實現(xiàn)色彩的顯示器。LCD有很多類型,如TN、STN、TFT、OLED等[3]。TN、STN和TFT型顯示器因為液晶分子扭轉原理的不同,在彩化、動畫和視角上都有明顯的差異,使得這3類產(chǎn)品的應用范圍有所不同。其中,STN較于TN畫面切換速度快,較于TFT成本低,因此在信息控制設備中應用廣泛[4]?;谛阅芎统杀镜目紤],本實驗采用STN-LCD來進行設計。
2系統(tǒng)軟件設計
系統(tǒng)硬件平臺的搭建相對簡單,核心為軟件設計。系統(tǒng)的軟件設計主要分為最小自啟動系統(tǒng)設計、液晶屏驅動模塊及應用程序設計和內(nèi)部通信鏈路設計3個部分。首先,搭建一個自啟動的最小系統(tǒng),讓整個平臺能夠自動地運行;接著,編寫液晶屏的驅動程序,以及上層的液晶屏應用程序;最后,調(diào)用嵌入式系統(tǒng)內(nèi)部的TCP/IP協(xié)議,打通程序之間的通信鏈路。
2.1最小自啟動系統(tǒng)
一個典型的嵌入式Linux系統(tǒng)按照存儲空間的劃分通常包括引導區(qū)、內(nèi)核區(qū)和文件系統(tǒng)區(qū)。引導區(qū)存放引導加載程序Boot Loader與系統(tǒng)參數(shù);內(nèi)核區(qū)存放特定嵌入式平臺定制的Linux內(nèi)核;文件系統(tǒng)區(qū)存放根文件系統(tǒng),用戶應用程序就存放在文件系統(tǒng)區(qū)中。
在本實驗中,使用TI官方提供的通用的Boot Loader(U-BOOT)以及Linux3.3.0的內(nèi)核鏡像文件uImage,主要對根文件系統(tǒng)中的幾個文件進行修改。一方面,修改/etc/inittab文件。注釋語句S:2345:respawn:/sbin/getty 115200 ttyS2。增加語句:S:2345:respawn:/sbin/mingetty-autologin=root ttyS2,使之能自動進入擁有root權限的系統(tǒng)。另一方面,修改/etc/profile文件。首先在最后一行添加語句:insmod /home/root/lcd.ko,用來加載編譯的液晶顯示屏的驅動程序。然后添加語句:/home/root/thread_server&,用來運行上層的數(shù)據(jù)轉發(fā)程序。最后添加以下語句:/home/root/setup/lcddemo &,以啟動LCD屏的上層應用程序。自此,通過串口調(diào)試助手,即可在PC上看到系統(tǒng)啟動過程打印的信息,并正常地自動運行程序。
2.2液晶屏驅動模塊及應用程序
2.2.1XRD G160160D26
欣瑞達電子的XRD G160160D26,是一款在工業(yè)控制上普遍應用的液晶顯示模塊,使用UC1698作為液晶顯示控制器。液晶屏的外形尺寸為83.8 mm×78.5 mm×11.6 mm,點陣為160 mm×160 mm,其支持的工作溫度為-40~+80 ℃,引腳數(shù)為17個。引腳的分類主要包括以下三類:控制引腳、數(shù)據(jù)引腳和電源引腳。接口引腳定義如表1所示。
表1 接口引腳
2.2.2液晶屏驅動模塊
設備驅動程序是操作系統(tǒng)內(nèi)核和系統(tǒng)硬件的接口,是嵌入式系統(tǒng)不可或缺的組成部分。設備驅動程序為應用程序隱藏了硬件實現(xiàn)的細節(jié),使其可以像操作普通文件一樣操作外圍設備。設備驅動程序在內(nèi)核中的存在方式主要有兩種:一種是直接編譯到內(nèi)核中;另一種是游離于內(nèi)核而不占用系統(tǒng)資源,在需要時動態(tài)加載,不用時又可以卸載[5]。本實驗中選擇的是第二種,將驅動程序做成一個模塊,以增加程序的靈活性和可移植性。
在本實驗中,基于GPIO的字符設備的驅動模塊主要包括字符設備的驅動程序、對GPIO管腳的配置文件,以及對驅動模塊的編譯文件3個部分,分別集成在lcd.c、lcd.h和Makefile這3個文件中。
字符設備的驅動程序包括以下幾個部分:第一,字符設備驅動模塊的加載函數(shù)static int __init lcd_init(void),實現(xiàn)設備號的申請以及向內(nèi)核注冊驅動程序,當使用insmod加載模塊時被調(diào)用;第二,字符設備驅動模塊的卸載函數(shù)static int __exit lcd_exit(void),實現(xiàn)對設備號的釋放以及對驅動程序的注銷;第三,字符設備驅動模塊的file_operations結構體及其成員函數(shù)[6]。本實驗中定義的一個file_operations實例如下所示:
static struct file_operations lcd_fops={
.owner=THIS_MODULE,
.open=lcd_open,
.release=lcd_release,
.unlocked_ioctl=lcd_ioctl,
};
其中,在static long lcd_ioctl(struct file *file,unsigned int cmd,unsigned long arg)的I/O控制函數(shù)中,實現(xiàn)對GPIO的接口,將對LCD屏的調(diào)用解析成lcd_outcmd()和lcd_outdata()兩個函數(shù)。
對GPIO管腳的配置文件包括以下幾個部分:第一,設置復用管腳函數(shù)int pinmux_seup(unsigned char pinmux_num),使液晶顯示模塊的控制引腳和數(shù)據(jù)引腳處于GPIO的功能;第二,設置管腳數(shù)據(jù)流方向函數(shù)int gpio_setdir(unsigned char lcd_pin),使對應的引腳處于要求的輸入或者輸出狀態(tài);第三,輸出數(shù)據(jù)函數(shù)int lcd_outdata(unsigned char val),用來解析字符設備的驅動程序的lcd_ioctl函數(shù)中cmd=1時的情況;第四,輸出命令函數(shù)int lcd_outcmd(unsigned char val),用來解析字符設備的驅動程序的lcd_ioctl函數(shù)中cmd=0時的情況。
在Linux中,驅動程序的編譯和鏈接規(guī)則由Makefile指定,在基本的框架下改動一部分關鍵信息即可。程序如下所示:
ifneq($(KERNELRELEASE),)
obj-m := lcd.o
else
KDIR := /home/tronlong/linux-3.3.0
all:
make-C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux
clean:
rm -f *.ko *.o *.mod.o *.mod.c
endif
其中,lcd.o是實際設備驅動程序的模塊,KDIR表示內(nèi)核所在目錄,PWD為內(nèi)核的版本。最后將lcd.c、lcd.h和Makefile文件放于同一目錄下,執(zhí)行make指令就可以得到相應的lcd.ko文件,這個文件就是要用于目標板的液晶屏驅動模塊。
2.2.3液晶屏應用程序
液晶屏應用程序主要用來接收其他客戶端程序發(fā)送的數(shù)據(jù),然后將其按指定格式在液晶屏上顯示。其軟件流程圖如圖2所示。
圖2 液晶屏程序軟件流程圖
由圖2可知,應用程序在軟件代碼上面的實現(xiàn)主要由以下3個部分組成:第一,對LCD設備的操作,包括使用open(“/dev/lcd”,0)語句來打開LCD設備,其中/dev/lcd就是液晶屏驅動模塊的設備名,并使用init()函數(shù)來完成對LCD屏的復位、配置及使能;第二,遵循TCP/IP的套接字規(guī)范,進行基于客戶端的創(chuàng)建、設置及連接套接字操作,并向內(nèi)部的TCP Server注冊ID,便于區(qū)分不同的客戶端;第三,多線程部分操作,包括調(diào)用pthread_create()函數(shù)來創(chuàng)建子線程,并實現(xiàn)子線程的接收函數(shù)void *recv_msg(void *arg),在接收函數(shù)中實現(xiàn)對接收數(shù)據(jù)的判斷,并調(diào)用驅動模塊的ioctl函數(shù)實現(xiàn)正確的數(shù)據(jù)在LCD屏上的顯示。
2.3內(nèi)部通信鏈路
在Linux中,基于TCP/IP協(xié)議的應用程序通常都采用UNIX BSD的套接字(Socket),來實現(xiàn)進程之間的通信。Socket是Internet網(wǎng)絡編程中通用的API,最基本的Socket通信模型即客戶端-服務器(C-S)模型。通常,客戶端應用程序的數(shù)量比服務器應用程序要多,而服務器較于客戶端程序則要復雜得多,需要考慮并發(fā)、執(zhí)行效率、網(wǎng)絡狀況等。因此,一個網(wǎng)絡通信程序的關鍵在于服務器應用程序的開發(fā)[7]。
本實驗中,需要有兩個以上的程序作為客戶端與服務器程序通信。所以,服務器程序需要考慮并發(fā)性,使用多線程的技術來實現(xiàn)。在Linux中,就需要在程序的開頭增加以下語句:#include
通信的軟件框架如圖3所示。在圖3中,中間是TCP Server的軟件流程,用來將從左側lcdtest客戶端程序接收到的數(shù)據(jù)轉發(fā)給右側的lcddemo客戶端程序,以顯示在LCD屏上。在實際應用中,右側的lcddemo客戶端程序就接收其他客戶端發(fā)送過來的要顯示在LCD屏上的數(shù)據(jù)。其中,在TCP Server的Accept()階段,服務器程序一直在while(1)循環(huán)等待客戶端的連接,每連接一個客戶端,就為該客戶端分別建立一個接收線程,并將該客戶端的注冊ID保存到內(nèi)部數(shù)組中。最后,以TCP Server來示例涉及多線程通信程序的編譯:arm-arago-linux-gnueabi-gcc server.c -o server -lpthread,就可以生成server的可執(zhí)行文件。
圖3 多線程Socket通信流程圖
3系統(tǒng)驗證及測試
首先,將編譯好的液晶屏驅動模塊lcd.ko和應用程序(包括TCP Server程序thread_server、液晶屏應用程序lcddemo以及液晶屏測試程序lcdtest)載入OMAP-L138開發(fā)板,放于/home/root目錄下;其次,在當前目錄下執(zhí)行命令insmod lcd.ko,加載驅動模塊;接著,執(zhí)行命令./thread_server &,后臺運行TCP Server程序;然后,執(zhí)行命令./lcddemo &,后臺運行液晶屏應用程序;最后,執(zhí)行命令./lcdtest,運行液晶屏測試程序,即可在STN-LCD液晶屏上看到數(shù)據(jù)顯示。
4結束語
本文設計了一種基于OMAP-L138和STN-LCD的液晶顯示系統(tǒng),主要完成了STN-LCD的液晶驅動模塊、驅動程序以及內(nèi)部通信的鏈路。驅動模塊通過控制GPIO來實現(xiàn),內(nèi)部通信的鏈路使用基于Linux的多線程Socket來實現(xiàn),使得系統(tǒng)具有很強的可移植性及可操作性。本設計為數(shù)據(jù)顯示設備提供了一種新的方案,可應用于工控等領域。
參考文獻
[1] 盧洪濤.嵌入式Linux的ARM交叉編譯環(huán)境[J].科學信息:學術研究,2007(21):201-202.
[2] 李心陽,唐厚君.基于OMAPL138的電能質(zhì)量監(jiān)測系統(tǒng)的設計[J].微計算機信息,2011(6):78-80.
[3] 宋寶華.Linux設備驅動開發(fā)詳解[M].2版.北京:人民郵電出版社,2010:441.
[4] 胡俊波.基于Linux的液晶顯示屏驅動技術的研究與應用[D].北京:北方工業(yè)大學,2014.
[5] 杜世昌.基于嵌入式Linux的設備驅動程序設計的研究[D].北京:中國科學院大學,2013.
[6] 韋東山.嵌入式Linux應用開發(fā)完全手冊[M].北京:人民郵電出版社,2008:387.
[7] 王楓,羅家融.Linux下多線程Socket通訊的研究與應用[J].計算機工程與應用,2004(16):106-109.
Design of a New Type of LCD System
陳鋒葉一枝劉家樂
(上海電氣集團股份有限公司中央研究院,上海200070)
摘要:針對嵌入式顯示技術在低成本應用場合的需求,設計了一套新型的液晶顯示系統(tǒng)。以TIL138-EVM開發(fā)板為實驗平臺,采用較低成本的超扭曲向列型液晶顯示器(STN-LCD),并開發(fā)了其在ARM端的驅動程序;利用TCP/IP的數(shù)據(jù)傳輸協(xié)議,實現(xiàn)了通信數(shù)據(jù)在液晶屏上的顯示。實驗結果驗證了該系統(tǒng)應用于低成本場合的可行性,為嵌入式技術及顯示技術的應用提供了更多參考。
關鍵詞:嵌入式技術液晶顯示系統(tǒng)微處理單元數(shù)據(jù)采集數(shù)據(jù)傳輸通信協(xié)議軟硬件設計
Abstract:According to the demand for the embedded display technology in the low-cost applications,a new kind of LCD system is designed.With the TL138-EVM development board as the experiment platform,the lower cost super twisted nematic liquid crystal display(STN-LCD) is used,and the driver is developed in ARM.Based on TCP/IP data transmission protocol,displaying communication data on LCD panel is realized.The experiment results verify the feasibility of the application of system in low-cost occasion,and provide more references for the application of embedded technology and display technology.
Keywords:Embedded technologyLiquid crystal display systemMicro processing unitData acquisitionData transmissionCommunication protocolThe hardware and software design
中圖分類號:TP399;TH6
文獻標志碼:A
DOI:10.16086/j.cnki.issn1000-0380.201604022
修改稿收到日期:2015-07-07。
第一作者陳鋒(1988-),男,2014年畢業(yè)于上海大學電工理論及新技術專業(yè),獲碩士學位,助理工程師;主要從事嵌入式軟件及驅動的開發(fā)。