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>  
  • 相关阅读:
    Android开源库
    银行卡的数字检測
    hdu4941 Magical Forest
    android之检測是否有网络
    在Oracle数据库中使用NFS,怎样调优?
    centos+nginx+php-fpm+php include fastcgi_params php页面能訪问但空白,被fastcgi_params与fastcgi.conf害慘了
    漫谈反射
    Android 四大组件学习之BroadcastReceiver二
    【LeetCode】two num 利用comparable接口 对对象进行排序
    扩展功能==继承?
  • 原文地址:https://www.cnblogs.com/liang123/p/6325349.html
Copyright © 2011-2022 走看看