在MiniGUI增加一种显示模式(修改分辨率)!

 

     MiniGUI开发中,通过修改配置文件MiniGUI.cfg中配置值,可以设置不通的分辨率。但是已有的模式只支持一些常用的分辨率模式,对于一些不常用的分辨率模式,没有办法通过修改配置文件得到支持。这里讲讲如何修改源码和配置文件,增加不常用的分辨率模式。这里讲述方法在Linux平台验证过,其他的平台没有验证过。

Linux平台下,显示设备一般对应文件/dev/fbMiniGUI下对于framebuffer的控制通过${BASE_PATH}/src/newgal/fbcon/fbvideo.c实现,分辨率的设置也在该文件中。fbvideo.c中有两个数组

static const GAL_Rect checkres[] = {

    {  0, 0, 1600, 1200 },        /* 16 bpp: 0x11E, or 286 */

    {  0, 0, 1408, 1056 },        /* 16 bpp: 0x19A, or 410 */

    {  0, 0, 1280, 1024 },        /* 16 bpp: 0x11A, or 282 */

    {  0, 0, 1152,  864 },        /* 16 bpp: 0x192, or 402 */

    {  0, 0, 1024,  768 },        /* 16 bpp: 0x117, or 279 */

    {  0, 0,  960,  720 },        /* 16 bpp: 0x18A, or 394 */

    {  0, 0,  800,  600 },        /* 16 bpp: 0x114, or 276 */

    {  0, 0,  768,  576 },        /* 16 bpp: 0x182, or 386 */

    {  0, 0,  640,  480 },        /* 16 bpp: 0x111, or 273 */

    {  0, 0,  640,  400 },        /*  8 bpp: 0x100, or 256 */

    {  0, 0,  512,  384 },

    {  0, 0,  320,  240 },

    {  0, 0,  320,  200 },

    {  0, 0,  240,  320 },

    {  0, 0,  160,  160 },

    {  0, 0,  60,  60 }

};

 static const struct {

    int xres;

    int yres;

    int pixclock;

    int left;

    int right;

    int upper;

    int lower;

    int hslen;

    int vslen;

    int sync;

    int vmode;

} vesa_timings[] = {

#ifdef USE_VESA_TIMINGS    /* Only tested on Matrox Millenium I */

    {  640,  400, 39771,  48, 16, 39,  8,  96, 2, 2, 0 },    /* 70 Hz */

    {  640,  480, 39683,  48, 16, 33, 10,  96, 2, 0, 0 },    /* 60 Hz */

    {  768,  576, 26101, 144, 16, 28,  6, 112, 4, 0, 0 },    /* 60 Hz */

    {  800,  600, 24038, 144, 24, 28,  8, 112, 6, 0, 0 },    /* 60 Hz */

    {  960,  720, 17686, 144, 24, 28,  8, 112, 4, 0, 0 },    /* 60 Hz */

    { 1024,  768, 15386, 160, 32, 30,  4, 128, 4, 0, 0 },    /* 60 Hz */

    { 1152,  864, 12286, 192, 32, 30,  4, 128, 4, 0, 0 },    /* 60 Hz */

    { 1280, 1024,  9369, 224, 32, 32,  4, 136, 4, 0, 0 },    /* 60 Hz */

    { 1408, 1056,  8214, 256, 40, 32,  5, 144, 5, 0, 0 },    /* 60 Hz */

    { 1600, 1200,/*?*/0, 272, 48, 32,  5, 152, 5, 0, 0 },    /* 60 Hz */

#else

    /* You can generate these timings from your XF86Config file using

       the 'modeline2fb' perl script included with the fbset package.

       These timings were generated for Matrox Millenium I, 15" monitor.

    */

    {  320,  200, 79440,  16, 16, 20,  4,  48, 1, 0, 2 },    /* 70 Hz */

    {  320,  240, 63492,  16, 16, 16,  4,  48, 2, 0, 2 },    /* 72 Hz */

    {  512,  384, 49603,  48, 16, 16,  1,  64, 3, 0, 0 },    /* 78 Hz */

    {  640,  400, 31746,  96, 32, 41,  1,  64, 3, 2, 0 },    /* 85 Hz */

    {  640,  480, 31746, 120, 16, 16,  1,  64, 3, 0, 0 },    /* 75 Hz */

    {  768,  576, 26101, 144, 16, 28,  6, 112, 4, 0, 0 },    /* 60 Hz */

    {  800,  600, 20000,  64, 56, 23, 37, 120, 6, 3, 0 },    /* 72 Hz */

    {  960,  720, 17686, 144, 24, 28,  8, 112, 4, 0, 0 },    /* 60 Hz */

    { 1024,  768, 13333, 144, 24, 29,  3, 136, 6, 0, 0 },    /* 70 Hz */

    { 1152,  864, 12286, 192, 32, 30,  4, 128, 4, 0, 0 },    /* 60 Hz */

    { 1280, 1024,  9369, 224, 32, 32,  4, 136, 4, 0, 0 },    /* 60 Hz */

    { 1408, 1056,  8214, 256, 40, 32,  5, 144, 5, 0, 0 },    /* 60 Hz */

    { 1600, 1200,/*?*/0, 272, 48, 32,  5, 152, 5, 0, 0 },    /* 60 Hz */

#endif

};

这两个数组与分辨率的控制相关。其中checkres用于检测MiniGUI支持的分辨率,而vesa_timings用于设置每个分辨率下的时序。用户把自己显示设备的分辨率和时序添加到这两个数组中。

编译完源码后,需要修改MiniGUI.cfg配置文件,把显示模式修改为自己设备的显示分辨率,这样就一些OK了。

你可能感兴趣的:(GUI开发)