s3c2440 WINCE5.0 关于eboot下载映像原理基础问题,求教
硬件配置64MNAND 1208 每个PAGE 512字节,一个BLOCK有32个PAGES
问题1:wince5.0 LOADER.H中
// NAND Boot (loads into SteppingStone) @ Block 0
#define NBOOT_BLOCK 0
#define NBOOT_BLOCK_SIZE 1
#define NBOOT_SECTOR BLOCK_TO_SECTOR(NBOOT_BLOCK)
// TOC @ Block 1
#define TOC_BLOCK 1
#define TOC_BLOCK_SIZE 1
#define TOC_SECTOR BLOCK_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_SIZE SECTOR_TO_BLOCK(EBOOT_SECTOR_SIZE)
#define EBOOT_SECTOR BLOCK_TO_SECTOR(EBOOT_BLOCK)
#define RESERVED_BOOT_BLOCKS (NBOOT_BLOCK_SIZE + TOC_BLOCK_SIZE + EBOOT_BLOCK_SIZE)
// Images start after OEM Reserved Blocks
#define IMAGE_START_BLOCK RESERVED_BOOT_BLOCKS
#define IMAGE_START_SECTOR BLOCK_TO_SECTOR(IMAGE_START_BLOCK)
//
// OEM Defined TOC...
//
#define MAX_SG_SECTORS 14
#define IMAGE_STRING_LEN 16 // chars
#define MAX_TOC_DESCRIPTORS 3 // per sector
#define TOC_SIGNATURE 0x434F544E // (NAND TOC)
这里设置的EBOOT是放在NAND中的2个BLOCK,
再看用EBOOT.NB0烧录EBOOT.BIN后的串口信息:
rom_offset=0x0.
ROMHDR at Address 80038044h
dwImageLength = 0x24900
dwNumBlocks = 0x2
dwBlock(0x2) X g_FlashInfo.wSectorsPerBlock(0x100) = 0x200
dwBlock(0x3) X g_FlashInfo.wSectorsPerBlock(0x100) = 0x300
TOC {
dwSignature: 0x434F544E
BootCfg {
ConfigFlags: 0x2820
OK,这些都能理解,问题是我看我编译出来并能下载进去的EBOOT.BIN有88K,EBOOT.NB0有100K,这么请问2个BLOCK能放的下?
我开始读NAND的第2、3、4、5、6、7、8..block发现都能读出信息,这么我有奇怪了 不是设置了2个BLOCK吗?怎么往后呢?如果EBOOT,再大点,那我的文件系统不是又往后推了??请帮忙解释下。
2,还是LOADER.H
// Platform "BOOTME" root name.
//
#define PLATFORM_STRING "SMDK2440"
#ifndef SECTOR_SIZE
#define SECTOR_SIZE 512
#endif
#ifndef PAGES_PER_BLOCK
#define PAGES_PER_BLOCK 256
#endif
#ifndef BADBLOCKMARK
#define BADBLOCKMARK 0x00
#endif
硬件配置为 64MNAND 1208 每个PAGE 512字节,一个BLOCK有32个PAGES,为啥定义为256个PAGES 难道是大页小页兼容?
小弟我很菜,向各位大哥求教了。。。。
第一个问题我觉得#define EBOOT_BLOCK 2中的2是起始的BLOCK,而不是EBOOT占用的大小,实际上EBOOT占用的BLOCK数目是EBOOT_BLOCK_SIZE,它是根据你定义的EBOOT_RAM_IMAGE_SIZE确定的,如下:
#define EBOOT_SECTOR_SIZE FILE_TO_SECTOR_SIZE(EBOOT_RAM_IMAGE_SIZE)
#define EBOOT_BLOCK_SIZE SECTOR_TO_BLOCK(EBOOT_SECTOR_SIZE)
就像你所发现的第2、3、4……都有内容,实际上这些就是都是用来存放EBOOT的。
第二个问题建议你看芯片的DataSheet,应该以那个为准。
有时候代码最能说明问题,但错误的代码就只能起到误导作用了。
何况这些代码在改来改去之后就变得更加捉摸不透。所以第二个问题,有可能是别人用别的型号的NAND,但在移植时没有彻底改掉所有的地方。
个人觉得还是不能过于相信代码,而更应该相信自己的分析和判断。
如楼上所说的,EBOOT的BLOCK 2是起始BLOCK,而不是总长度。
LOADER.H中PAGES_PER_BLOCK的定义确定针对你的NAND吗?还是详细看看代码和DATASHEET吧,要么是你把NAND的参数记错了,要么那代码就不是针对这个芯片的。
先谢谢楼上两位前辈,谢谢
1,我的NANDFLASH 资料是K9F1208UOB 512字节每个PAGE,一个BLOCK 有32个PAGES,所以第2个问题可能是代码有误。
2,但是我在低格和高格的时候是从0X4开始的0X4~0X1FF。按照,#define EBOOT_SECTOR_SIZE FILE_TO_SECTOR_SIZE(EBOOT_RAM_IMAGE_SIZE)这个是确定EBOOT大小的,我的EBOOT在第4、5、6、7还有呢?这个不矛盾吗?
3,我读NAND中第2个BLOCK的第80个PAGE,都有数据的 不是0XFF , 这个好奇怪哦?一个BLOCK 有32个PAGES,如果是第40个PAGE有数据还可以理解。
硬件配置为 64MNAND 1208 每个PAGE 512字节,一个BLOCK有32个PAGES,为啥定义为256个PAGES 难道是大页小页兼容?
是的,为了和1G08兼容,他的PAGE 是2K的。无论是1208和1G08最终提交给操作系统的页大小都是512 一个BLOCK 256个页。
EBOOT_BLOCK 0
EBOOT_BLOCK 1
EBOOT_BLOCK 2 指的都是起始BLOCK号!而不是尺寸
引用: 引用 3 楼 sunrain_hjb 的回复:
第二个问题建议你看芯片的DataSheet,应该以那个为准。
有时候代码最能说明问题,但错误的代码就只能起到误导作用了。
何况这些代码在改来改去之后就变得更加捉摸不透。所以第二个问题,有可能是别人用别的型号的NAND,但在移植时没有彻底改掉所有的地方。
个人觉得还是不能过于相信代码,而更应该相信自己的分析和判断。
老兄,你开个培训班,我第一个报名去。呵呵
其实我发这个帖子 无非是我打算修改LOGO 也就是吧LOGO放到NAND中 让系统去读:
现在问题又来了:
利用eboot下载LOGO.BIN文件,自己添加了下载的命令,并修改了EBOOT.BIN文件,但是在下载LOGO.BIN的时候
停留在:
Enter your selection: u
System ready!
Preparing for download...
Please send the Image through USB.
<3:TBD]
pUSBCtrlAddr->OCSR1.out_pkt_rdy = 0x1
Ep3Handler : downPtIndex = 0x32000040
Download BIN file information:
-----------------------------------------------------
[0]: Base Address=0x800a1000 Length=0x26400
-----------------------------------------------------
跟踪了下代码,应该接下去将要显示:
rom_offset=0x0.
ROMHDR at Address 。。
即没有执行这个函数:
E:\WINCE500\PUBLIC\COMMON\OAK\DRIVERS\ETHDBG\BLCOMMON\blcommon.c下的
// we're downloading a .bin file - download each .bin record in turn...
else
{
while (OEMReadData (sizeof (DWORD), (LPBYTE) &dwRecAddr) &&
OEMReadData (sizeof (DWORD), (LPBYTE) &dwRecLen) &&
OEMReadData (sizeof (DWORD), (LPBYTE) &dwRecChk))
{
// last record of .bin file uses sentinel values for address and checksum.
if (!dwRecAddr && !dwRecChk)
{
break;
}
// map the record address (FLASH data is cached, for example)
lpDest = OEMMapMemAddr (pCurDownloadFile->dwRegionStart, dwRecAddr);
// read data block
if (!OEMReadData (dwRecLen, lpDest))
{
EdbgOutputDebugString ("****** Data record %d corrupted, ABORT!!! ******\r\n", nPkgNum);
HALT (BLERR_CORRUPTED_DATA);
return (FALSE);
}
if (!VerifyChecksum (dwRecLen, lpDest, dwRecChk))
{
EdbgOutputDebugString ("****** Checksum failure on record %d, ABORT!!! ******\r\n", nPkgNum);
HALT (BLERR_CHECKSUM);
return (FALSE);
}
// Look for ROMHDR to compute ROM offset. NOTE: romimage guarantees that the record containing
// the TOC signature and pointer will always come before the record that contains the ROMHDR contents.
//
if (dwRecLen == sizeof(ROMHDR) && (*(LPDWORD) OEMMapMemAddr(pCurDownloadFile->dwRegionStart, pCurDownloadFile->dwRegionStart + ROM_SIGNATURE_OFFSET) == ROM_SIGNATURE))
{
DWORD dwTempOffset = (dwRecAddr - *(LPDWORD)OEMMapMemAddr(pCurDownloadFile->dwRegionStart, pCurDownloadFile->dwRegionStart + ROM_SIGNATURE_OFFSET + sizeof(ULONG)));
ROMHDR *pROMHdr = (ROMHDR *)lpDest;
// Check to make sure this record really contains the ROMHDR.
//
if ((pROMHdr->physfirst == (pCurDownloadFile->dwRegionStart - dwTempOffset)) &&
(pROMHdr->physlast == (pCurDownloadFile->dwRegionStart - dwTempOffset + pCurDownloadFile->dwRegionLength)) &&
(DWORD)(HIWORD(pROMHdr->dllfirst << 16) <= pROMHdr->dlllast) &&
(DWORD)(LOWORD(pROMHdr->dllfirst << 16) <= pROMHdr->dlllast))
{
g_dwROMOffset = dwTempOffset;
EdbgOutputDebugString("rom_offset=0x%x.\r\n", g_dwROMOffset); 没有打印
}
}
// verify partial checksum
OEMShowProgress (nPkgNum ++);
if (fIsFlash)
{
OEMContinueEraseFlash ();
}
}
}
哎?为什么会停着不执行呢?
从上面的串口信息可以看出 已经执行倒了这一步:
E:\WINCE500\PUBLIC\COMMON\OAK\DRIVERS\ETHDBG\BLCOMMON\blcommon.c下的
else if (!memcmp (hdr, "B000FF\x0A", BL_HDRSIG_SIZE))
{
g_bBINDownload = TRUE;
if (!OEMReadData (sizeof (DWORD), (LPBYTE) &dwImageStart)
|| !OEMReadData (sizeof (DWORD), (LPBYTE) &dwImageLength))
{
EdbgOutputDebugString ("Unable to read image start/length\r\n");
HALT (BLERR_MAGIC);
return (FALSE);
}
}
// If the header signature isn't recognized, we'll assume the
// download file is a raw .nb0 file.
//
else
{
g_bBINDownload = FALSE;
}
// If Platform Builder didn't provide a download manifest (i.e., we're
// only downloading a single .bin file), manufacture a manifest so we
// can notify the OEM.
//
if (!g_DownloadManifest.dwNumRegions)
{
g_DownloadManifest.dwNumRegions = 1;
g_DownloadManifest.Region[0].dwRegionStart = dwImageStart;
g_DownloadManifest.Region[0].dwRegionLength = dwImageLength;这2个参数已经传到了main.c 中并打印了[0]: Base Address=0x800a1000 Length=0x26400
// Provide the download manifest to the OEM.
//
if (g_pOEMMultiBINNotify)
{
g_pOEMMultiBINNotify((PDownloadManifest)&g_DownloadManifest);
}
}
最经一直在做其它事情,哎,一直没时间仔细仔细想想~真烦