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的圖片,轉換、編譯、燒入,成功 。。。
總結
以上是生活随笔為你收集整理的Wince6 Eboot中加入开机画面的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android画布demo,Androi
- 下一篇: SIP协议学习1