Wince6 Eboot中加入开机画面
Wince6 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的图片,转换、编译、烧入,成功 。。。