新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于ARM&Linux圖形用戶界面開發(fā)平臺(tái)的設(shè)計(jì)

基于ARM&Linux圖形用戶界面開發(fā)平臺(tái)的設(shè)計(jì)

作者: 時(shí)間:2012-04-20 來源:網(wǎng)絡(luò) 收藏

②LCD初始化Linux下驅(qū)動(dòng)程序的入口是module_init(),因此初始化通過調(diào)用module_init(13506fb_init)函數(shù)來實(shí)現(xiàn)。13506fb_init初始化的部分代碼主要完成以下工作:⑴對(duì)LCD的背光燈進(jìn)行點(diǎn)亮。LCD顯示是一種被動(dòng)顯示模式,它不能發(fā)光,只能依靠控制透射或反射周圍環(huán)境的光達(dá)到顯示目的,因此必須通過寫寄存器,實(shí)現(xiàn)背光燈的點(diǎn)亮。⑵本系統(tǒng)在13506。h頭文件里用了一個(gè)數(shù)組對(duì)寄存器的設(shè)置作了一個(gè)預(yù)定義,然后再初始化函數(shù)里利用兩個(gè)實(shí)際參數(shù)寫入,從而設(shè)定寄存器的值。寄存器設(shè)置的值為:static13506_REGSas1dregs[]={…{0x0032,0x27},{0x0038,0xEF},{0x0039,0x0}…}。其中數(shù)組里每個(gè)元素的第一個(gè)值代表寄存器的名稱,第二個(gè)值代表要設(shè)定的值。這里32h設(shè)置LCD顯示的水平象素值320;38h,39h分別設(shè)置成0xEF和0x0,即設(shè)置垂直象素值240。除了這三個(gè)寄存器外,34h和3Ah這兩個(gè)寄存器也會(huì)對(duì)分辨率有影響。

③LCD驅(qū)動(dòng)“文件層-驅(qū)動(dòng)層”函數(shù)的實(shí)現(xiàn)幀緩沖設(shè)備屬于字符設(shè)備,要實(shí)現(xiàn)“文件層-驅(qū)動(dòng)層”接口的方式來對(duì)LCD進(jìn)行驅(qū)動(dòng)就必須對(duì)file_operation數(shù)據(jù)結(jié)構(gòu)fb_ops進(jìn)行填充,并實(shí)現(xiàn)其對(duì)應(yīng)的成員函數(shù)。本系統(tǒng)移植的Linux下include/linux/fb。h中定義了幀緩沖區(qū)的文件操作結(jié)構(gòu)體structfb_ops。該結(jié)構(gòu)中的每一個(gè)字段都必須指向驅(qū)動(dòng)程序中實(shí)現(xiàn)特定操作的函數(shù),對(duì)于不支持的操作字段可以置為NULL,或留到后續(xù)開發(fā)時(shí)添加。針對(duì)本系統(tǒng)的LCD,需要特定的操作成員函數(shù)如下:staticstructfb_ops13506fb_ops={owner:THIS_MODULE,fb_open:13506fb_open,fb_get_fix:13506fb_get_fix,fb_get_var:13506fb_get_var,fb_set_var:13506fb_set_var,fb_get_cmap:13506fb_get_cmap,fb_set_cmap:13506fb_set_cmap,fb_mmap:13506_mmap,};至此,LCD的驅(qū)動(dòng)程序框架已完成,所剩工作就是把一些調(diào)用的函數(shù)寫完整,編寫好驅(qū)動(dòng)程序后用arm-linux-gcc交叉編譯工具編譯驅(qū)動(dòng)模塊,之后動(dòng)態(tài)加載或靜態(tài)編譯進(jìn)內(nèi)核。

3。2。2USB驅(qū)動(dòng)程序開發(fā)通用串行總線(USB)是一種外部總線結(jié)構(gòu),特點(diǎn)是接口統(tǒng)一、易于使用、方便擴(kuò)展、支持熱插拔(hotplug)和PNP(Plug-and-Play),簡化了計(jì)算機(jī)與不同類型外設(shè)間的連接,一經(jīng)推出就得到計(jì)算機(jī)外設(shè)硬件制造商的廣泛采用。Linux作為一個(gè)占有相當(dāng)市場(chǎng)份額的開源操作系統(tǒng),自2。2。18版本內(nèi)核以來,就加入了對(duì)USB的支持。

USB是一種分層總線結(jié)構(gòu),USB設(shè)備和主機(jī)之間的信息傳輸通過USB控制器實(shí)現(xiàn)。USB控制器的驅(qū)動(dòng)分為三層,由底至上為:USB主控制器驅(qū)動(dòng)、USB驅(qū)動(dòng)和USB設(shè)備類驅(qū)動(dòng)。

