WinCE6.0 修改开机Logo方法集锦(一)

    从今年 4 月份开始接触 WinCE ,本来计划坚持写相关的博客,记录自己 WinCE 的学习历程,但整个 8 月份就断层了,这里面有客观原因也有主观原因,工作上的事不顺心啊。项目上需要写 WinCE 上的应用软件开发,无奈,只能把精力从底层驱动方面撤出来了。其实可以坚持非工作时间学习的,怪自己懒啊。这次重新拾起,一定要坚持下去了。
       WinCE 终端开发,一般都会涉及到开机 Logo 的工作,单位项目也不例外,正好借此机会,好好研究一下。网络上关于这个问题的帖子不少,主要集中在 csdn 论坛上,思路也都比较清楚,不过就是不够细,所以自己也费了些时间研究。顺便把网上提到的所有方法都尝试汇总一下,于是便有了这个系列,目前只测试了两种方法,所以先记录下来,后续不断完善其他方法。
 
    为了尊重前辈和他人的劳动成果,在博文中会将引用的内容给出声明和链接。
       下面进入主题,开机 Logo 的修改方法主要有两种:
       方法一 :定义一个头文件,里面包含一个很大的数组,都是图片的相关数据,一起打包到 Eboot bin 文件中。这种方法优点是简单直接,缺点是图片不能太大,否则会导致 Eboot 太大,而且后期的 Logo 更新也变的很麻烦。
       方法二 :将图片的相关数据烧写到 Nand Flash 的某个固定地址, Eboot 初始化 LCD 时从该地址读取数据,放入显示缓存里面就可以了。这种方法灵活,可以支持比较大的图片,而且后期 Logo 更新比较容易,缺点就是比方法一复杂,需要改动 Eboot 的源代码。
 
       今天先给出方法一的详细实现方案,实验平台: WinCE6.0+Android6410 +4.3 CLD
       Eboot 中需要对 LCD 进行初始化工作(虽然不是必须的,但目前大多都这样做),即在函数 OEMPlatformInit 中由 InitializeDisplay 函数来实现,开机 Logo 的设置就在这个函数里面。(如果不清楚请参看博文 http://jazka.blog.51cto.com/809003/603457
       如果只是想简单的设置 Logo 为单色的话,直接使用下面代码就可以了,是 4.3 寸屏下 RGB565 格式的填充方法。
#elif        (LCD_BPP == 16)
        {
                int i;
                unsigned short *pFB;
                pFB = (unsigned short *)EBOOT_FRAMEBUFFER_UA_START;

                for (i=0; i<LCD_WIDTH*LCD_HEIGHT; i++)
                        *pFB++ = 0x0000;//0x001F;                // Blue
       如果想设置为自己的图片,那么就需要对图片进行转换了,那么就设计到转换工具的事情了。网上有很多转换工具,也可以自己写一个应用程序完成转换,但是需要保证以下几点:
       第一,根据工具的不同选择相应的图片,有些工具是针对特定图片设计的数据转换,比如有点只能处理 BMP 格式的图片,有点只能处理 24 位色的等等,会有很多限制;
       第二,转换完成以后,查看转换后的数组内容,字节是否足够,比如 LCD 480*272 的分辨率,需要的数据便是 480*272*2 个字节,如果转换后的数据量不匹配,显示出来的效果肯定是不正确的。
       假设图片转换成的数组名称为 const unsigned int InitialImage_rgb16_480x272[] ,那么只需要执行如下操作即可:
#if(SMDK6410_LCD_MODULE == LCD_MODULE_UT_LCD43D)
        memcpy((void *)EBOOT_FRAMEBUFFER_UA_START, (void *)InitialImage_rgb16_480x272, 480*272*2);
       当然也可以采用上面那种方法,采用 for 循环,将数组内容以一定大小,一个一个的填充到显示缓存当中。
 
       看到网上很多都说在使用这种方法时会出现花屏,除了上面两点没有保证外,还有一个可能的原因是最容易被忽视的:
       不同的工具转换后的数组形式不一样,可能是 char 数组,可能是 unsigned short 数组,也可能是 unsigned int 数组,当将这些数据填充到显示缓存的时候,有一个高地位的问题。比如如下代码:
unsigned short* pFB = (unsigned short *)EBOOT_FRAMEBUFFER_UA_START;
*pFB = 0x001F;
       这种情况下,存储到显示缓存中的第一个字节其实是 0x 1F ,而并不是 0x00 ,不管是采用 for 循环填充还是用 memcpy 填充,都存在一个图片数据与显示缓存的匹配问题,如果不匹配,就会发生大家所说的花屏现象。
      
       好了,先到这里,改天上方法二。

你可能感兴趣的:(休闲,花屏,WinCE6.0,EBoot,修改开机Logo)