关于开机wince6.0下开机logo实现一般有两种方法:

方法一是将图片转换成数组,编译进eboot中,但是这种会导致最终生成的eboot.bin太大,超过529k,不能使用,但是可以加入一种压缩手段,将高分辨的图片等比缩放,然后在填充LCD缓冲区时,在等比放大即可,但是缩放后的图片会不是很清晰,而且后期的Logo更新也变的很麻烦。。

方法二是将bmp的图片转换为bin文件,烧写到Nandflash的某个固定地址,eboot运行时读取该地址的内容,放到LCD的显存里。

由于第一种方式实现起来比较简单,这里就就基于友坚的2416开发板针对第一种方法介绍一下。

在Eboot中需要对LCD进行初始化工作即在函数Bootloader\Eboot.Whimory的main.c中由InitDisplay函数来实现,开机Logo的设置就在这个函数里面。首先需要保证LCD的初始化正确,最好可以在eboot线刷出一种颜色了,友坚的开发板是先刷新成了蓝色,这一步就可以省略,然而我用的群创的AT070TN83屏,在刷一种颜色时没有问题,但是刷图片时,就会出现很剧烈的抖动。最后检测是在初始化时,LCD的频率没有设置正确,即clkval不正确。

然后找一个下载工具,推荐一个 ,下载下来,解压,打开\bmp2c\bin\Debug,然后双击bmp2c.exe ,选择需要转换的图片,已经C文件的保存路径,最后记得输入图片的高度和宽度。

打开转换后的文件logo.c,将数组的内容拷贝到DisplaySample_320_240.h中的prayer16bpp[]数组中。保存退出。

然后在打开main.c,找到

s2416INTR->INTSUBMSK |= (0xf << IRQ_SUB_LCD1);    // MASK all LCD Sub Interrupt
if(  LCD_MODULE_TYPE ==       LCD_MODULE_UT35A){
          memcpy((void *)IMAGE_FRAMEBUFFER_UA_BASE, prayer16bpp, LCD_ARRAY_SIZE_TFT_16BIT);
 }
 else //if(LCD_MODULE_TYPE == LCD_MODULE_UT43A)
  {
   
        pFB = (unsigned short *)IMAGE_FRAMEBUFFER_UA_BASE;        for (i=0; i<LCD_WIDTH*LCD_HEIGHT; i++)
             *pFB++ = 0x001F;//0x001F        // 开机显示为蓝色
             //*pFB++ = 0x5F00; }
将上面红色代码改为
   PWORD pWord = (PWORD)prayer16bpp;
    PWORD pFB = (PWORD)IMAGE_FRAMEBUFFER_UA_BASE;
   for (i=0; i<400*240; i++)
   {
    pFB[4*i - 2 * (i % 400)]= pWord[i];
    pFB[4*i - 2 * (i % 400)+1] = pWord[i];
    pFB[4*i - 2 * (i % 400)+400*2] = pWord[i];
    pFB[4*i - 2 * (i % 400)+1+400*2] = pWord[i];
   }注意是,图片等比例缩放2倍,如果缩放倍数太大,for循环中的内容需要改变。最后编译,下载eboot.bin到开发板中,开机即可看到logo。修改驱动时,可以不用全部重新编译BSP包,只需单独编译Bootloader即可,在左边的Solution Explorer中找到Bootloader目录,点击右键,选择rebuild.然后在选择build菜单栏下的make run-time imag编译生成即可。
看到网上很多都说在使用这种方法时会出现花屏,除了上面两点没有保证外,还有一个可能的原因是最容易被忽视的:
 
不同的工具转换后的数组形式不一样,可能是char数组,可能是unsigned short数组,也可能是unsigned int数组,当将这些数据填充到显示缓存的时候,有一个高地位的问题。比如如下代码:
 
unsigned short* pFB = (unsigned short *)EBOOT_FRAMEBUFFER_UA_START;


*pFB = 0x001F;这种情况下,存储到显示缓存中的第一个字节其实是0x1F,而并不是0x00,不管是采用for循环填充还是用memcpy填充,都存在一个图片数据与显示缓存的匹配问题,如果不匹配,就会发生大家所说的花屏现象。