
中秋假期已过,回来再次该博文主题。今天讲解第二种方法,将Logo图片的数据写入至Nand Flash中,在推进初始化LCD的之后,从固定的地址将数据读出并填充至显示缓存中。
实验平台:WinCE6.0+Android6410 +4.3寸CLD。
以下内容参考自CSDN论坛的一个帖子,不过上面的表述不是特别清楚,该主题博文进行了整理。为尊重原创,给出链接。
将Logo图片写Flash的模式再次细分,又可以分为几种不同的实现方式,今天先表述实现方式一,这是其中相当简洁的一种方法,不需要修改bib文件等配置性文件,只应该设置代码即可。
首先提几个问题:
1、在什么时候将Logo数据写入Nand Flash?
2、在什么时候读Nand Flash数据到显示缓存?
3、要写的Logo的数据是哪个?
4、写入Flash的哪些位置,又从哪个位置读数据?
5、写Flash的函数跟读Flash的函数怎样实现?
上面几个问题搞明白了,方法一基本就回来了。给出上面几个问题的解决办法:
1、答:为了提高后期变得便捷的更新开机启动Logo,在开启Eboot的主菜单中添加下载Logo的选项,如下图图示,选项G)便是通过USB下载Logo数据,同时将Logo数据写入至Nand F

