APP下载

基于异构多核SoC的图形用户界面的构建方法

2015-06-23王亚刚焦继业

西安邮电大学学报 2015年1期
关键词:图形用户界面寄存器内核

王亚刚, 马 超, 焦继业

(西安邮电大学 计算机学院, 陕西 西安 710121)

基于异构多核SoC的图形用户界面的构建方法

王亚刚, 马 超, 焦继业

(西安邮电大学 计算机学院, 陕西 西安 710121)

针对异构多核片上系统的FPGA原型没有可供交互的图形用户界面问题,提出一种图形用户界面的构建方法。该方法根据系统中显示控制器的工作原理和硬件特点,开发Linux操作系统内核层的Framebuffer驱动程序,借助MiniGUI的fbcon图形引擎进行MiniGUI移植,从而为系统构建了图形用户界面。测试结果表明,所构建的图形用户界面能够为系统提供良好的人机交互接口。

片上系统;Linux;帧缓冲;MiniGUI;图形用户界面

图形用户界面(Graphical User Interface,GUI)作为嵌入式系统的人机交互接口,是嵌入式系统设计和开发的重要内容。常见的几种主流的嵌入式GUI有WinCE, OpenGUI, Qt/Embedded, MiniGUI等[1]。针对较为普遍的开发板和特定的操作系统(如S3C44B0和uClinux)构建图形用户界面的技术已经十分成熟[2-3],有的开发板甚至已经自带了GUI系统。而对于一个新设计开发的硬件平台,构建图形用户界面不仅需要从应用层解决移植问题,还必须从操作系统驱动层为移植提供底层支持。

针对异构多核现场可编程门阵列(Field Programmable Gate Array, FPGA)硬件原型片上系统(System on Chip, SoC)没有图形用户界面来进行系统测试和效果展示的问题,本文拟从系统底层驱动到应用层,通过Linux帧缓冲驱动和移植MiniGUI视窗系统,构建图形用户界面。

1 SoC系统概述

异构多核SoC图形处理器采用CPU+GPU(Graphics Processing Unit)架构,其中CPU采用支持SPARC V8的LEON3处理器[4],GPU支持OpenGL 1.3(Open Graphics Library 1.3)标准,可编程处理器包含9级图形流水渲染管线,采用自定制的32位精简指令集(Reduced Instruction Set Computer,RISC)[5]。在图形应用程序的处理过程中,GPU负责3D图形加速,CPU处理一些简单的2D图形计算,高级视频图形阵列(Super Video Graphics Array,SVGA)显示控制器负责显示Framebuffer中的像素。

SoC图形用户界面的软硬件总体关系如图1所示。基于异构多核SoC图形处理器的FPGA原型和移植的Linux操作系统,开发了针对于此SoC的显示控制器GRLIB SVGA的内核Framebuffer驱动,借助于MiniGUI的fbcon图形引擎将MiniGUI移植到此硬件平台。

图1 异构多核SoC GUI构建关系

2 Linux帧缓冲驱动

帧缓冲驱动是Linux内核为用户程序提供的操作显示设备和管理显示内存的统一接口,它为用户程序屏蔽了不同显示硬件的差异[6]。实现此平台的GRLIB SVGA显示控制器的Framebuffer驱动,有两个关键步骤:SVGA显控寄存器的I/O内存映射及配置和显存的分配。

2.1 SVGA寄存器I/O映射

在使用内存管理单元(Memory Management Unit,MMU)的情况下,CPU只能处理虚拟地址,所以在驱动中首先要将硬件寄存器的物理地址映射到内核虚拟地址空间[7]。

SVGA显控作为一个高级外部设备总线(Advanced Peripheral Bus,APB)从设备挂接到系统的APB总线上。APB总线支持Plug&Play功能,所有的已挂接的APB从设备的Plug&Play配置信息保存在一块只读的总线地址空间0xFF000~0xFFFFF,大小为4 KB,每个APB从设备的配置记录占2个字长[8],图2是APB总线Plug&Play(PnP)配置字格式。在Framebuffer驱动中通过调用内核高级微控制器总线体系(Advanced Microcontroller Bus Architecture,AMBA)PnP驱动提供的接口amba_get_free_apbslv_devices将配置信息解析保存到描述APB从设备的结构。其结构体代码如下。

