前言
这次主要分析在MiniGUI中,显示引擎的初始化流程,让大家理解MiniGUI.cfg配置文件怎么影响到使用哪一个引擎的,如果需要开发一个新引擎的话,本文章也有帮助
因为使用MiniGUI的人数也少,写这些文章没有什么价值,以后可能就不再写minigui的文章了,之后会多写一点QT的文章
1、MiniGUI支持的显示引擎
引擎名称 | 引擎含义 | 默认编译 |
---|---|---|
videodummy | 是否包括虚拟NEWGAL引擎,所有操作系统 | yes |
videofbcon | 是否包括FrameBuffer控制台NEWGAL引擎,Linux/uClinux | yes |
videoqvfb | 是否包括Qt Virtual FrameBuffer NEWGAL引擎,Linux | yes |
rtosxvfb | 是否包括RTOS Virtual FrameBuffer NEWGAL引擎 注意:如果要启用rtosxvfb,必须禁用pcxvfb | no |
pcxvfb | 是否包括PC Virtual FrameBuffer NEWGAL引擎,如qvfb,mvfb,gvfb或wvfb | yes |
videowvfb | 是否包括Windows Virtual FrameBuffer NEWGAL引擎,Win32 | no |
videocommlcd | 是否包括普通LCD的NEWGAL引擎,所有操作系统 | no |
videomlshadow | 是否包括MLShadow NEWGAL引擎,所有操作系统,MiniGui-Threads 、MiniGui-Standalone | no |
videoshadow | 是否包括Shadow NEWGAL引擎 | no |
videoem86gfx | 是否包括EM86xx GFG的NEWGAL引擎,EM86开发板的GFX图形引擎 | no |
videoem85xxyuv | 是否包括EM85xx YUV的NEWGAL引擎,EM85xx开发板的YUV图形引擎,uClinux | no |
videoem85xxosd | 是否包括EM85xx OSD的NEWGAL引擎,EM85xx开发板的OSD图形引擎,uClinux | no |
videosvpxxosd | 是否包括SVPXXOSD NEWGAL引擎,uClinux | no |
videobf533 | 是否包括通过SPI的BF533 OSD的NEWGAL引擎,uClinux | no |
videomb93493 | 是否包括mb93493的NEWGAL引擎YUV FrameBuffer驱动程序,uClinux | no |
videoutpmc | 是否包括UTPMC的NEWGAL引擎,uClinux | no |
videodfb | 是否包括DirectFB的NEWGAL引擎,将MiniGui运 行在DirectFB之上,Linux | no |
videost7167 | 是否包括ST7167的NEWGAL引擎 | no |
videostgfb | 是否包括STGFB的NEWGAL引擎 | no |
videohi35xx | 是否包括Hi35xx视频NEWGAL引擎,hi35xx开发板的图形引擎,Linux | no |
videohi3560a | 是否包括Hi3560A视频NEWGAL引擎 | no |
videogdl | 是否包括GDL Video NEWGAL引擎 | no |
videosigma8654 | 是否包括sigma8654 NEWGAL引擎 | no |
videomstar | 是否包括mstar NEWGAL引擎 | no |
videocustom | 是否包括自定义NEWGAL引擎 | no |
videonexus | 是否包括nexus NEWGAL引擎 | no |
videos3c6410 | 是否包括s3c6410 NEWGAL引擎 | no |
2、引擎初始化时序
本文以videofbcon引擎为例,先看一下时序图
在文件libminigui-gpl-3.2/src/kernel/init.c中,有入口函数InitGUI,主要关注mg_InitGAL和mg_InitScreenDC函数。mg_InitGAL函数里面会解析MiniGUI.cfg文件里面的配置,然后选择一种显示引擎初始化,之后需要显示的界面都是绘制到__gal_screen这个GAL_Surface上面。mg_InitScreenDC是初始化DC槽,一共会初始化16个,由DCSLOTNUMBER宏定义,也就是说,在应用中最多只能申请到16个DC句柄,所以开发应用的时候要注意
/* libminigui-gpl-3.2/src/kernel/init.c */
int GUIAPI InitGUI (int args, const char *agr[])
{
/*......*/
step++;
/* 显示引擎初始化 */
switch (mg_InitGAL ()) {
case ERR_CONFIG_FILE:
fprintf (stderr,
"KERNEL>InitGUI: Reading configuration failure!\n");
return step;
case ERR_NO_ENGINE:
fprintf (stderr,
"KERNEL>InitGUI: No graphics engine defined!\n");
return step;
case ERR_NO_MATCH:
fprintf (stderr,
"KERNEL>InitGUI: Can not get graphics engine information!\n");
return step;
case ERR_GFX_ENGINE:
fprintf (stderr,
"KERNEL>InitGUI: Can not initialize graphics engine!\n");
return step;
}
/* 初始化主屏幕DC */
step++;
if (!mg_InitScreenDC (__gal_screen)) {
fprintf (stderr, "KERNEL>InitGUI: Can not initialize screen DC!\n");
goto failure1;
}
/*......*/
}
在文件libminigui-gpl-3.2/src/newgal/newgal.c,看看mg_InitGAL函数里面具体是怎么实现的,其实MiniGUI不仅可以从配置文件读取配置,也可以使用环境变量,比如下面的MG_GAL_ENGINE,如果设置了该环境变量,那么则忽略gal_engine的配置。主要关注GAL_VideoInit和GAL_SetVideoMode函数
/* libminigui-gpl-3.2/src/newgal/newgal.c */
int mg_InitGAL (void)
{
/*......*/
#ifndef __NOUNIX__
/* 获取环境变量MG_GAL_ENGINE,如果有值则不再获取gal_engine的值 */
if ((env_value = getenv ("MG_GAL_ENGINE"))) {
strncpy (engine, env_value, LEN_ENGINE_NAME);
engine [LEN_ENGINE_NAME] = '\0';
}
else
#endif
#ifndef _MG_MINIMALGDI
/* 从MiniGUI.cfg获取gal_engine的值 */
if (GetMgEtcValue ("system", "gal_engine", engine, LEN_ENGINE_NAME) < 0) {
return ERR_CONFIG_FILE;
}
#else /* _MG_MINIMALGDI */
# ifdef _MGGAL_PCXVFB
strcpy(engine, "pc_xvfb"