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. DWORD dwDWNAddress;
  5. DWORD dwDWNlength;
  6. DWORD i;
  7. BYTE Temp[10];
  8. DWORD dwStartAddr = 0;
  9. LPBYTE lpDes = NULL;
  10. lpDes = (LPBYTE)(FILE_CACHE_START);
  11. OALMSG(TRUE, (TEXT("Please send the Logo through USB.\r\n")));
  12. g_bUSBDownload = TRUE;
  13. <span style="white-space:pre">  </span>if (!OEMReadData (sizeof (DWORD), (LPBYTE) &dwDWNAddress) ||
  14. !OEMReadData (sizeof (DWORD), (LPBYTE) &dwDWNAddress) ||
  15. !OEMReadData (sizeof (DWORD), (LPBYTE) &dwDWNlength))
  16. {
  17. <span style="white-space:pre">  </span>KITLOutputDebugString ("\r\nUnable to read add + size message.\r\n");
  18. return (FALSE);
  19. }
  20. else
  21. {
  22. <span style="white-space:pre">  </span>KITLOutputDebugString ("\rAddr: 0x%x ; Size: 0x%x\n",dwDWNAddress,dwDWNlength);
  23. }
  24. if (!OEMReadData(640*480*2, lpDes))
  25. {
  26. <span style="white-space:pre">  </span>OALMSG(TRUE, (TEXT("Error when sending the Logo through USB.\r\n")));
  27. SpinForever();
  28. }
  29. for( i=0; i<20; i++)
  30. <span style="white-space:pre">    </span>OALMSG(0, (TEXT("->0x%x\r\n"),*(lpDes+(640*480*2-10)+i)));
  31. dwStartAddr = (DWORD)lpDes;
  32. if (!WriteLogoToBootMedia(dwStartAddr, (DWORD)(640*480*2), dwStartAddr))
  33. {
  34. <span style="white-space:pre">  </span>OALMSG(TRUE, (TEXT("Error when WriteLogoToBootMedia.\r\n")));
  35. SpinForever();
  36. }
  37. break;
  38. }

在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. k =     start_addr >> 9;
  7. for (i=0;i<2048;i++)
  8. {
  9. j = i + k;
  10. FMD_ReadSector(j, (PUCHAR)(IMAGE_FRAMEBUFFER_UA_BASE_eboot+(512*i)), &si, 1);
  11. }
  12. }

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

WinCE开机Logo的实现(USB下载图片到nandflash)的更多相关文章

  1. 八、启动linux内核并修改开机logo

    1. 编译并烧写linux内核 1)先准备好内核源码包urbetter-linux2.6.28-v1.0.tgz,输入命令:tar -zxvf urbetter-linux2.6.28-v1.0.tg ...

  2. [置顶] 制作开机LOGO就是这么简单!

    转自: http://mp.weixin.qq.com/s?__biz=MzAxNTAyOTczMw==&mid=2649328522&idx=1&sn=64107695fef ...

  3. DIY固件系列教程——实现开机LOGO三屏动画的完全替换【转】

    本文转载自:http://blog.csdn.net/sdgaojian/article/details/9192433 本教程需要用到如下工具:1,7Z压缩工具2,AddCrc32效验工具3,raw ...

  4. java远程下载图片

    从别的网站复制文章的时候,要把图片下载到我们网站,再把图片地址换成我们网站的地址 <img id="mbkenHUwhWeOj9U8K6c8LlAXaes3oXit-M4SnmRvB4 ...

  5. (原)kenel开机logo的制作

    今天项目需要,需要制作一个kernel的开机logo,所以在rk3288的平台上进行测试一番. 第一步:配置kernel:选上CONFIG_LOGO_LINUX_CLUT224选项 make menu ...

  6. 因为强行关机, 而导致的fedora23 不能重新启动, 卡在开机logo那里的 修复 解决方案

    其实, fedora23的U盘live 也很好用, 很流畅, 主要还是 要用一个比较好的/快的 U盘. 这样live U盘在4GB(3.75GiB)的内存中还是较快的 原来的U盘live系统用得很卡, ...

  7. Day3-scrapy爬虫下载图片自定义名称

    学习Scrapy过程中发现用Scrapy下载图片时,总是以他们的URL的SHA1 hash值为文件名,如: 图片URL:http://www.example.com/image.jpg 它的SHA1 ...

  8. 开机logo以及两种修改开机动画方法

    Android开机画面总共有三屏 一.第一屏:开机logo 1.选张png格式的图片,在Linux任意下执行(安装工具): sudo apt-get install pnmtoplainpm 2.在所 ...

  9. 安卓开机logo和开机动画的几种实现方法

    安卓4.2可用方法2-4,第一种方法未验证. 从理论上来说,android 有4个开机启动画面. 第一个应该是U-BOOT的启动画面,有些设备为了满足按动电源即有显示,在UBOOT里加了开机画面,实现 ...

随机推荐

  1. 关于.Net Remoting 和 Web Servcie的比较

    参照文献 http://www.cnblogs.com/shinehouse/articles/3001955.html http://www.cnblogs.com/paper/archive/20 ...

  2. 夺命雷公狗---node.js---11之文件上传

    我们在做文件上传前需要用npm来安装一个插件先, 首先打开项目所在的目录,然后按住shift键然后右键鼠标进入命令行安装formidable 然后开始编写上传的静态页面: <!DOCTYPE h ...

  3. 夺命雷公狗---node.js---3commonJs 与 nodeJs的简介

    JavaScript是一个强大面向对象语言,它有很多快速高效的解释器.官方JavaScript标准定义的API是为了构建基于浏览器的应用程序.然而,并没有定于一个用于更广泛的应用程序的标准库. Com ...

  4. 再次尝试mtk线刷时发现的一些资源

    线刷用到的工具:spflashtool,也可以下载vcom drivers 下载:http://spflashtool.com/ 查看usb状态的软件:usbdeview,网站里还有一些其它的软件 下 ...

  5. [sinatra] Sinatra再入门

    原文URL:http://www.rubycc.com/bbs/topic_detail/86 1.基础代码app.rb require 'rubygems' require 'sinatra/bas ...

  6. 2.js基础

    4.函数 1)函数是一段完成“指定功能”的已经“命名”的代码段 2)函数只有“调用”才能使用到,调用就是通过名称(可以在声明之前,也可以在声明之后) 3)函数名.参数.函数体.返回值(没有返回值的函数 ...

  7. linux设备驱动归纳总结(七):1.时间管理与内核延时【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-100005.html linux设备驱动归纳总结(七):1.时间管理与内核延时 xxxxxxxxxxx ...

  8. linux,Mac下lu 一把

    习惯Terminal没有不知道ls命令的(等同于DOS的dir),经常只是需要查看目录的内容大小,但ls -h显示的只是目录的本身大小,而且很多项内容 ls 在这方面的两个诟病出现了: 小诟1. 显示 ...

  9. h3c 交换机配置VLAN和远程管理

    一.基本设置 1. console线连接成功 2. 进入系统模式 <H3C>system-view //提示符由<H3C> 变为 [H3C] 3. 更改设备名称 [H3C]sy ...

  10. java技术用ssh从linux服务器下载数据

    通常需要从linux服务器获取数据文件,而通常能有的访问方式只有ssh,所以就可以用ssh进行数据下载. java连接远程主机的方式有多种,这里和大家分享的是通过ssh方式连接远程主机,使用的是jsc ...