从今年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
{
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);
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;
*pFB = 0x001F;
这种情况下,存储到显示缓存中的第一个字节其实是0x1F,而并不是0x00,不管是采用for循环填充还是用memcpy填充,都存在一个图片数据与显示缓存的匹配问题,如果不匹配,就会发生大家所说的花屏现象。
好了,先到这里,改天上方法二。
本文转自jazka 51CTO博客,原文链接:http://blog.51cto.com/jazka/661180,如需转载请自行联系原作者