WinCE开机Logo的实现(USB下载图片到nandflash)
WinCE开机启动Logo使用Eboot读取NandFlash中的图片数据,然后显示的方式。对于开机logo的方式网友http://jazka.blog.51cto.com/809003/664131有了详细的描述。但是自己在运用的时候遇到了一些问题。现在重新进行整理。
在loader.h中增加保留的block提供给图片用。
- #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下载图片的菜单
- 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中
- 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()
- 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)的更多相关文章
- 八、启动linux内核并修改开机logo
1. 编译并烧写linux内核 1)先准备好内核源码包urbetter-linux2.6.28-v1.0.tgz,输入命令:tar -zxvf urbetter-linux2.6.28-v1.0.tg ...
- [置顶]
制作开机LOGO就是这么简单!
转自: http://mp.weixin.qq.com/s?__biz=MzAxNTAyOTczMw==&mid=2649328522&idx=1&sn=64107695fef ...
- DIY固件系列教程——实现开机LOGO三屏动画的完全替换【转】
本文转载自:http://blog.csdn.net/sdgaojian/article/details/9192433 本教程需要用到如下工具:1,7Z压缩工具2,AddCrc32效验工具3,raw ...
- java远程下载图片
从别的网站复制文章的时候,要把图片下载到我们网站,再把图片地址换成我们网站的地址 <img id="mbkenHUwhWeOj9U8K6c8LlAXaes3oXit-M4SnmRvB4 ...
- (原)kenel开机logo的制作
今天项目需要,需要制作一个kernel的开机logo,所以在rk3288的平台上进行测试一番. 第一步:配置kernel:选上CONFIG_LOGO_LINUX_CLUT224选项 make menu ...
- 因为强行关机, 而导致的fedora23 不能重新启动, 卡在开机logo那里的 修复 解决方案
其实, fedora23的U盘live 也很好用, 很流畅, 主要还是 要用一个比较好的/快的 U盘. 这样live U盘在4GB(3.75GiB)的内存中还是较快的 原来的U盘live系统用得很卡, ...
- Day3-scrapy爬虫下载图片自定义名称
学习Scrapy过程中发现用Scrapy下载图片时,总是以他们的URL的SHA1 hash值为文件名,如: 图片URL:http://www.example.com/image.jpg 它的SHA1 ...
- 开机logo以及两种修改开机动画方法
Android开机画面总共有三屏 一.第一屏:开机logo 1.选张png格式的图片,在Linux任意下执行(安装工具): sudo apt-get install pnmtoplainpm 2.在所 ...
- 安卓开机logo和开机动画的几种实现方法
安卓4.2可用方法2-4,第一种方法未验证. 从理论上来说,android 有4个开机启动画面. 第一个应该是U-BOOT的启动画面,有些设备为了满足按动电源即有显示,在UBOOT里加了开机画面,实现 ...
随机推荐
- linux抓包方法
tcpdump -i eth0 -X -w data.cap 得到的包保存到本地wireshark解析ip.addr == url && http.request.url contai ...
- GitHub Desktop for Win 安装不上
采用了ClickOnce部署方式,网速不给力,安装过程经常断线,要是有离线安装包就好了.
- 启用 TStringGrid 的自画功能,并避免重影
FMX 控件的 TStringGrid 下,有时为了让不同行或不同 Cell 的显示颜色.字体等有各种不同的颜色, 必须采用自画, 即在其 OnDrawColumnCell 事件中写自己的控制代码显示 ...
- 如何查看和停止Linux启动的服务
1. 查看Linux启动的服务chkconfig --list 查询出所有当前运行的服务chkconfig --list atd 查询atd服务的当前状态 2.停止所有服务并且在下次系统启动时不再启 ...
- javap(反汇编命令)详解【转】
转自:http://blog.csdn.net/hudashi/article/details/7062668 javap是JDK自带的反汇编器,可以查看java编译器为我们生成的字节码.通过它,我们 ...
- MyEclipse下搭建maven项目
由于maven在构建项目方面确实比较出色,现今绝大多数人构建项目都采用maven,而且绝大多数人都采用eclipse作为开发环境,今天我用myeclipse搭建了一个demo,虽然基本上不会采用mye ...
- Can't create/write to file '/tmp/#sql_887d_0.MYD' (Errcode: 17)
lsof |grep "#sql_887d_0.MYD" 如果没有被占用就可以删掉 . https://wordpress.org/support/topic/cant-creat ...
- 身为运维工程师怎么用Nginx部署DokuWiki
运维人员按区域组织,人员分散,集中培训成本比较高: 新入职运维人员除了培训手册,没有其它渠道可以持续深入了解公司产品: 运维人员的知识存在各自脑袋里,缺少有效的渠道来传播和分享: 运维知识体系需要积累 ...
- IOS5基础教程之一-----如何创建XCode项目
一.IOS的基础知识 1.只有一个应用程序正在运行.在IOS上,每一段时间内只能激活一个应用程序并在屏幕上显示. 2.只有一个窗口.只允许应用程序操作的一个窗口. 3.访问受限.只能在IOS为应用程序 ...
- WPF:窗体置顶
1.设置窗体TopMost属性 private DispatcherTimer timer; public Window1() { InitializeComponent(); Loaded += n ...