S3C2416 WINCE6.0開機logo製作

關於開機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編譯生成即可。

看到網上很多都說在使用這種方法時會出現花屏,除了上面兩點沒有保證外,還有一個可能的原因是最容易被忽視的:

不同的工具轉換後的數組形式不一樣,可能是char數組,可能是unsigned short數組,也可能是unsigned int數組,當將這些數據填充到顯示緩存的時候,有一個高地位的問題。比如如下代碼:
unsigned short* pFB = (unsigned short *)EBOOT_FRAMEBUFFER_UA_START;
*pFB = 0x001F;這種情況下,存儲到顯示緩存中的第一個字節其實是0x1F,而並不是0x00,不管是採用for循環填充還是用memcpy填充,都存在一個圖片數據與顯示緩存的匹配問題,如果不匹配,就會發生大家所說的花屏現象。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章