s3c2440 WINCE5.0 关于eboot下载映像原理基础问题,求教

guiziqian   2010-3-19 18:37 楼主
硬件配置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 难道是大页小页兼容?


小弟我很菜,向各位大哥求教了。。。。



回复评论 (12)

顶起来,怎么没人啊?
点赞  2010-3-19 21:26
第一个问题我觉得#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的。
点赞  2010-3-19 23:06
第二个问题建议你看芯片的DataSheet,应该以那个为准。

有时候代码最能说明问题,但错误的代码就只能起到误导作用了。
何况这些代码在改来改去之后就变得更加捉摸不透。所以第二个问题,有可能是别人用别的型号的NAND,但在移植时没有彻底改掉所有的地方。

个人觉得还是不能过于相信代码,而更应该相信自己的分析和判断。
点赞  2010-3-19 23:14
如楼上所说的,EBOOT的BLOCK 2是起始BLOCK,而不是总长度。

LOADER.H中PAGES_PER_BLOCK的定义确定针对你的NAND吗?还是详细看看代码和DATASHEET吧,要么是你把NAND的参数记错了,要么那代码就不是针对这个芯片的。
点赞  2010-3-20 01:36
先谢谢楼上两位前辈,谢谢

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有数据还可以理解。
点赞  2010-3-20 09:23
MBR是第OX4块~
点赞  2010-3-20 09:27
硬件配置为 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号!而不是尺寸
点赞  2010-3-24 16:31
哈哈~谢谢
点赞  2010-3-24 21:05
引用: 引用 3 楼 sunrain_hjb 的回复:
第二个问题建议你看芯片的DataSheet,应该以那个为准。

有时候代码最能说明问题,但错误的代码就只能起到误导作用了。
何况这些代码在改来改去之后就变得更加捉摸不透。所以第二个问题,有可能是别人用别的型号的NAND,但在移植时没有彻底改掉所有的地方。

个人觉得还是不能过于相信代码,而更应该相信自己的分析和判断。

老兄,你开个培训班,我第一个报名去。呵呵
点赞  2010-3-24 21:29
其实我发这个帖子 无非是我打算修改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 ();
                }
            }
        }

哎?为什么会停着不执行呢?
点赞  2010-3-24 23:48
从上面的串口信息可以看出 已经执行倒了这一步:
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);
            }
        }
点赞  2010-3-24 23:52
最经一直在做其它事情,哎,一直没时间仔细仔细想想~真烦
点赞  2010-3-24 23:53
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复