王亞剛, 馬 超, 焦繼業(yè)
(西安郵電大學(xué) 計算機(jī)學(xué)院, 陜西 西安 710121)
基于異構(gòu)多核SoC的圖形用戶界面的構(gòu)建方法
王亞剛, 馬 超, 焦繼業(yè)
(西安郵電大學(xué) 計算機(jī)學(xué)院, 陜西 西安 710121)
針對異構(gòu)多核片上系統(tǒng)的FPGA原型沒有可供交互的圖形用戶界面問題,提出一種圖形用戶界面的構(gòu)建方法。該方法根據(jù)系統(tǒng)中顯示控制器的工作原理和硬件特點(diǎn),開發(fā)Linux操作系統(tǒng)內(nèi)核層的Framebuffer驅(qū)動程序,借助MiniGUI的fbcon圖形引擎進(jìn)行MiniGUI移植,從而為系統(tǒng)構(gòu)建了圖形用戶界面。測試結(jié)果表明,所構(gòu)建的圖形用戶界面能夠?yàn)橄到y(tǒng)提供良好的人機(jī)交互接口。
片上系統(tǒng);Linux;幀緩沖;MiniGUI;圖形用戶界面
圖形用戶界面(Graphical User Interface,GUI)作為嵌入式系統(tǒng)的人機(jī)交互接口,是嵌入式系統(tǒng)設(shè)計和開發(fā)的重要內(nèi)容。常見的幾種主流的嵌入式GUI有WinCE, OpenGUI, Qt/Embedded, MiniGUI等[1]。針對較為普遍的開發(fā)板和特定的操作系統(tǒng)(如S3C44B0和uClinux)構(gòu)建圖形用戶界面的技術(shù)已經(jīng)十分成熟[2-3],有的開發(fā)板甚至已經(jīng)自帶了GUI系統(tǒng)。而對于一個新設(shè)計開發(fā)的硬件平臺,構(gòu)建圖形用戶界面不僅需要從應(yīng)用層解決移植問題,還必須從操作系統(tǒng)驅(qū)動層為移植提供底層支持。
針對異構(gòu)多核現(xiàn)場可編程門陣列(Field Programmable Gate Array, FPGA)硬件原型片上系統(tǒng)(System on Chip, SoC)沒有圖形用戶界面來進(jìn)行系統(tǒng)測試和效果展示的問題,本文擬從系統(tǒng)底層驅(qū)動到應(yīng)用層,通過Linux幀緩沖驅(qū)動和移植MiniGUI視窗系統(tǒng),構(gòu)建圖形用戶界面。
異構(gòu)多核SoC圖形處理器采用CPU+GPU(Graphics Processing Unit)架構(gòu),其中CPU采用支持SPARC V8的LEON3處理器[4],GPU支持OpenGL 1.3(Open Graphics Library 1.3)標(biāo)準(zhǔn),可編程處理器包含9級圖形流水渲染管線,采用自定制的32位精簡指令集(Reduced Instruction Set Computer,RISC)[5]。在圖形應(yīng)用程序的處理過程中,GPU負(fù)責(zé)3D圖形加速,CPU處理一些簡單的2D圖形計算,高級視頻圖形陣列(Super Video Graphics Array,SVGA)顯示控制器負(fù)責(zé)顯示Framebuffer中的像素。
SoC圖形用戶界面的軟硬件總體關(guān)系如圖1所示。基于異構(gòu)多核SoC圖形處理器的FPGA原型和移植的Linux操作系統(tǒng),開發(fā)了針對于此SoC的顯示控制器GRLIB SVGA的內(nèi)核Framebuffer驅(qū)動,借助于MiniGUI的fbcon圖形引擎將MiniGUI移植到此硬件平臺。
圖1 異構(gòu)多核SoC GUI構(gòu)建關(guān)系
幀緩沖驅(qū)動是Linux內(nèi)核為用戶程序提供的操作顯示設(shè)備和管理顯示內(nèi)存的統(tǒng)一接口,它為用戶程序屏蔽了不同顯示硬件的差異[6]。實(shí)現(xiàn)此平臺的GRLIB SVGA顯示控制器的Framebuffer驅(qū)動,有兩個關(guān)鍵步驟:SVGA顯控寄存器的I/O內(nèi)存映射及配置和顯存的分配。
2.1 SVGA寄存器I/O映射
在使用內(nèi)存管理單元(Memory Management Unit,MMU)的情況下,CPU只能處理虛擬地址,所以在驅(qū)動中首先要將硬件寄存器的物理地址映射到內(nèi)核虛擬地址空間[7]。
SVGA顯控作為一個高級外部設(shè)備總線(Advanced Peripheral Bus,APB)從設(shè)備掛接到系統(tǒng)的APB總線上。APB總線支持Plug&Play功能,所有的已掛接的APB從設(shè)備的Plug&Play配置信息保存在一塊只讀的總線地址空間0xFF000~0xFFFFF,大小為4 KB,每個APB從設(shè)備的配置記錄占2個字長[8],圖2是APB總線Plug&Play(PnP)配置字格式。在Framebuffer驅(qū)動中通過調(diào)用內(nèi)核高級微控制器總線體系(Advanced Microcontroller Bus Architecture,AMBA)PnP驅(qū)動提供的接口amba_get_free_apbslv_devices將配置信息解析保存到描述APB從設(shè)備的結(jié)構(gòu)。其結(jié)構(gòu)體代碼如下。
typedef struct amba_apb_device {
unsigned int start, irq, bus_id;
amba_confarea_type *bus;
} amba_apb_device;
其中第一個字段start保存的是從SVGA配置字解析的控制寄存器的起始物理地址。
圖2 APB PnP配置字格式
通過內(nèi)核函數(shù)ioremap[9]將寄存器映射,得到配置字和映射的代碼如下。
unsigned int REG_BASE;
amba_apb_device devi[1];
amba_get_free_apbslv_devices(
VENDOR_GAISLER,GAISLER_SVGA,devi,1);
REG_BASE = (unsigned int)devi[0].start;
par->regs=(LEON3_GRVGA_Regs_Map*)
ioremap(REG_BASE,sizeof(LEON3_GRVGA_Regs_Map));
結(jié)構(gòu)體LEON3_GRVGA_Regs_Map包括了SVGA顯控的總共11個寄存器[10],它們分別用來設(shè)置顯控的狀態(tài)、水平垂直分辨率、上下左右掃描空白時間、水平垂直同步時間、Framebuffer內(nèi)存起始物理地址、4個時鐘向量、顏色查找表地址(使用偽彩色)。
寄存器映射完成后,把結(jié)構(gòu)fb_var_screeninfo的對應(yīng)的時序參數(shù)寫到寄存器的虛擬地址,xres和yres分別是顯示的水平垂直分辨率,其它參數(shù)在屏幕上是不可見的[11]。
2.2 顯存的申請分配
顯控的寄存器映射并初始化后,驅(qū)動要完成的另一個關(guān)鍵步驟就是為系統(tǒng)申請顯示內(nèi)存,也就是幀緩沖所指的系統(tǒng)內(nèi)存緩沖區(qū)。為了使驅(qū)動有更大的靈活性,SVGA Framebuffer驅(qū)動支持兩種申請顯存的方式:一種是通過內(nèi)核命令行參數(shù)指定一個專門的Framebuffer起始地址;另一種是驅(qū)動模塊加載時由內(nèi)核動態(tài)向系統(tǒng)申請一塊幀緩沖區(qū),并將這塊內(nèi)存的物理地址寫入顯控的Framebuffer位置寄存器。幀緩沖區(qū)大小是由命令行參數(shù)或驅(qū)動所選擇的默認(rèn)水平垂直分辨率和位深的乘積決定的。
在內(nèi)核命令行參數(shù)不指定使用自定義幀緩沖起始地址的情況下,驅(qū)動默認(rèn)使用第二種方法申請顯存。申請顯存并將所申請的物理地址保存的代碼如下。
virtual_start=(unsigned long)__ get_free_pages(GFP_ATOMIC|GFP_DMA,get_order(mem_size));
physical_start=__ pa(virtual_start);
par->regs->fb_pos=physical_start;
完成操作系統(tǒng)內(nèi)核層的Framebuffer驅(qū)動后,構(gòu)建圖形用戶界面的最后一步工作就是移植MiniGUI。移植的主要工作是分析MiniGUI的軟件結(jié)構(gòu)和模塊間關(guān)系,找到其與底層驅(qū)動的接口,并根據(jù)異構(gòu)多核SoC所支持的顯示模式適當(dāng)配置MiniGUI的圖形引擎。
3.1 MiniGUI
MiniGUI是面向?qū)崟r嵌入式系統(tǒng)的輕量級圖形用戶界面支持系統(tǒng)[12],基于MiniGUI可以開發(fā)各種窗口應(yīng)用程序。
在MiniGUI的軟件體系結(jié)構(gòu)中,引入了圖形抽象層(Graphics Abstract Layer, GAL)和輸入抽象層(Input Abstract Layer, IAL)的概念[13]。GAL和IAL屏蔽了不同硬件的差異性,為上層提供統(tǒng)一接口,使得MiniGUI更加具有可移植性。前面已經(jīng)實(shí)現(xiàn)了基于SVGA的Framebuffer驅(qū)動,這樣就可以直接利用MiniGUI GAL層提供的支持Framebuffer的fbcon引擎將MiniGUI移植到目標(biāo)系統(tǒng)。
3.2 移植過程
移植MiniGUI的主要工作就是在宿主機(jī)搭建交叉編譯環(huán)境,配置并編譯核心庫libminigui-gpl-3.0.12,MiniGUI資源庫minigui-res-be-3.0.12,MiniGUI圖形桌面環(huán)境(MiniGUI Demonstration Environment,MDE)mg-samples-3.0.12,還有輔助庫包括zlib-1.2.6、libpng-1.2.37、freetype-2.3.9、libmgplus-1.2.4,最后將編譯好的位于宿主機(jī)/usr/local/minigui下的3個目錄中的相關(guān)資源etc、lib、share拷貝到目標(biāo)機(jī)文件系統(tǒng)相應(yīng)的目錄下。
宿主機(jī)的操作系統(tǒng)環(huán)境是CentOS 6.1。由于SoC的CPU LEON3是SPARC指令集體系,所以交叉編譯工具是sparc-linux-3.4.4。將交叉編譯工具解壓到目錄/opt下,并修改用戶HOME目錄下環(huán)境變量配置文件,添加交叉編譯工具的路徑到PATH,如
export PATH=$PATH:/opt/sparc-linux-3.4.4/bin
各個庫的編譯配置基本上是類似的,以MiniGUI核心庫的配置為例,Makefile變量設(shè)置如下。
CC=sparc-linux-gcc
CFLAGS=-I/usr/local/minigui/include
LIBS=-L/usr/local/minigui/lib./configure
--prefix=/usr/local/minigui
--build=i386-linux
--host=sparc-linux
--target=sparc-linux
--with-osname=linux
--with-style=classic
--with-targetname=fbcon
--enable-autoial
--enable-procs
編譯完成后,會在宿主機(jī)的/usr/local/minigui目錄下生成3個目錄lib、share、etc,lib下保存的主要是所生成的動態(tài)庫以及其符號鏈接文件;share下是字體、圖標(biāo)、logo圖片等資源文件;etc下有一個配置文件MiniGUI.cfg,MiniGUI應(yīng)用程序在執(zhí)行main函數(shù)前會調(diào)用MiniGUI核心初始化函數(shù),InitGUI根據(jù)從MiniGUI.cfg讀取的配置信息來初始化MiniGUI中的各個模塊。為了使MiniGUI與Framebuffer驅(qū)動支持的分辨率,顏色深度等參數(shù)相一致,需要修改MiniGUI.cfg配置
[system]
gal_engine=fbcon
defaultmode=640x480-32bpp
[fbcon]
defaultmode=640x480-32bpp
將以上3個目錄的內(nèi)容拷貝到目標(biāo)機(jī)文件系統(tǒng)相應(yīng)目錄下,所移植的MiniGUI就成功安裝到了目標(biāo)系統(tǒng)。
在MiniGUI 3.0的源碼包中提供一個簡單的圖形桌面環(huán)境mg-samples-3.0.12 MDE。它為用戶提供一個運(yùn)行應(yīng)用程序的圖形接口,并且允許用戶通過配置文件mginit.rc添加自己的應(yīng)用程序,它的格式為
[taskbar]
nr=3
autostart=0
logo=res/xiyou_logo.png
[app0]
path=../minesweeper/
name=minesweeper
icon=res/mines.gif
...
將MDE的入口程序mginit添加到目標(biāo)系統(tǒng)的開機(jī)自動啟動項(xiàng)腳本/etc/init.d/rcS,系統(tǒng)啟動時mginit會解析mginit.rc文件內(nèi)容,利用系統(tǒng)調(diào)用fork為每個被雙擊運(yùn)行的程序創(chuàng)建一個新的進(jìn)程。用戶可以根據(jù)需要在存儲容量允許的條件下添加任意個2D MiniGUI和3D OpenGL Demos。
將編譯好的MiniGUI核心庫及輔助庫,資源文件以及MDE、應(yīng)用程序添加到文件系統(tǒng)中,重新生成操作系統(tǒng)的鏡像文件,由上位機(jī)下載到FPGA開發(fā)板的內(nèi)存中,操作系統(tǒng)啟動時,mginit由啟動腳本自動運(yùn)行。圖3是MDE運(yùn)行時的桌面,桌面背景圖片是Stanford Bunny,桌面上還有數(shù)個可運(yùn)行的2D、3D應(yīng)用程序。
圖3 MiniGUI運(yùn)行后的桌面效果
圖4是雙擊桌面上的應(yīng)用程序圖標(biāo)啟動的掃雷、推箱子等2D小游戲。
圖4 基于MiniGUI的小游戲示例
經(jīng)過MiniGUI 2D應(yīng)用程序和OpenGL 3D程序測試,MiniGUI的輸入子系統(tǒng)鍵盤鼠標(biāo)工作正常,圖形輸出平滑流暢,顏色鮮明,系統(tǒng)整體運(yùn)行穩(wěn)定,達(dá)到了人機(jī)交互的目的,展示了異構(gòu)多核SoC圖形處理器的處理能力。
通過從系統(tǒng)底層Framebuffer驅(qū)動開發(fā)到應(yīng)用層MiniGUI移植,構(gòu)建了異構(gòu)多核SoC圖形處理器FPGA系統(tǒng)的圖形用戶界面,系統(tǒng)完整地描述了基于一個新硬件平臺構(gòu)建圖形用戶界面的方法。運(yùn)行結(jié)果表明,所構(gòu)建的GUI系統(tǒng)可滿足系統(tǒng)的人機(jī)交互和應(yīng)用演示的需求。
[1] 詹瑾瑜,熊光澤,孫明. 一種嵌入式GUI軟件結(jié)構(gòu)實(shí)現(xiàn)方案[J]. 電子科技大學(xué)學(xué)報,2003,32(1):89-93.
[2] 魏凱斌,汪志農(nóng),張少剛. 基于uCLinux系統(tǒng)的圖形界面研究與實(shí)現(xiàn)[J]. 微計算機(jī)信息, 2007,23(11-2):83-85.
[3] 李戰(zhàn)明,龔思遠(yuǎn),陳若珠. 基于uClinux系統(tǒng)MiniGUI的移植研究[J]. 微計算機(jī)信息,2007,23(4-2):46-48.
[4] AeroflexGaisler.LEON/GRLIB Configuration and Development Guide[EB/OL]. (2014-04-16)[2014-06-01].http://gaisler.com/products/grlib/guide.pdf.
[5] 朱豪杰,韓俊剛,鄧軍勇,等. GPU命令處理器的存儲管理單元設(shè)計[J]. 西安郵電大學(xué)學(xué)報,2013,18(1):78-81.
[6] 田磊. Linux體系結(jié)構(gòu)及嵌入式Linux的移植與應(yīng)用[J]. 西安郵電學(xué)院學(xué)報,2009,14(3):102-105.
[7] 宋寶華,何昭然,史海濱,等. 精通 Linux 設(shè)備驅(qū)動程序開發(fā)[M]. 北京:人民郵電出版社,2010:249-254.
[8] Daniel Hellstrom. SnapGear Linux for LEON[EB/OL]. (2012-08-15)[2014-06-01]. http://www.gaisler.com/anonftp/linux/linux-2.6/snapgear/snapgear-manual-1.0.37.pdf.
[9] Corbet J, Rubini A, Hartman G K. Linux設(shè)備驅(qū)動程序:影印版[M].南京:東南大學(xué)出版社,2005:249-251.
[10] AeroflexGaisler.GRLIB IP Library User’s Manual[EB/OL].(2014-04-16)[2014-06-01]. http://gaisler.com/products/grlib/grlib.pdf.
[11] 宋寶華. Linux 設(shè)備驅(qū)動開發(fā)詳解[M]. 北京:人民郵電出版社, 2008:480-499.
[12] 魏永明. 嵌入式軟件開發(fā)及 C 語言實(shí)現(xiàn): MiniGUI 剖析[M]. 北京:電子工業(yè)出版社, 2008:37-45.
[13] Beijing Feynman Software Technology Co.,Ltd..Datasheet for MiniGUI V3.0.x[EB/OL]. (2008-10-13)[2014-06-01]. http://www.minigui.org/docs/minigui-datasheet-3.0e.pdf.
[責(zé)任編輯:祝劍]
A method of building GUI based on heterogeneous multi-processor SoC
WANG Yagang, MA Chao, JIAO Jiye
(School of Computer Science and Technology, Xi’an University of Posts and Telecommunications, Xi’an 710121,China)
Due to the nonexistence of GUI (Graphical User Interface) on the heterogeneous multi-processor SoC (System on Chip) FPGA prototype system, according to the principle and specific hardware of the display controller used in this system, a Framebuffer driver is developed in order that Mini GUI could be ported for the purpose to build GUI for this SoC. The test and interactive results show that the GUI can provide friendly interactive interface for the system.
SoC, Linux, framebuffer, MiniGUI, GUI
2014-08-29
國家自然科學(xué)重點(diǎn)基金資助項(xiàng)目(61136002);陜西省教育廳科學(xué)研究計劃資助項(xiàng)目(14JK1674)
王亞剛(1972-),男,博士,副教授,從事計算機(jī)系統(tǒng)結(jié)構(gòu)、并行編譯技術(shù)研究。E-mail: lazy_linux@126.com 馬超(1988-),男,碩士研究生,研究方向?yàn)橛嬎銠C(jī)軟件與理論。E-mail: onion_0709@yahoo.com
10.13682/j.issn.2095-6533.2015.01.012
TP316.2
A
2095-6533(2015)01-0060-04