MiniGUI显示引擎初始化流程

本文深入剖析MiniGUI中显示引擎的初始化流程,包括解析MiniGUI.cfg配置文件、选择及初始化显示引擎,如videofbcon。通过分析关键函数如mg_InitGAL、mg_InitScreenDC,展示了如何启动GAL_VideoInit、GAL_SetVideoMode等,以及fbcon引擎的FB_VideoInit和FB_SetVideoMode在设置模式和硬件特性中的作用。同时,文章讨论了软件双缓冲的概念和限制。
摘要由CSDN通过智能技术生成

前言

这次主要分析在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引擎为例,先看一下时序图
MiniGUI显示引擎初始化时序图
在文件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"
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值