Win ce6 Eboot 中加入开机画面
昨天研究了一下 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的图片,转换、编译、烧入,成功 。。。
文章原地址http://www.cnblogs.com/feishanm/archive/2009/08/02/1536753.html