關於開機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不正確。
然後找一個下載工具,推薦一個http://download.csdn.net/detail/ANTHONE_LIGANG/3650479 ,下載下來,解壓,打開\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編譯生成即可。
看到網上很多都說在使用這種方法時會出現花屏,除了上面兩點沒有保證外,還有一個可能的原因是最容易被忽視的:
*pFB = 0x001F;這種情況下,存儲到顯示緩存中的第一個字節其實是0x1F,而並不是0x00,不管是採用for循環填充還是用memcpy填充,都存在一個圖片數據與顯示緩存的匹配問題,如果不匹配,就會發生大家所說的花屏現象。