logo资料库

miniGUI 3.0.2 在Hi3535平台上的移植.pdf

第1页 / 共15页
第2页 / 共15页
第3页 / 共15页
第4页 / 共15页
第5页 / 共15页
第6页 / 共15页
第7页 / 共15页
第8页 / 共15页
资料共15页,剩余部分请下载后查看
miniGUI3.0在Hi3535平台上的移植之一miniGUI是一个自由软件项目。其目标是提供一个快速、稳定、跨操作系统的图形用户界面(GUI)支持系统,尤其是基于Linux/uClinux、eCos以及其他传统RTOS(如VxWorks、ThreadX、uC/OS-II、Nucleus等)的实时嵌入式操作系统。最近在Hi3535的平台上移植miniGUI3.0,并完成Helloworld的用例测试。这里将移植的过程记录如下。一、准备工作1.Hi3535SDK和开发板一套,并构建Hi3535的嵌入式开发环境(包括linux编译主机、安装交叉编译工具以及在宿主机上安装NFS调试环境等)。2.从官网下载miniGUI源码以及资源包和示例包。下载地址3.熟悉海思Hi3535的Framebuffer模块。包括海思Hi3535提供Framebuffer的标准接口以及Hi3535提供的扩展接口(包括设置colorkey,Alpha等),Hi3535的Framebuffer提供的几种工作模式(NoneBuffer,OneBuffer,DoubleBuffer等)。此外要仔细研读海思Hi3535的SDK中提供关于Framebufer的指导文档以及参考代码。熟悉Hi3535初始化流程以及Framebuffer的使用流程(包括初始化以及绘制Framebuffer)。二、初次编译解压下载的源代码后,先在源代码的根路径下创建_install目录用于保存编译生成文件。运行以下命令进行配置:./configure--prefix=[mg_path]/libminigui-3.0.12-linux/_installCC=arm-hisiv100nptl-linux-gcc--host=arm-hisiv100nptl-linux--disable-pcxvfb--disable-screensaver--disable-splash--disable-jpgsupport--enable-videoqvfb=no--enable-rtosxvfb=no--enable-pcxvfb=no注意:[mg_path]为miniGUI3.0源代码的存储路径,在具体运行时根据实际保存的源代码路径重新写入。运行以下命令进行编译:makemakeinstall编译成功后可在_install目录下看到编译生成的文件。包括四个文件夹,简要说明如下:etc文件夹下保存运行配置文件miniGUI.cfg,在实际调试过程中需要修改其内容,详见后续章节描述;include集成miniGUI库时需要使用到的头文件。lib包括链接库和运行库。share暂未使用三、加入Hi3535的framebuffer接口文件miniGUI中Framebuffer部分的接口主要需要完成两个结构体的初始化,即VideoBootStrap和GAL_VideoDevice。可查到上述两个结构体的定义如下:1.typedefstructVideoBootStrap2.{3.constchar*name;4.constchar*desc;5.int(*available)(void);6.GAL_VideoDevice*(*create)(intdevindex);7.}VideoBootStrap;
结构体成员简要说明如下:name为字符串变量,改字符串用于区分运行的平台,因此尽量保持唯一性。这里使用hi3535作为name。此字符串需要跟运行配置文件MiniGUI.cfg中的名称保持一致。desc描述,目前没有查到有什么限制,本例使用HI3535FramebufferConsoleavailable为需要填充的函数,检查framebuffer是否可用。即尝试打开设备,如果打开成功即验证可用。create为需要填充的函数,函数主要完成GAL_VideoDevice变量的初始化。GAL_VideoDevice的定义详见src/newgal/sysvideo.h文件。主要说两点:name仍然保持和VideoBootStrap中定义的一致。hidden成员变量,主要保存Hi3535在后续Framebuffer中操作需要的信息,可根据需要进行定制。本例中暂定义为:1.structGAL_PrivateVideoData2.{3.Uint32fd;4.HIFB_BUFFER_SstCanvasBuf;5.Uint32memLen;6.};其中:fd为openFramebuffer设备后的句柄;stCanvasBuf为framebuffer的画布信息;memLen为Framebuffer分配的内存长度。其他为需要填充的函数。miniGUI3.0.2中的src/newgal中包含hisi文件夹,目前有实现Hi3510/Hi3560/Hi3560a等芯片的接口。本例中添加Hi3535芯片的接口,将海思hi3535的接口文件命名为:hi3535_fbvideo.c和hi3535_fbvideo.h,完成上述两个结构体变量的初始化。首先可使用空函数完成代码。接下来修改配置文件(包括configure和makefile)来编译新增加的Hi3535的接口文件。修改configure.in文件,增加编译Hi3535增加如下代码:1.dnlCheckHI3535videodriver2.CheckHI3535Video()3.{4.AC_ARG_ENABLE(videohi3535,5.[--enable-videohi3535includeHi3535VideoNEWGALengine],6.enable_video_hi3535=$enableval)7.8.iftest"x$enable_video_hi3535"="xyes";then9.AC_DEFINE(_MGGAL_HI3535,1,10.[DefineifincludeHi3535VideoNEWGALengine])
11.VIDEO_SUBDIRS="$VIDEO_SUBDIRShisi"12.VIDEO_DRIVERS="$VIDEO_DRIVERShisi/libvideo_hisifbcon.la"13.fi14.}增加调用上述代码:1.dnlChecksNewGALEngine.2.{3.CheckDummyVideo4.CheckFBCON5.CheckQVFB6.CheckXVFB7.CheckWVFB8.CheckCOMMLCD9.CheckShadowVideo10.CheckMLShadowVideo11.CheckEM85xxOSD12.CheckEM85xxYUV13.CheckEM86GFX14.CheckSvpxxosdVideo15.CheckBF533Video16.CheckMB93493Video17.CheckUTPMCVideo18.CheckDirectFBVideo19.CheckSTGFBVideo20.CheckHI35XXVideo21.CheckHI3560AVideo22.CheckHI3535Video23.CheckGDLVideo24.CheckNexusVideo25.CheckS3C6410Video26.CheckCustomVideo27.CheckSigmaVideo28.CheckMStarVideo29.}修改src/newgal/hisi目录下的makefile.in和makefile.am文件,增加编译hi3535的framebuffer接口。修改makefile.in文件如下:1.am__objects_1=hi3510_fbvideo.logal_hi3560a.lohi3560_fbvideo.lohi3535_fbvideo.lo\2.pix_array.lotde.lo
上述属于修改,找到am__objects_1的变量,增加hi3535_fbvideo.lo1.SRC_FILES=hi3510_fbvideo.cgal_hi3560a.chi3560_fbvideo.chi3535_fbvideo.cpix_array.ctde.c2.HDR_FILES=hi3510_fb.hhi3560_fb.hhi3510_fbvideo.hhi3560_fbvideo.hhi3535_fbvideo.h\hi_tde.htde_reg.hgal_hi3560a.h上述属于修改,找到SRC_FILES和HDR_FILES变量,分别添加hi3535_fbvideo.c和hi3535_fbvideo.h1.@AMDEP_TRUE@@am__include@@am__quote@./$(DEPDIR)/hi3535_fbvideo.Plo@am__quote@上述属于增加的行,参考现有海思芯片的类型进行添加。同时修改makefile.am如下:1.SRC_FILES=hi3510_fbvideo.cgal_hi3560a.chi3560_fbvideo.chi3535_fbvideo.cpix_array.ctde.c2.HDR_FILES=hi3510_fb.hhi3560_fb.hhi3510_fbvideo.hhi3560_fbvideo.hhi3535_fbvideo.hhi_tde.htde_reg.hgal_hi3560a.h完成四个基础函数的填充。1.staticintHI3535_Available(void)2.{3.constchar*GAL_fbdev;4.intfd;5.6.GAL_fbdev=getenv("FRAMEBUFFER");7.if(GAL_fbdev==NULL)8.{9.GAL_fbdev="/dev/fb0";10.}11.12.fd=open(GAL_fbdev,O_RDWR,0);13.14.if(fd<0)15.{16.fprintf(stderr,"failedtoopenfile:%s!\n",GAL_fbdev);17.return0;18.}19.else20.{21.close(fd);22.return1;23.}
24.}Hi3535默认加载Framebuffer,因此可以在/dev目录下找到fb0的设备节点文件。上述函数只是尝试打开/dev/fb0文件,如果能够成功打开并获取句柄,则返回成功,否则,返回失败。1.staticGAL_VideoDevice*HI3535_CreateDevice(intdevindex)2.{3.GAL_VideoDevice*this;4.5./*Initializeallvariablesthatwecleanonshutdown*/6.this=(GAL_VideoDevice*)malloc(sizeof(GAL_VideoDevice));7.8.if(this)9.{10.memset(this,0,(sizeof*this));11.this->hidden=(structGAL_PrivateVideoData*)malloc(sizeof(structGAL_PrivateVideoData));12.this->name="hi3535";13.}14.15.if((this==NULL)||(this->hidden==NULL))16.{17.GAL_OutOfMemory();18.if(this)19.{20.free(this);21.}22.return(0);23.}24.25.memset(this->hidden,0,(sizeof(structGAL_PrivateVideoData)));26.27./*Setthefunctionpointers*/28.this->VideoInit=HI3535_VideoInit;29.this->ListModes=HI3535_ListModes;30.this->SetVideoMode=HI3535_SetVideoMode;31.this->ToggleFullScreen=HI3535_ToggleFullScreen;32.this->SetColors=HI3535_SetColors;33.this->UpdateRects=HI3535_UpdateRects;34.this->VideoQuit=HI3535_VideoQuit;35.#ifndef_MGRM_THREADS36.this->RequestHWSurface=HI3535_RequestHWSurface;37.#endif38.this->AllocHWSurface=HI3535_AllocHWSurface;39.this->CheckHWBlit=HI3535_CheckHWBlit;
40.this->FillHWRect=HI3535_FillHWRect;41.this->SetHWColorKey=HI3535_SetHWColorKey;42.this->SetHWAlpha=HI3535_SetHWAlpha;43.this->FreeHWSurface=HI3535_FreeHWSurface;44.this->free=HI3535_FBFree;45.this->DeleteSurface=HI3535_DeleteSurface;46.this->SetSurfaceColors=HI3535_SetSurfaceColors;47.this->GetFBInfo=HI3535_GetFBInfo;48.this->UpdateSurfaceRects=HI3535_UpdateSurfaceRects;49.50.returnthis;51.}上述函数主要用于创建GAL_VideoDevice结构体变量,初始化并返回。并且分配hidden成员变量的空间。1.externinthi3535_board_init(void);外部初始化函数,用于实现初始化Hi3535平台。可参考海思SDK中的sample示例。因为miniGUI运行时,并不会去完成平台初始化的工作,因此在miniGUI调用其库完成framebuffer的接口初始化之前,要借助此外部函数完成平台初始化,以确保framebuffer的初始化及相关操作不会出错。1.staticintHI3535_VideoInit(GAL_VideoDevice*this,GAL_PixelFormat*vformat)2.{3.structfb_fix_screeninfofinfo;4.structfb_var_screeninfovinfo;5.inti;6.constchar*GAL_fbdev;7.GAL_VideoInfo*paccel_info=&this->info;8.HIFB_COLORKEY_SstColorKey;9.HIFB_POINT_SstPoint;10.HIFB_LAYER_INFO_SstLayerInfo={0};11.HI_BOOLbShow;12.13.hi3535_board_init();14.15./*1.openFramebufferdeviceoverlay0*/16.GAL_fbdev=getenv("FRAMEBUFFER");17.if(GAL_fbdev==NULL)18.{19.GAL_fbdev="/dev/fb0";20.}21.this->hidden->fd=open(GAL_fbdev,O_RDWR,0);22.if(this->hidden->fd<0)23.{
24.GAL_SetError("NEWGAL>HI3535:Unabletoopen%s\n",GAL_fbdev);25.return-1;26.}27.28.29./*2.alllayersurportcolorkey*/30.stColorKey.bKeyEnable=HI_TRUE;31.stColorKey.u32Key=0x0;32.if(ioctl(this->hidden->fd,FBIOPUT_COLORKEY_HIFB,&stColorKey)<0)33.{34.GAL_SetError("NEWGAL>HI3535:FBIOPUT_COLORKEY_HIFB!\n");35.return-2;36.}37.38./*3.setthescreenoriginalposition*/39.stPoint.s32XPos=0;40.stPoint.s32YPos=0;41.if(ioctl(this->hidden->fd,FBIOPUT_SCREEN_ORIGIN_HIFB,&stPoint)<0)42.{43.GAL_SetError("NEWGAL>HI3535:setscreenoriginalshowpositionfailed!\n");44.return-3;45.}46.47./*4.getthevariablescreeninfo*/48.if(ioctl(this->hidden->fd,FBIOGET_VSCREENINFO,&vinfo)<0)49.{50.GAL_SetError("NEWGAL>HI3535:GET_VSCREENINFOfailed!\n");51.return-4;52.}53.54./*5.configthedefaultparametersofthevariablescreen.*/55.vinfo.xres_virtual=DEFAULT_SCREEN_WIDTH;56.vinfo.yres_virtual=DEFAULT_SCREEN_HEIGHT;57.vinfo.xres=DEFAULT_SCREEN_WIDTH;58.vinfo.yres=DEFAULT_SCREEN_HEIGHT;59.vinfo.transp=s_a16;60.vinfo.red=s_r16;61.vinfo.green=s_g16;62.vinfo.blue=s_b16;63.vinfo.bits_per_pixel=16;64.vinfo.activate=FB_ACTIVATE_NOW;65.if(ioctl(this->hidden->fd,FBIOPUT_VSCREENINFO,&vinfo)<0)66.{
67.GAL_SetError("NEWGAL>HI3535:Putvariablescreeninfofailed!\n");68.return-5;69.}70.71./*6.setonebuffermode.*/72.stLayerInfo.BufMode=HIFB_LAYER_BUF_ONE;73.stLayerInfo.u32Mask=HIFB_LAYERMASK_BUFMODE;74.if(ioctl(this->hidden->fd,FBIOPUT_LAYER_INFO,&stLayerInfo)<0)75.{76.GAL_SetError("NEWGAL>HI3535:PUT_LAYER_INFOfailed!\n");77.return-6;78.}79.80.bShow=HI_TRUE;81.if(ioctl(this->hidden->fd,FBIOPUT_SHOW_HIFB,&bShow)<0)82.{83.GAL_SetError("NEWGAL>HI3535:FBIOPUT_SHOW_HIFBfailed!\n");84.return-7;85.}86.87./*7.Getthetypeofvideohardware*/88.if(ioctl(this->hidden->fd,FBIOGET_FSCREENINFO,&finfo)<0)89.{90.GAL_SetError("NEWGAL>HI3535:Couldn'tgetconsolehardwareinfo\n");91.HI3535_VideoQuit(this);92.return-6;93.}94.95./*Memorymapthedevice,compensatingforbuggyPPCmmap()*/96.this->hidden->stCanvasBuf.stCanvas.u32PhyAddr=mmap(NULL,finfo.smem_len,PROT_READ|PROT_WRITE,MAP_SHARED,this->hidden->fd,0);97.this->hidden->stCanvasBuf.stCanvas.u32Width=vinfo.xres;98.this->hidden->stCanvasBuf.stCanvas.u32Height=vinfo.yres;99.this->hidden->stCanvasBuf.stCanvas.u32Pitch=vinfo.xres*2;100.this->hidden->stCanvasBuf.stCanvas.enFmt=HIFB_FMT_ARGB1555;101.memset((Uint16*)(this->hidden->stCanvasBuf.stCanvas.u32PhyAddr),0x00,this->hidden->stCanvasBuf.stCanvas.u32Pitch*this->hidden->stCanvasBuf.stCanvas.u32Height);102.this->hidden->memLen=finfo.smem_len;103.104.vformat->BitsPerPixel=vinfo.bits_per_pixel;105.106.for(i=0;i
分享到:
收藏