Win ce6 Eboot 中加入开机画面

来源:互联网 发布:java对接支付宝 编辑:程序博客网 时间:2024/05/23 00:09


昨天研究了一下 wince开机时加入个性化的画面,折腾了一上午,不是花屏就是 CE起不来……终于搞定,分享一下经验吧。。。

Wince加入开机画面方法一般有以下两种:

1、  在文件中下定义一个常量大数组,几百 K,如 const USHORT ScreenBitmap[] ,在显示图片的地方利用 for循坏把数组都拷贝到相应的 buffer中。

2、  把图片数据存放到 Flash的某位置,启动时使用特定方法把它读取。

第二种方法实现可能有一定的难度,没研究过,如有实现的,请告之俺。

第一种方法在启动的过程中,直接往显卡的 Framebuffer里面写数据。这个工作一般在 Eboot 里面做,如果在 OS 启动的时候一般就太晚了,如果不加入人为的延时,启动画面刚一显示,就到了 OS 画面了,看不到效果。在 Eboot 中,有个 InitDisplay()
static void InitDisplay(void)
{
    ……    
    // Display a bitmap image on the LCD...
     //memcpy((void *)IMAGE_FRAMEBUFFER_UA_BASE, ScreenBitmap, LCD_ARRAY_SIZE_TFT_16BIT);    // for WindowsCE logo
     for(i = 0; i < 160 * 120; i++)
     {
          PWORD pWord = (PWORD)ScreenBitmap;
          PWORD pFrmBuf = (PWORD)IMAGE_FRAMEBUFFER_UA_BASE;
       
          pFrmBuf[4 * i - 2 * (i % 160)] = pWord[i];
          pFrmBuf[4 * i - 2 * (i % 160) + 1] = pWord[i];
          pFrmBuf[4 * i - 2 * (i % 160) + 160 * 2] = pWord[i];
          pFrmBuf[4 * i - 2 * (i % 160) + 1 + 160 * 2] = pWord[i];
     }
}

注 意到 memcpy((void *)IMAGE_FRAMEBUFFER_UA_BASE, ScreenBitmap, LCD_ARRAY_SIZE_TFT_16BIT); 显示启动画面其实就这一句,直接调用memcpy 函数,把 ScreenBitmap数组中的图像数据复制到 IMAGE_FRAMEBUFFER_UA_BASE 这个地址。这个其实就是直接往显卡缓冲区里面填东西了。 ScreenBitmap就是一个常量数组,可以从网上找一些相关工具来生成,也可以自己写个工具,把一张 BMP转成 16进制的数组。

到这里,基本上就实现了开机画面,但有的会存在一些问题。

我的设备是分辨率是 320*240 ,把一张320*240 的BMP 图片转换成数组后,有500 多KB ,boot loader 没有这么大的空间( 当然这个是可以修改的) ,再加上生成的Eboot.nb0 也很大,通过并口烧入需要很长时间。有什么办法可以解决呢?……再笨你也能想到压缩,是的,压缩烧入,运行的时候再解压。在网上搜索了一下,有的是使用插值算法。弄一张小图片,把它插值到320 x 240 。使用别人的一个算法,放大4 倍,一个点变四个点。代码也复制过来:

for(i = 0; i < 160 * 120; i++)
     {
          PWORD pWord = (PWORD)ScreenBitmap;
          PWORD pFrmBuf = (PWORD)IMAGE_FRAMEBUFFER_UA_BASE;
       
          pFrmBuf[4 * i - 2 * (i % 160)] = pWord[i];
          pFrmBuf[4 * i - 2 * (i % 160) + 1] = pWord[i];
          pFrmBuf[4 * i - 2 * (i % 160) + 160 * 2] = pWord[i];
          pFrmBuf[4 * i - 2 * (i % 160) + 1 + 160 * 2] = pWord[i];
     }

自己再准备一张160*120的图片,转换、编译、烧入,成功 。。。

原创粉丝点击