zoukankan      html  css  js  c++  java
  • WinCE开机Logo的实现(USB下载图片到nandflash)

    WinCE开机启动Logo使用Eboot读取NandFlash中的图片数据,然后显示的方式。对于开机logo的方式网友http://jazka.blog.51cto.com/809003/664131有了详细的描述。但是自己在运用的时候遇到了一些问题。现在重新进行整理。

    在loader.h中增加保留的block提供给图片用。

    1. #define LOGO_BLOCK              8  
    2. #define LOGO_SECTOR_SIZE            FILE_TO_SECTOR_SIZE(LOGO_RAM_IMAGE_SIZE)  
    3. #define LOGO_BLOCK_SIZE             8//SECTOR_TO_BLOCK(LOGO_SECTOR_SIZE)  
    4. #define LOGO_SECTOR             BLOCK_TO_SECTOR(LOGO_BLOCK)  
    5. /* 
    6. #define CONFIG_BLOCK            16 
    7. #define  CONFIG_BLOCK_SIZE      1 
    8. #define  CONFIG_SECTOR          BLOCK_TO_SECTOR(CONFIG_BLOCK) 
    9. */  
    10. #define RESERVED_BOOT_BLOCKS            (NBOOT_BLOCK_SIZE + TOC_BLOCK_SIZE + EBOOT_BLOCK_SIZE + LOGO_BLOCK_SIZE )  

    main.c中的MainMenu函数中增加通过USB下载图片的菜单

    1. case 'G':  
    2. case 'g':  
    3.                  
    4. {  
    5.     DWORD dwDWNAddress;  
    6.     DWORD dwDWNlength;  
    7.     DWORD i;  
    8.     BYTE Temp[10];    
    9.     DWORD dwStartAddr = 0;   
    10.     LPBYTE lpDes = NULL;      
    11.     lpDes = (LPBYTE)(FILE_CACHE_START);   
    12.      
    13.         OALMSG(TRUE, (TEXT("Please send the Logo through USB. ")));   
    14.         g_bUSBDownload = TRUE;     
    15. <span style="white-space:pre">  </span>if (!OEMReadData (sizeof (DWORD), (LPBYTE) &dwDWNAddress) ||  
    16.             !OEMReadData (sizeof (DWORD), (LPBYTE) &dwDWNAddress) ||  
    17.             !OEMReadData (sizeof (DWORD), (LPBYTE) &dwDWNlength))  
    18.     {  
    19.     <span style="white-space:pre">  </span>KITLOutputDebugString (" Unable to read add + size message. ");  
    20.         return (FALSE);  
    21.     }  
    22.     else  
    23.     {  
    24.     <span style="white-space:pre">  </span>KITLOutputDebugString (" Addr: 0x%x ; Size: 0x%x ",dwDWNAddress,dwDWNlength);  
    25.     }  
    26.   
    27.         if (!OEMReadData(640*480*2, lpDes))  
    28.         {   
    29.         <span style="white-space:pre">  </span>OALMSG(TRUE, (TEXT("Error when sending the Logo through USB. ")));   
    30.                 SpinForever();   
    31.         }   
    32.         for( i=0; i<20; i++)  
    33.               <span style="white-space:pre">    </span>OALMSG(0, (TEXT("->0x%x "),*(lpDes+(640*480*2-10)+i)));  
    34.   
    35.         dwStartAddr = (DWORD)lpDes;   
    36.   
    37.         if (!WriteLogoToBootMedia(dwStartAddr, (DWORD)(640*480*2), dwStartAddr))   
    38.         {   
    39.         <span style="white-space:pre">  </span>OALMSG(TRUE, (TEXT("Error when WriteLogoToBootMedia. ")));   
    40.                 SpinForever();   
    41.         }   
    42.     break;  
    43. }  
    在OEMPlatformInit()函数初始化LCD完成之后进行读取NandFlash中的数据进行显示,EXT_Logo()函数在nand.cpp中

    1. void    EXT_Logo(void)  
    2. {  
    3.     SectorInfo si;  
    4.     DWORD i,j,k;  
    5.     UINT32 start_addr = 0x100000;  
    6.   
    7.     k =     start_addr >> 9;  
    8.   
    9.     for (i=0;i<2048;i++)  
    10.     {      
    11.         j = i + k;  
    12.         FMD_ReadSector(j, (PUCHAR)(IMAGE_FRAMEBUFFER_UA_BASE_eboot+(512*i)), &si, 1);   
    13.     }  
    14.   
    15. }  


    在Nand.cpp中添加写图片数据到NandFlash的函数WriteLogoToBootMedia()

    1. BOOL WriteLogoToBootMedia(DWORD dwImageStart, DWORD dwImageLength, DWORD dwLaunchAddr)   
    2. {   
    3.   DWORD dwBlock,dwNumBlocks;   
    4.   LPBYTE pbBuffer;   
    5.   SectorInfo si;   
    6.   
    7.   OALMSG(TRUE, (TEXT("+WriteLogoToBootMedia ")));   
    8.   
    9.   dwBlock = LOGO_BLOCK;   
    10.   pbBuffer = (LPBYTE)dwImageStart;   
    11.   
    12.   OALMSG(0, (TEXT("^^^^^^^^ 0x%x ^^^^^^^^ "), (unsigned short *)pbBuffer));   
    13.   
    14.   dwNumBlocks = (dwImageLength/(g_FlashInfo.wDataBytesPerSector*g_FlashInfo.wSectorsPerBlock)) +      
    15.                                                  (dwImageLength%(g_FlashInfo.wDataBytesPerSector*g_FlashInfo.wSectorsPerBlock) ? 1: 0);   
    16.   
    17.   OALMSG(0, (TEXT("dwImageLength = 0x%x  "), dwImageLength)); // 600k = 640 * 480 * 2  
    18.   OALMSG(0, (TEXT("dwNumBlocks = 0x%x  "), dwNumBlocks));  //     5 = 600 /128  
    19.   
    20.   while (dwNumBlocks--)   
    21.   {   
    22.     OALMSG(0, (TEXT("dwBlock(0x%x) X "), dwBlock)); // 8, 9, a, b, c  
    23.     OALMSG(0, (TEXT("g_FlashInfo.wSectorsPerBlock(0x%x)"), g_FlashInfo.wSectorsPerBlock)); // 64  
    24.     OALMSG(0, (TEXT(" = 0x%x  "), dwBlock*g_FlashInfo.wSectorsPerBlock));   
    25.   
    26.     FMD_ReadSector(dwBlock*g_FlashInfo.wSectorsPerBlock, NULL, &si, 1);   
    27.   
    28.     // Stepldr & Eboot image in nand flash   
    29.     // block mark as BLOCK_STATUS_RESERVED & BLOCK_STATUS_READONLY & BLOCK_STATUS_BAD   
    30.     if ((si.bBadBlock == 0x0) && (si.bOEMReserved !=3 ))   
    31.     {   
    32.       ++dwBlock;   
    33.       ++dwNumBlocks;                // Compensate for fact that we didn't write any blocks.   
    34.       continue;   
    35.     }   
    36.   
    37.     if (!ReadBlock(dwBlock, NULL, g_pSectorInfoBuf))   
    38.     {   
    39.       OALMSG(OAL_ERROR, (TEXT("WriteData: failed to read block (0x%x). "), dwBlock));   
    40.       return(FALSE);   
    41.     }   
    42.   
    43.     if (!FMD_EraseBlock(dwBlock))   
    44.     {   
    45.       OALMSG(OAL_ERROR, (TEXT("WriteData: failed to erase block (0x%x). "), dwBlock));   
    46.       return FALSE;   
    47.     }   
    48.   
    49.     if (!WriteBlock(dwBlock, pbBuffer, g_pSectorInfoBuf))   
    50.     { <pre name="code" class="cpp">if (!OEMReadData (sizeof (DWORD), (LPBYTE) &dwDWNAddress) ||  
    51.                         !OEMReadData (sizeof (DWORD), (LPBYTE) &dwDWNAddress) ||  
    52.                         !OEMReadData (sizeof (DWORD), (LPBYTE) &dwDWNlength))  
    53.                     {  
    54.                         KITLOutputDebugString (" Unable to read add + size message. ");  
    55.                         return (FALSE);  
    56.                     }  
    57.                     else  
    58.                     {  
    59.                         KITLOutputDebugString (" Addr: 0x%x ; Size: 0x%x ",dwDWNAddress,dwDWNlength);  
    60.                     }</pre><br>  
    61. OALMSG(OAL_ERROR, (TEXT("WriteData: failed to write block (0x%x). "), dwBlock)); return(FALSE); } ++dwBlock; pbBuffer += g_FlashInfo.dwBytesPerBlock; OALMSG(0, (TEXT("dwBytesPerBlock : %d "), g_FlashInfo.dwBytesPerBlock)); } OALMSG(1, (TEXT(" DownLoading  
    62.  Logo success! "))); return TRUE; }<p></p>  
    63. <pre></pre>  
    64. <br>  
    65. <br>  
    66. 对于图片提取可以直接写入到NandFlash格式的数据使用Image2LCD这个软件选择16位彩色,RGB565生成BIN文件。下载地址<a href="http://download.csdn.net/detail/qq236106303/4371268">http://download.csdn.net/detail/qq236106303/4371268</a>  
    67. <p></p>  
    68. <p><br>  
    69. </p>  
    70. <p>开始使用USB下载图片时候,遇到花屏的问题,使用H-JTAG下载上面生成的bin格式的图片。能够正常显示。因此确定是USB下载有问题。而显示函数和图片格式已经正确。但是HJTAG并口下载速度太慢,不适合生产使用。所以找了下原因。 发现时因为DNW通过USB下载的时候会自动在我们选择的文件之前加上头信息。因此在程序mainMenu中,我使用了</p><pre name="code" class="cpp">if (!OEMReadData (sizeof (DWORD), (LPBYTE) &dwDWNAddress) ||  
    71.                         !OEMReadData (sizeof (DWORD), (LPBYTE) &dwDWNAddress) ||  
    72.                         !OEMReadData (sizeof (DWORD), (LPBYTE) &dwDWNlength))  
    73.                     {  
    74.                         KITLOutputDebugString (" Unable to read add + size message. ");  
    75.                         return (FALSE);  
    76.                     }  
    77.                     else  
    78.                     {  
    79.                         KITLOutputDebugString (" Addr: 0x%x ; Size: 0x%x ",dwDWNAddress,dwDWNlength);  
    80.                     }</pre>先读取DNW强加的非图片的数据,之后没有出现花屏的现象。但是对于DNW的源码没有研究,所以也不是特别确定,幸亏问题可以解决。 调试的时候可以采用打印SDRAM中的数据的方法进行调试,因为程序中指定的下载到SDRAM的地址是FILE_CACHE_START这个地址。<p></p>  
    81. <p><br>  
    82. </p>  
    83. <p>下载完成logo以后,选择菜单马上进行下载NK.BIN文件,发现出现错误,说BIN文件的格式不支持。以为下载内核BIN文件,会根据开始7个字节的数据判断文件时Eboot还是nk。打印出来的信息看到开始的几个字节和NK,BIN里面的数据出现了偏移。因此也怀疑是DNW搞的鬼,最后在blcommon.c的DownloadImage函数中修改</p>  
    84. <p></p><pre name="code" class="cpp">if (!OEMReadData (2*sizeof (UCHAR), (LPBYTE) &dwDWNAddress) ||   //根据打印调试出来看,出现的2个字节偏移是因为在这里读取了DWORD,所以改成2个char  
    85.         !OEMReadData (sizeof (DWORD), (LPBYTE) &dwDWNAddress) ||  
    86.         !OEMReadData (sizeof (DWORD), (LPBYTE) &dwDWNlength))  
    87.     {  
    88.             KITLOutputDebugString (" Unable to read add + size message. ");  
    89.             return (FALSE);  
    90.      }  
    91.     else  
    92.     {  
    93.             KITLOutputDebugString (" Addr: 0x%x ; Size: 0x%x ",dwDWNAddress,dwDWNlength);  
    94.     }  
    95. </pre><p></p>  
    96. <p><br>  
    97. </p>  
    98. <span style="white-space:pre"></span>通过上面的修改可以顺利的使用USB先下载LOGO.BIN然后再下载NK.BIN。<br>  
    99. <br>  
    100. <p><br>  
    101. </p>  
    102.       
    103.         <div style="padding-top:20px">           
    104.             <p style="font-size:12px;">版权声明:本文为博主原创文章,未经博主允许不得转载。</p>  
  • 相关阅读:
    61. 最长不含重复字符的子字符串
    60. 礼物的最大价值 (未理解)
    59. 把数字翻译成字符串
    58. 把数组排成最小的数
    57. 数字序列中某一位的数字 (不懂)
    spring data jpa 官方文档
    idea 编译报错 源发行版 1.8 需要目标发行版 1.8
    idea maven 依赖报错 invalid classes root
    solr
    spring boot 官方文档
  • 原文地址:https://www.cnblogs.com/LoongEmbedded/p/5298259.html
Copyright © 2011-2022 走看看