typedef struct amba_apb_device {

unsigned int start, irq, bus_id;

amba_confarea_type *bus;

} amba_apb_device;

其中第一个字段start保存的是从SVGA配置字解析的控制寄存器的起始物理地址。

图2 APB PnP配置字格式

通过内核函数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));

结构体LEON3_GRVGA_Regs_Map包括了SVGA显控的总共11个寄存器[10],它们分别用来设置显控的状态、水平垂直分辨率、上下左右扫描空白时间、水平垂直同步时间、Framebuffer内存起始物理地址、4个时钟向量、颜色查找表地址(使用伪彩色)。

寄存器映射完成后,把结构fb_var_screeninfo的对应的时序参数写到寄存器的虚拟地址,xres和yres分别是显示的水平垂直分辨率,其它参数在屏幕上是不可见的[11]。

2.2 显存的申请分配

显控的寄存器映射并初始化后,驱动要完成的另一个关键步骤就是为系统申请显示内存,也就是帧缓冲所指的系统内存缓冲区。为了使驱动有更大的灵活性,SVGA Framebuffer驱动支持两种申请显存的方式:一种是通过内核命令行参数指定一个专门的Framebuffer起始地址;另一种是驱动模块加载时由内核动态向系统申请一块帧缓冲区,并将这块内存的物理地址写入显控的Framebuffer位置寄存器。帧缓冲区大小是由命令行参数或驱动所选择的默认水平垂直分辨率和位深的乘积决定的。

在内核命令行参数不指定使用自定义帧缓冲起始地址的情况下,驱动默认使用第二种方法申请显存。申请显存并将所申请的物理地址保存的代码如下。

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;

3 MiniGUI的移植

完成操作系统内核层的Framebuffer驱动后,构建图形用户界面的最后一步工作就是移植MiniGUI。移植的主要工作是分析MiniGUI的软件结构和模块间关系,找到其与底层驱动的接口,并根据异构多核SoC所支持的显示模式适当配置MiniGUI的图形引擎。

3.1 MiniGUI

MiniGUI是面向实时嵌入式系统的轻量级图形用户界面支持系统[12],基于MiniGUI可以开发各种窗口应用程序。

在MiniGUI的软件体系结构中,引入了图形抽象层(Graphics Abstract Layer, GAL)和输入抽象层(Input Abstract Layer, IAL)的概念[13]。GAL和IAL屏蔽了不同硬件的差异性,为上层提供统一接口,使得MiniGUI更加具有可移植性。前面已经实现了基于SVGA的Framebuffer驱动,这样就可以直接利用MiniGUI GAL层提供的支持Framebuffer的fbcon引擎将MiniGUI移植到目标系统。

3.2 移植过程

