日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

WinCE开机Logo的实现(USB下载图片到nandflash)

發布時間:2025/4/16 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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?CONFIG_BLOCK????????????16?
  • #define??CONFIG_BLOCK_SIZE??????1?
  • #define??CONFIG_SECTOR??????????BLOCK_TO_SECTOR(CONFIG_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));?//?600k?=?640?*?480?*?2??
  • ??OALMSG(0,?(TEXT("dwNumBlocks?=?0x%x?\r\n"),?dwNumBlocks));??//?????5?=?600?/128??
  • ??
  • ??while?(dwNumBlocks--)???
  • ??{???
  • ????OALMSG(0,?(TEXT("dwBlock(0x%x)?X?"),?dwBlock));?//?8,?9,?a,?b,?c??
  • ????OALMSG(0,?(TEXT("g_FlashInfo.wSectorsPerBlock(0x%x)"),?g_FlashInfo.wSectorsPerBlock));?//?64??
  • ????OALMSG(0,?(TEXT("?=?0x%x?\r\n"),?dwBlock*g_FlashInfo.wSectorsPerBlock));???
  • ??
  • ????FMD_ReadSector(dwBlock*g_FlashInfo.wSectorsPerBlock,?NULL,?&si,?1);???
  • ??
  • ????//?Stepldr?&?Eboot?image?in?nand?flash???
  • ????//?block?mark?as?BLOCK_STATUS_RESERVED?&?BLOCK_STATUS_READONLY?&?BLOCK_STATUS_BAD???
  • ????if?((si.bBadBlock?==?0x0)?&&?(si.bOEMReserved?!=3?))???
  • ????{???
  • ??????++dwBlock;???
  • ??????++dwNumBlocks;????????????????//?Compensate?for?fact?that?we?didn't?write?any?blocks.???
  • ??????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)?||???//根據打印調試出來看,出現的2個字節偏移是因為在這里讀取了DWORD,所以改成2個char??
  • ????????!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)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。