處于最底層USB主機(jī)控制器驅(qū)動(dòng)(HCD)是USB主機(jī)直接與硬件交互的軟件模塊。Linux-2。4內(nèi)核中的USB支持2種主控制器接口:通用主控制器接口(UHCI)和開放控制器接口(OHCI)。主控制器驅(qū)動(dòng)為上層提供統(tǒng)一的接口,屏蔽掉硬件的具體細(xì)節(jié)。具體實(shí)現(xiàn)的功能有:主控制器硬件初始化;為USBD層提供相應(yīng)的接口函數(shù);提供集線器設(shè)備配置、控制功能;完成4種數(shù)據(jù)傳輸類型。USB驅(qū)動(dòng)(USBD)部分是整個(gè)USB主機(jī)驅(qū)動(dòng)的核心,主要負(fù)責(zé)USB總線的管理、USB總線設(shè)備、USB總線帶寬管理、為USB設(shè)備驅(qū)動(dòng)提供相關(guān)的接口、提供應(yīng)用程序訪問的USB系統(tǒng)的文件接口。

USB設(shè)備類驅(qū)動(dòng)是最終與應(yīng)用程序交互的軟件模塊,主要為訪問特定的USB設(shè)備和應(yīng)用程序提供接口。Linux內(nèi)核支持的USB設(shè)備類有:USB打印機(jī)設(shè)備類、通信設(shè)備類、存儲(chǔ)設(shè)備類、語音設(shè)備類等。由于AT91RM9200的USBHOST控制器符合OHCI標(biāo)準(zhǔn),而系統(tǒng)所選擇的Linux內(nèi)核又對(duì)OHCI規(guī)范提供了模塊支持,因此使得開發(fā)工作相對(duì)簡單。開發(fā)目標(biāo)板所需的USB驅(qū)動(dòng)程序時(shí),只需對(duì)原Linux內(nèi)核驅(qū)動(dòng)針對(duì)目標(biāo)板稍做修改即可。具體修改部分如下:①調(diào)整初始化地址。在/usb/usb-ochi。c中,使用板載起始地址(0x40700000)來初始化;②刪除PCI接口的處理代碼。在目標(biāo)板ARM221平臺(tái)上,USB主機(jī)控制器不包含PCI接口,故把/usb/usb-ochi。c中與PCI有關(guān)的代碼刪除;③修改HUB下端口數(shù)目。目標(biāo)板ARM221設(shè)有兩個(gè)USBHUB端口,用于鍵盤和鼠標(biāo)接口。故在/usb/usb-ochi。c中把HUB的下行端口數(shù)目從默認(rèn)值改為2。代碼修改之后,重新編譯、加載到內(nèi)核。

4MiniGUI在ARM221目標(biāo)板上的移植4。1MiniGUI的體系結(jié)構(gòu)MiniGUI是一種針對(duì)嵌入式設(shè)備的、跨操作系統(tǒng)的、輕量級(jí)的支持系統(tǒng)。從整體結(jié)構(gòu)上看,MiniGUI是分層的。在最底層,抽象層(GAL:GraphicAbstractLayer)和輸入抽象層(IAL:InputAbstractLayer)提供底層設(shè)備接口GDI(GDI:GraphicDeviceInterface)及輸入設(shè)備驅(qū)動(dòng),Pthread(POSIX標(biāo)準(zhǔn)線程)用于提供內(nèi)核級(jí)線程支持的C函數(shù)庫;中間層是MiniGUI的核心層,包括窗口系統(tǒng)必不可少的各個(gè)模塊;最頂層是應(yīng)用編程接口(API:ApplicationProgramingInterface)。MiniGUI的這種分層體系結(jié)構(gòu),大大方便了其在目標(biāo)系統(tǒng)上的移植。

4。2MiniGUI的移植移植MiniGUI主要是根據(jù)具體的硬件平臺(tái)定制或移植GAL引擎和IAL引擎,主要包括以下三個(gè)方面的工作。①GAL引擎的移植。MiniGUI可支持多種GAL引擎,包括對(duì)Framebuffer引擎的支持。因此,對(duì)于目標(biāo)板ARM221來說,顯示設(shè)備為LCD,相應(yīng)的驅(qū)動(dòng)程序已開發(fā)完成,這里只需要在配置文件MiniGUI。cfg中修改gal_engine=fbcon即可。②IAL引擎的移植。MiniGUI可支持多種IAL引擎,包括USB鼠標(biāo)、鍵盤引及部分觸摸屏引擎。

對(duì)于目標(biāo)板ARM221來說,其軟硬件方面都已支持USB鼠標(biāo)、鍵盤,故這里只需在配置文件MiniGUI。cfg中修改ial_engine=console、mdev=/dev/PS2即可。③交叉編譯MiniGUI的庫文件、資源文件、應(yīng)用程序,并制作根文件系統(tǒng)下載到目標(biāo)板系統(tǒng)上運(yùn)行。移植完成后,板載MiniGUI的運(yùn)行情況如圖3。

5總結(jié)本文介紹了一種ARMLinux的圖形平臺(tái)的過程。實(shí)驗(yàn)表明,該平臺(tái)運(yùn)行穩(wěn)定可靠,在應(yīng)用系統(tǒng)中只需根據(jù)實(shí)際需求做上層應(yīng)用軟件實(shí)現(xiàn)即可。

本文作者創(chuàng)新點(diǎn):從整體角度,對(duì)嵌入式GUI進(jìn)行分析研究,選用了性能可靠的ARM、開放源代碼的Linux及輕型嵌入式GUI支持庫MiniGUI,完成了系統(tǒng)的軟硬件。

linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)


評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