移植MiniGUI的主要工作就是在宿主机搭建交叉编译环境,配置并编译核心库libminigui-gpl-3.0.12,MiniGUI资源库minigui-res-be-3.0.12,MiniGUI图形桌面环境(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,最后将编译好的位于宿主机/usr/local/minigui下的3个目录中的相关资源etc、lib、share拷贝到目标机文件系统相应的目录下。

宿主机的操作系统环境是CentOS 6.1。由于SoC的CPU LEON3是SPARC指令集体系,所以交叉编译工具是sparc-linux-3.4.4。将交叉编译工具解压到目录/opt下,并修改用户HOME目录下环境变量配置文件,添加交叉编译工具的路径到PATH,如

export PATH=$PATH:/opt/sparc-linux-3.4.4/bin

各个库的编译配置基本上是类似的,以MiniGUI核心库的配置为例,Makefile变量设置如下。

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

编译完成后,会在宿主机的/usr/local/minigui目录下生成3个目录lib、share、etc,lib下保存的主要是所生成的动态库以及其符号链接文件;share下是字体、图标、logo图片等资源文件;etc下有一个配置文件MiniGUI.cfg,MiniGUI应用程序在执行main函数前会调用MiniGUI核心初始化函数,InitGUI根据从MiniGUI.cfg读取的配置信息来初始化MiniGUI中的各个模块。为了使MiniGUI与Framebuffer驱动支持的分辨率,颜色深度等参数相一致,需要修改MiniGUI.cfg配置

[system]

gal_engine=fbcon

defaultmode=640x480-32bpp

[fbcon]

defaultmode=640x480-32bpp

将以上3个目录的内容拷贝到目标机文件系统相应目录下,所移植的MiniGUI就成功安装到了目标系统。

4 测试结果及分析

在MiniGUI 3.0的源码包中提供一个简单的图形桌面环境mg-samples-3.0.12 MDE。它为用户提供一个运行应用程序的图形接口,并且允许用户通过配置文件mginit.rc添加自己的应用程序,它的格式为

[taskbar]

nr=3

autostart=0

logo=res/xiyou_logo.png

[app0]

path=../minesweeper/

name=minesweeper

icon=res/mines.gif

...

将MDE的入口程序mginit添加到目标系统的开机自动启动项脚本/etc/init.d/rcS,系统启动时mginit会解析mginit.rc文件内容,利用系统调用fork为每个被双击运行的程序创建一个新的进程。用户可以根据需要在存储容量允许的条件下添加任意个2D MiniGUI和3D OpenGL Demos。

将编译好的MiniGUI核心库及辅助库,资源文件以及MDE、应用程序添加到文件系统中,重新生成操作系统的镜像文件,由上位机下载到FPGA开发板的内存中,操作系统启动时,mginit由启动脚本自动运行。图3是MDE运行时的桌面,桌面背景图片是Stanford Bunny,桌面上还有数个可运行的2D、3D应用程序。

图3 MiniGUI运行后的桌面效果

图4是双击桌面上的应用程序图标启动的扫雷、推箱子等2D小游戏。

图4 基于MiniGUI的小游戏示例

经过MiniGUI 2D应用程序和OpenGL 3D程序测试,MiniGUI的输入子系统键盘鼠标工作正常,图形输出平滑流畅,颜色鲜明,系统整体运行稳定,达到了人机交互的目的,展示了异构多核SoC图形处理器的处理能力。

5 结束语

通过从系统底层Framebuffer驱动开发到应用层MiniGUI移植,构建了异构多核SoC图形处理器FPGA系统的图形用户界面,系统完整地描述了基于一个新硬件平台构建图形用户界面的方法。运行结果表明,所构建的GUI系统可满足系统的人机交互和应用演示的需求。

[1] 詹瑾瑜,熊光泽,孙明. 一种嵌入式GUI软件结构实现方案[J]. 电子科技大学学报,2003,32(1):89-93.

[2] 魏凯斌,汪志农,张少刚. 基于uCLinux系统的图形界面研究与实现[J]. 微计算机信息, 2007,23(11-2):83-85.

[3] 李战明,龚思远,陈若珠. 基于uClinux系统MiniGUI的移植研究[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命令处理器的存储管理单元设计[J]. 西安邮电大学学报,2013,18(1):78-81.

[6] 田磊. Linux体系结构及嵌入式Linux的移植与应用[J]. 西安邮电学院学报,2009,14(3):102-105.

[7] 宋宝华,何昭然,史海滨,等. 精通 Linux 设备驱动程序开发[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设备驱动程序:影印版[M].南京:东南大学出版社,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 设备驱动开发详解[M]. 北京:人民邮电出版社, 2008:480-499.

[12] 魏永明. 嵌入式软件开发及 C 语言实现: MiniGUI 剖析[M]. 北京:电子工业出版社, 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.

[责任编辑:祝剑]

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

国家自然科学重点基金资助项目(61136002);陕西省教育厅科学研究计划资助项目(14JK1674)

王亚刚(1972-),男,博士,副教授,从事计算机系统结构、并行编译技术研究。E-mail: lazy_linux@126.com 马超(1988-),男,硕士研究生,研究方向为计算机软件与理论。E-mail: onion_0709@yahoo.com

10.13682/j.issn.2095-6533.2015.01.012

TP316.2

A

2095-6533(2015)01-0060-04

猜你喜欢

图形用户界面寄存器内核
多内核操作系统综述①
STM32和51单片机寄存器映射原理异同分析
强化『高新』内核 打造农业『硅谷』
活化非遗文化 承启设计内核
Java图形用户界面编程在文本格式化设置系统中的教学研究
Lite寄存器模型的设计与实现
Linux内核mmap保护机制研究
移位寄存器及算术运算应用
浅谈图形用户界面的保护
sgRNAcas9软件图形用户界面开发及应用