lash的某一位置上。
2、答:在Eboot的初始化InitializeDisplay中,可以找到关于填充显示缓存的代码,改为从Flash的某一位置读取即可。
3、答:关于写Logo的数据,可以是bin格式的,也可以是原始的bmp格式。其实bin格式的内容也都是通过调用bmp文件的位图阵列而生成的。两者的差异就在于一个在Eboot里面实现写入bmp的位图阵列,一个是在独立的应用程序中读取的。
4、答:关于操作Nand Flash的位置问题,需要查看loader.h文件的相关代码,有关于Block的使用状况,如下所示。在这里为Logo数据分配一定的Block。
// NAND Boot (loads into SteppingStone) @ Block 0
#define NBOOT_BLOCK 0
#define NBOOT_BLOCK_SIZE1
#define NBOOT_SECTORBLOCK_TO_SECTOR(NBOOT_BLOCK)
// TOC @ Block 1
#define TOC_BLOCK 1
#define TOC_BLOCK_SIZE1
#define TOC_SECTORBLOCK_TO_SECTOR(TOC_BLOCK)
// Eboot @ Block 2
#define EBOOT_BLOCK 2
#define EBOOT_SECTOR_SIZE FILE_TO_SECTOR_SIZE(EBOOT_RAM_IMAGE_SIZE)
#define EBOOT_BLOCK_SIZESECTOR_TO_BLOCK(EBOOT_SECTOR_SIZE)
#define EBOOT_SECTORBLOCK_TO_SECTOR(EBOOT_BLOCK)
5、答:Flash的读写操作变量实现主要在nand.cpp文件中,具体实现可以参考函数ReadOSImageFromBootMedia和WriteOSImageToBootMedia。
下面给出详细的更改步骤:
1、首先设置loader.h文件,为Logo数据分配一定的Block空间。添加如下代码:
// Eboot @ Block 2
#define EBOOT_BLOCK 2
#define EBOOT_SECTOR_SIZE FILE_TO_SECTOR_SIZE(EBOOT_RAM_IMAGE_SIZE)
#define EBOOT_BLOCK_SIZESECTOR_TO_BLOCK(EBOOT_SECTOR_SIZE)
#define EBOOT_SECTORBLOCK_TO_SECTOR(EBOOT_BLOCK)
//-----------------------add by jazka 2011.09.04-------------------------
//-----------------------------start--------------------------------------
// Logo @ Block 6~
#define LOGO_BLOCK6
#define LOGO_BLOCK_SIZE20
#define LOGO_SECTORBLOCK_TO_SECTOR(LOGO_BLOCK)
//----------------------------- end ---------------------------------------
//-----------------------modify by jazka 2011.09.04-----------------------
![]()
//-----------------------------start---------------------------------------
//#define RESERVED_BOOT_BLOCKS(NBOOT_BLOCK_SIZE + TOC_BLOCK_SIZE + EBOOT_BLOCK_SIZE)
#define RESERVED_BOOT_BLOCKS(NBOOT_BLOCK_SIZE + TOC_BLOCK_SIZE + EBOOT_BLOCK_SIZE + LOGO_BLOCK_SIZE)
从上面可以看出从Block6开始,为Logo分配了20个Block的Flash空间wince主题软件,这样可以存放64KB*20=1280KB大小的Logo数据,即1M以内的图片数据。由于Logo占用了一定的Block空间,所以中间Nk的起始位置RESERVED_BOOT_BLOCKS需要向后移动。
2、在Eboot启动主菜单中提高下载Logo数据的相应的选项。修改的代码如下:
EdbgOutputDebugString ( "F) Low-level format the Smart Media card\r\n");
//add by jazka 2011.09.05
//-----------------------------start---------------------------------
EdbgOutputDebugString ( "G) DOWNLOAD Logo now(USB)\r\n");
//----------------------------- end ---------------------------------
EdbgOutputDebugString ( "L) LAUNCH existing Boot Media image\r\n");
EdbgOutputDebugString ( "R) Read Configuration \r\n");
EdbgOutputDebugString ( "U) DOWNLOAD image now(USB)\r\n");
EdbgOutputDebugString ( "W) Write Configuration Right Now\r\n");
EdbgOutputDebugString ( "\r\nEnter your selection: ");
while (! ( ( (KeySelect >= '0') && (KeySelect <= '9') ) ||
( (KeySelect == 'A') || (KeySelect == 'a') ) ||
( (KeySelect == 'B') || (KeySelect == 'b') ) ||
( (KeySelect == 'C') || (KeySelect == 'c') ) ||
( (KeySelect == 'D') || (KeySelect == 'd') ) ||
( (KeySelect == 'E') || (KeySelect == 'e') ) ||
( (KeySelect == 'F') || (KeySelect == 'f') ) ||
( (KeySelect == 'G') || (KeySelect == 'g') ) || //add by jazak 2011.09.05
( (KeySelect == 'L') || (KeySelect == 'l') ) ||
( (KeySelect == 'R') || (KeySelect == 'r') ) ||
( (KeySelect == 'U') || (KeySelect == 'u') ) ||
( (KeySelect == 'W') || (KeySelect == 'w') ) ))
{
KeySelect = OEMReadDebugByte();
}
//add by jazka 2011.09.05
//--------------------------start-----------------------------
case 'G':
case 'g':
{
OALMSG(TRUE, (TEXT("Please send the Logo through USB.\r\n")));
g_bUSBDownload = TRUE;
{
DWORD dwStartAddr = 0;
LPBYTE lpDes = NULL;
lpDes = (LPBYTE)(FILE_CACHE_START);
if (!OEMReadData(LCD_WIDTH*LCD_HEIGHT*2, lpDes))
{
OALMSG(TRUE, (TEXT("Error when sending the Logo through USB.\r\n")));
SpinForever();
}
dwStartAddr = (DWORD)lpDes;
if (!WriteLogoToBootMedia(dwStartAddr, (DWORD)(LCD_WIDTH*LCD_HEIGHT*2), dwStartAddr))
{
OALMSG(TRUE, (TEXT("Error when WriteLogoToBootMedia.\r\n")));
SpinForever();
}
}
}
break;
//-------------------------- end -----------------------------
这里把g_bUSBDownload设置为TRUE,以便后面选择USB进行下载。由于USB下载的速度跟写Flash速度不匹配,所以先下载到内存中,然后在一下子写入Flash中(这部分解析见博客)。WriteLogoToBootMedia便是Flash的写函数,后面给出实现。
3、修改LCD初始化函数InitializeDisplay,修改代码如下:
// Fill Framebuffer
#if(SMDK6410_LCD_MODULE == LCD_MODULE_UT_LCD35A)
memcpy((void *)EBOOT_FRAMEBUFFER_UA_START, (void *)InitialImage_rgb16_320x240, 320*240*2);
#elif(LCD_BPP == 16)
{
//delete by jazka 2011.08.31修改开机启动界面
/* int i;
unsigned short *pFB;
pFB = (unsigned short *)EBOOT_FRAMEBUFFER_UA_START;
for (i=0; i<LCD_WIDTH*LCD_HEIGHT; i++)
{
//*pFB++ = 0x0000;//0x001F;// Blue
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/bofangqi/article-137481-1.html
这种小白文盛行