生活随笔
收集整理的這篇文章主要介紹了
WinCE开机Logo的实现(USB下载图片到nandflash)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
WinCE開機啟動Logo使用Eboot讀取NandFlash中的圖片數據,然后顯示的方式。對于開機logo的方式網友http://jazka.blog.51cto.com/809003/664131有了詳細的描述。但是自己在運用的時候遇到了一些問題。現在重新進行整理。
在loader.h中增加保留的block提供給圖片用。
[cpp]?view plaincopy
#define?LOGO_BLOCK??????????????8?? #define?LOGO_SECTOR_SIZE????????????FILE_TO_SECTOR_SIZE(LOGO_RAM_IMAGE_SIZE)?? #define?LOGO_BLOCK_SIZE?????????????8//SECTOR_TO_BLOCK(LOGO_SECTOR_SIZE)?? #define?LOGO_SECTOR?????????????BLOCK_TO_SECTOR(LOGO_BLOCK)?? ? ? ? ? ?? #define?RESERVED_BOOT_BLOCKS????????????(NBOOT_BLOCK_SIZE?+?TOC_BLOCK_SIZE?+?EBOOT_BLOCK_SIZE?+?LOGO_BLOCK_SIZE?)??
main.c中的MainMenu函數中增加通過USB下載圖片的菜單
[cpp]?view plaincopy
case?'G':?? case?'g':?? ????????????????? {?? ????DWORD?dwDWNAddress;?? ????DWORD?dwDWNlength;?? ????DWORD?i;?? ????BYTE?Temp[10];???? ????DWORD?dwStartAddr?=?0;??? ????LPBYTE?lpDes?=?NULL;?????? ????lpDes?=?(LPBYTE)(FILE_CACHE_START);??? ????? ????????OALMSG(TRUE,?(TEXT("Please?send?the?Logo?through?USB.\r\n")));??? ????????g_bUSBDownload?=?TRUE;????? <span?style="white-space:pre">??</span>if?(!OEMReadData?(sizeof?(DWORD),?(LPBYTE)?&dwDWNAddress)?||?? ????????????!OEMReadData?(sizeof?(DWORD),?(LPBYTE)?&dwDWNAddress)?||?? ????????????!OEMReadData?(sizeof?(DWORD),?(LPBYTE)?&dwDWNlength))?? ????{?? ????<span?style="white-space:pre">??</span>KITLOutputDebugString?("\r\nUnable?to?read?add?+?size?message.\r\n");?? ????????return?(FALSE);?? ????}?? ????else?? ????{?? ????<span?style="white-space:pre">??</span>KITLOutputDebugString?("\rAddr:?0x%x?;?Size:?0x%x\n",dwDWNAddress,dwDWNlength);?? ????}?? ?? ????????if?(!OEMReadData(640*480*2,?lpDes))?? ????????{??? ????????<span?style="white-space:pre">??</span>OALMSG(TRUE,?(TEXT("Error?when?sending?the?Logo?through?USB.\r\n")));??? ????????????????SpinForever();??? ????????}??? ????????for(?i=0;?i<20;?i++)?? ??????????????<span?style="white-space:pre">????</span>OALMSG(0,?(TEXT("->0x%x\r\n"),*(lpDes+(640*480*2-10)+i)));?? ?? ????????dwStartAddr?=?(DWORD)lpDes;??? ?? ????????if?(!WriteLogoToBootMedia(dwStartAddr,?(DWORD)(640*480*2),?dwStartAddr))??? ????????{??? ????????<span?style="white-space:pre">??</span>OALMSG(TRUE,?(TEXT("Error?when?WriteLogoToBootMedia.\r\n")));??? ????????????????SpinForever();??? ????????}??? ????break;?? }??
在OEMPlatformInit()函數初始化LCD完成之后進行讀取NandFlash中的數據進行顯示,EXT_Logo()函數在nand.cpp中
[cpp]?view plaincopy
void????EXT_Logo(void)?? {?? ????SectorInfo?si;?? ????DWORD?i,j,k;?? ????UINT32?start_addr?=?0x100000;?? ?? ????k?=?????start_addr?>>?9;?? ?? ????for?(i=0;i<2048;i++)?? ????{?????? ????????j?=?i?+?k;?? ????????FMD_ReadSector(j,?(PUCHAR)(IMAGE_FRAMEBUFFER_UA_BASE_eboot+(512*i)),?&si,?1);??? ????}?? ?? }??
在Nand.cpp中添加寫圖片數據到NandFlash的函數WriteLogoToBootMedia()
[cpp]?view plaincopy
BOOL?WriteLogoToBootMedia(DWORD?dwImageStart,?DWORD?dwImageLength,?DWORD?dwLaunchAddr)??? {??? ??DWORD?dwBlock,dwNumBlocks;??? ??LPBYTE?pbBuffer;??? ??SectorInfo?si;??? ?? ??OALMSG(TRUE,?(TEXT("+WriteLogoToBootMedia\r\n")));??? ?? ??dwBlock?=?LOGO_BLOCK;??? ??pbBuffer?=?(LPBYTE)dwImageStart;??? ?? ??OALMSG(0,?(TEXT("^^^^^^^^?0x%x?^^^^^^^^\r\n"),?(unsigned?short?*)pbBuffer));??? ?? ??dwNumBlocks?=?(dwImageLength/(g_FlashInfo.wDataBytesPerSector*g_FlashInfo.wSectorsPerBlock))?+?????? ?????????????????????????????????????????????????(dwImageLength%(g_FlashInfo.wDataBytesPerSector*g_FlashInfo.wSectorsPerBlock)???1:?0);??? ?? ??OALMSG(0,?(TEXT("dwImageLength?=?0x%x?\r\n"),?dwImageLength));??? ??OALMSG(0,?(TEXT("dwNumBlocks?=?0x%x?\r\n"),?dwNumBlocks));???? ?? ??while?(dwNumBlocks--)??? ??{??? ????OALMSG(0,?(TEXT("dwBlock(0x%x)?X?"),?dwBlock));??? ????OALMSG(0,?(TEXT("g_FlashInfo.wSectorsPerBlock(0x%x)"),?g_FlashInfo.wSectorsPerBlock));??? ????OALMSG(0,?(TEXT("?=?0x%x?\r\n"),?dwBlock*g_FlashInfo.wSectorsPerBlock));??? ?? ????FMD_ReadSector(dwBlock*g_FlashInfo.wSectorsPerBlock,?NULL,?&si,?1);??? ?? ?????? ?????? ????if?((si.bBadBlock?==?0x0)?&&?(si.bOEMReserved?!=3?))??? ????{??? ??????++dwBlock;??? ??????++dwNumBlocks;?????????????????? ??????continue;??? ????}??? ?? ????if?(!ReadBlock(dwBlock,?NULL,?g_pSectorInfoBuf))??? ????{??? ??????OALMSG(OAL_ERROR,?(TEXT("WriteData:?failed?to?read?block?(0x%x).\r\n"),?dwBlock));??? ??????return(FALSE);??? ????}??? ?? ????if?(!FMD_EraseBlock(dwBlock))??? ????{??? ??????OALMSG(OAL_ERROR,?(TEXT("WriteData:?failed?to?erase?block?(0x%x).\r\n"),?dwBlock));??? ??????return?FALSE;??? ????}??? ?? ????if?(!WriteBlock(dwBlock,?pbBuffer,?g_pSectorInfoBuf))??? ????{?<pre?name="code"?class="cpp">if?(!OEMReadData?(sizeof?(DWORD),?(LPBYTE)?&dwDWNAddress)?||?? ????????????????????????!OEMReadData?(sizeof?(DWORD),?(LPBYTE)?&dwDWNAddress)?||?? ????????????????????????!OEMReadData?(sizeof?(DWORD),?(LPBYTE)?&dwDWNlength))?? ????????????????????{?? ????????????????????????KITLOutputDebugString?("\r\nUnable?to?read?add?+?size?message.\r\n");?? ????????????????????????return?(FALSE);?? ????????????????????}?? ????????????????????else?? ????????????????????{?? ????????????????????????KITLOutputDebugString?("\rAddr:?0x%x?;?Size:?0x%x\n",dwDWNAddress,dwDWNlength);?? ????????????????????}</pre><br>?? OALMSG(OAL_ERROR,?(TEXT("WriteData:?failed?to?write?block?(0x%x).\r\n"),?dwBlock));?return(FALSE);?}?++dwBlock;?pbBuffer?+=?g_FlashInfo.dwBytesPerBlock;?OALMSG(0,?(TEXT("dwBytesPerBlock?:?%d\r\n"),?g_FlashInfo.dwBytesPerBlock));?}?OALMSG(1,?(TEXT("?DownLoading?? ?Logo?success!\r\n")));?return?TRUE;?}<p></p>?? <pre></pre>?? <br>?? <br>?? 對于圖片提取可以直接寫入到NandFlash格式的數據使用Image2LCD這個軟件選擇16位彩色,RGB565生成BIN文件。下載地址<a?href="http://download.csdn.net/detail/qq236106303/4371268">http://download.csdn.net/detail/qq236106303/4371268</a>?? <p></p>?? <p><br>?? </p>?? <p>開始使用USB下載圖片時候,遇到花屏的問題,使用H-JTAG下載上面生成的bin格式的圖片。能夠正常顯示。因此確定是USB下載有問題。而顯示函數和圖片格式已經正確。但是HJTAG并口下載速度太慢,不適合生產使用。所以找了下原因。?發現時因為DNW通過USB下載的時候會自動在我們選擇的文件之前加上頭信息。因此在程序mainMenu中,我使用了</p><pre?name="code"?class="cpp">if?(!OEMReadData?(sizeof?(DWORD),?(LPBYTE)?&dwDWNAddress)?||?? ????????????????????????!OEMReadData?(sizeof?(DWORD),?(LPBYTE)?&dwDWNAddress)?||?? ????????????????????????!OEMReadData?(sizeof?(DWORD),?(LPBYTE)?&dwDWNlength))?? ????????????????????{?? ????????????????????????KITLOutputDebugString?("\r\nUnable?to?read?add?+?size?message.\r\n");?? ????????????????????????return?(FALSE);?? ????????????????????}?? ????????????????????else?? ????????????????????{?? ????????????????????????KITLOutputDebugString?("\rAddr:?0x%x?;?Size:?0x%x\n",dwDWNAddress,dwDWNlength);?? ????????????????????}</pre>先讀取DNW強加的非圖片的數據,之后沒有出現花屏的現象。但是對于DNW的源碼沒有研究,所以也不是特別確定,幸虧問題可以解決。?調試的時候可以采用打印SDRAM中的數據的方法進行調試,因為程序中指定的下載到SDRAM的地址是FILE_CACHE_START這個地址。<p></p>?? <p><br>?? </p>?? <p>下載完成logo以后,選擇菜單馬上進行下載NK.BIN文件,發現出現錯誤,說BIN文件的格式不支持。以為下載內核BIN文件,會根據開始7個字節的數據判斷文件時Eboot還是nk。打印出來的信息看到開始的幾個字節和NK,BIN里面的數據出現了偏移。因此也懷疑是DNW搞的鬼,最后在blcommon.c的DownloadImage函數中修改</p>?? <p></p><pre?name="code"?class="cpp">if?(!OEMReadData?(2*sizeof?(UCHAR),?(LPBYTE)?&dwDWNAddress)?||????? ????????!OEMReadData?(sizeof?(DWORD),?(LPBYTE)?&dwDWNAddress)?||?? ????????!OEMReadData?(sizeof?(DWORD),?(LPBYTE)?&dwDWNlength))?? ????{?? ????????????KITLOutputDebugString?("\r\nUnable?to?read?add?+?size?message.\r\n");?? ????????????return?(FALSE);?? ?????}?? ????else?? ????{?? ????????????KITLOutputDebugString?("\rAddr:?0x%x?;?Size:?0x%x\n",dwDWNAddress,dwDWNlength);?? ????}?? </pre><p></p>?? <p><br>?? </p>?? <span?style="white-space:pre"></span>通過上面的修改可以順利的使用USB先下載LOGO.BIN然后再下載NK.BIN。<br>?? <br>?? <p><br>?? </p>?? ?????? ????????<div?style="padding-top:20px">??????????? ????????????<p?style="font-size:12px;">版權聲明:本文為博主原創文章,未經博主允許不得轉載。</p> ?
總結
以上是生活随笔為你收集整理的WinCE开机Logo的实现(USB下载图片到nandflash)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。