开机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;
*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填充,都存在一个图片数
据与显示缓存的匹配问题,如果不匹配,就会发生大家所说的花屏现象。
完