开机Logo的修改方法主要有两种:方法一:定义一个头文件,里面包含一个很大的数组,都是图片的相关数据,一起打包到Eboot的bin文件中。这种方法优点是简单直接,缺点是图片不能太大,否则会导致Eboot太大,而且后期的Logo更新也变的很麻烦。方法二:将图片的相关数据烧写到Nand Flash的某个固定地址,Eboot初始化LCD时从该地址读取数据,放入显示缓存里面就可以了。这种方法灵活,可以支持比较大的图片,而且后期Logo更新比较容易,缺点就是比方法一复杂,需要改动Eboot的源代码。 今天先给出方法一的详细实现方案,实验平台:WinCE6.0+Android6410 +4.3寸CLD。在Eboot中需要对LCD进行初始化工作(虽然不是必须的,但目前大多都这样做),即在函数OEMPlatformInit中由InitializeDisplay函数来实现,开机Logo的设置就在这个函数里面。(如果不清楚请参看博文)如果只是想简单的设置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; *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; 这种情况下,存储到显示缓存中的第一个字节其实是0x1F,而并不是0x00,不管是采用for循环填充还是用memcpy填充,都存在一个图片数
据与显示缓存的匹配问题,如果不匹配,就会发生大家所说的花屏现象。
完
但要相信真诚的爱情,对爱情永远怀有单纯的向往。