68

帖子

0

TA的资源

一粒金砂(初级)

21
 
引用 16 楼 veabol 的回复:
引用 15 楼 lightsoure 的回复:
引用 11 楼 haiou_arm 的回复:
"stepldr" 是Nboot输出的,可见Nboot找不到eboot了……


这个有道理,现在主要问题还是:
拔掉短路帽,烧录LOGO到9~15块~,查看stepldr,发现没有变化,插上短路帽,系统起不来了,串口显示“Step ldr”这个可不肯能是TOC问题,因为我在下载EBOOT.N……





正常情况下接上短路帽子后系统正常启动是:
Step ldr


Microsoft Windows CE Ethernet Bootloader Common Library Version 1.1 Built Mar 30 2010 13:24:02
Microsoft Windows CE Bootloader for the Samsung SMDK2440 Version 2.4 Built Mar 30 2010

BP_Init
FMD::FMD_Init
FMD::FMD_Init - pBSPArgs->nfsblk = 0x0
FMD::FMD_Init - READ_REGISTER_BYTE(pNFSBLK) = 0x0
FMD::FMD_Init IPL .....
FMD::FMD_Init Done
MID = 0xec, DID = 0x76 4th Cycle : 0xa5
NUMBLOCKS : 512(0x200), SECTORSPERBLOCK = 256(0x100), BYTESPERSECTOR = 512(0x200)
MID = 0xec, DID = 0x76 4th Cycle : 0xa5
NUMBLOCKS : 512(0x200), SECTORSPERBLOCK = 256(0x100), BYTESPERSECTOR = 512(0x200)
wNUM_BLOCKS : 512(0x200)
dwBlock(0x9) X dwImageLength = 0x25800
dwNumBlocks = 0x2
dwBlock(0x9) X g_FlashInfo.wSectorsPerBlock(0x100) = 0x900
dwBlock(0xa) X g_FlashInfo.wSectorsPerBlock(0x100) = 0xa00
Press [ENTER] to launch image stored on boot media, or [SPACE] to enter boot monitor.

Initiating image launch in 5 seconds.
可见是跳不到MAIN.C里~

回复

84

帖子

0

TA的资源

一粒金砂(初级)

22
 
从这些信息看只有Step ldr是stepldr的内容,其它的全是EBOOT输出信息,所以你可能是更新LOGO的时候把EBOOT给清除了,可能清除了一部分,也可能全部。
 
 

回复

49

帖子

0

TA的资源

一粒金砂(初级)

23
 
引用 21 楼 veabol 的回复:
从这些信息看只有Step ldr是stepldr的内容,其它的全是EBOOT输出信息,所以你可能是更新LOGO的时候把EBOOT给清除了,可能清除了一部分,也可能全部。


有道理,但是那我该从哪里查呢??
难道一定要通过EBOOT本身来下载文件到NAND?(这个应该不会,因为我用工具可以下载STEPLDR和EBOOT到NAND然后运行~)

 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

24
 
用其它方式下载LOGO到NAND也没有问题,但是烧录的NAND地址要对,不能占用EBOOT的存储空间,你烧录LOGO再去读一下EBOOT的存储空间,看看还是不是EBOOT的数据了。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

25
 
引用 23 楼 veabol 的回复:
用其它方式下载LOGO到NAND也没有问题,但是烧录的NAND地址要对,不能占用EBOOT的存储空间,你烧录LOGO再去读一下EBOOT的存储空间,看看还是不是EBOOT的数据了。


谢谢前辈指点:
我现在的情况是:下载LOGO到NAND,从第9个BLOCK开始 大小是0X28000,占用10个BLOCK,也就是到18个BLOCK;我在LOADER.H中设定了
// 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 8//SECTOR_TO_BLOCK(EBOOT_SECTOR_SIZE)
#define EBOOT_SECTOR BLOCK_TO_SECTOR(EBOOT_BLOCK)

//logo @ Block 8~ added for logo
#define LOGO_BLOCK 9
#define LOGO_BLOCK_SIZE 20 //16K*10=160k
#define LOGO_SECTOR BLOCK_TO_SECTOR(LOGO_BLOCK)

实际读NAND,可以看到EBOOT的数据在BLOCK2~BLOCK8。

然后设定NK是从

#define RESERVED_BOOT_BLOCKS (NBOOT_BLOCK_SIZE +TOC_BLOCK_SIZE +EBOOT_BLOCK_SIZE+LOGO_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

0X1f(30)开始,奇怪的是,当我不下载LOGO倒NAND,系统能正常起来的时候情况下,我发现从第15个BLOCK开始就有数据了,并不是从第30个BLOCK开始才有数据。这个是为什么呢?难道我的LOGO吧这些数据冲掉对系统产生影响了?


难道NK和EBOOT之间的空间留大点?不是在LOADER.H中设置宏的嘛?还要其它地方设置?
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

26
 
引用 23 楼 veabol 的回复:
用其它方式下载LOGO到NAND也没有问题,但是烧录的NAND地址要对,不能占用EBOOT的存储空间,你烧录LOGO再去读一下EBOOT的存储空间,看看还是不是EBOOT的数据了。


我烧录LOGO后,查看从第2~第8块EBOOT数据是没有变的;

有一个情况是,我接上短路帽,系统从NAND启动,系统起不来,显示“setp ldr”

这个时候我拔掉短路帽,下载EBOOT.NB0到内存0X30038000,系统就能正常运行了。。。

所以应该是EBOOT不能搬运倒内存~~
 
 
 

回复

89

帖子

0

TA的资源

一粒金砂(初级)

27
 
我还是觉得你烧写LOGO时,把EBOOT给冲掉了。
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

28
 
引用 26 楼 sunrain_hjb 的回复:
我还是觉得你烧写LOGO时,把EBOOT给冲掉了。


前辈能不能说下?这个冲掉有可能是什么引起的呢?烧录工具?我用USB JTAG烧录和用ADS编译的测试程序烧录情况是一样的。。


还有就是我对NAND的分区不对,LOGO区域的数据占用了EBOOT区的数据。。。(但是这个我是直接在LOADER.H去来划分的,上面也提到了,是不是方法不对?)
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

29
 
做了个实验:
烧写5KB的数据到第9个BLOCK系统能起来,然后烧写5KB的数据到第10个BLOCK系统能起来,然后烧写5KB的数据到第11个BLOCK系统能起来.。。当烧写5KB的数据到第15个BLOCK系统起不来  显示“Step ldr”

证明烧录工具和ADS的烧录程序都可以烧二进制文件到NAND,工具和软件没有问题。

那么接下来 就是2个问题了:
为什么只能到9~14BLOCK,第15个BLOCK就不能放了(上面帖子中我也查过,在不烧LOGO的时候第15个BLOCK是有数据的,但不知道这是什么数据,我的NK的MBR是0X1E)

 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

30
 
顶起来~呵呵~~~~~~~~~
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

31
 
你的烧录程序确定是对的吗?是否表面上看程序读写的是15BLOCK,但是由于代码某个地方有误,导致实际上是读写的其它BLOCK呢?
另外,LOADER.H上写的EBOOT 的起始BLOCK是2,BLOCK SIZE是8,那么2..9都应该是EBOOT,你为什么要让LOGO占用呢?虽然目前只到8,但是EBOOT烧录代码上会对SIZE判断的,如果中间出现坏块就会写到9,那你的LOGO也就被清了一部分。
还有你是通过NOR来烧录LOGO还是自己写的代码烧录LOGO?NOR的你有源代码吗?自己写的程序有没有问题?
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

32
 
引用 30 楼 veabol 的回复:
你的烧录程序确定是对的吗?是否表面上看程序读写的是15BLOCK,但是由于代码某个地方有误,导致实际上是读写的其它BLOCK呢?
另外,LOADER.H上写的EBOOT 的起始BLOCK是2,BLOCK SIZE是8,那么2..9都应该是EBOOT,你为什么要让LOGO占用呢?虽然目前只到8,但是EBOOT烧录代码上会对SIZE判断的,如果中间出现坏块就会写到9,那你的LOGO也就被清了一部分。……


我的STEPLDR MAIN.C。。。。部分
#define NAND_BLOCK_SIZE_BYTES   0x00020000
#define NAND_PAGE_SIZE_BYTES    0x00000200
#define NAND_PAGES_PER_BLOCK    (NAND_BLOCK_SIZE_BYTES / NAND_PAGE_SIZE_BYTES)

    // NOTE: we assume that this Steppingstone loader occupies *part* the first (good) NAND flash block.  More
    // specifically, the loader takes up 4096 bytes (or 8 NAND pages) of the first block.  We'll start our image
    // copy on the very next page.
#define NAND_COPY_PAGE_OFFSET   2*NAND_PAGES_PER_BLOCK

#define LOAD_ADDRESS_PHYSICAL   0x30038000
#define LOAD_SIZE_BYTES         0x00040000
#define LOAD_SIZE_PAGES         (LOAD_SIZE_BYTES / NAND_PAGE_SIZE_BYTES)

// Globals variables.
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

33
 
引用 31 楼 lightsoure 的回复:
引用 30 楼 veabol 的回复:
你的烧录程序确定是对的吗?是否表面上看程序读写的是15BLOCK,但是由于代码某个地方有误,导致实际上是读写的其它BLOCK呢?
另外,LOADER.H上写的EBOOT 的起始BLOCK是2,BLOCK SIZE是8,那么2..9都应该是EBOOT,你为什么要让LOGO占用呢?虽然目前只到8,但是EBOOT烧录代码上会对SIZE判断的,如果中间出现坏块就……



就是这样
OK~~~~~关于LOGO影响EBOOT的问题已经解决~~~~
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

34
 
引用 30 楼 veabol 的回复:
你的烧录程序确定是对的吗?是否表面上看程序读写的是15BLOCK,但是由于代码某个地方有误,导致实际上是读写的其它BLOCK呢?
另外,LOADER.H上写的EBOOT 的起始BLOCK是2,BLOCK SIZE是8,那么2..9都应该是EBOOT,你为什么要让LOGO占用呢?虽然目前只到8,但是EBOOT烧录代码上会对SIZE判断的,如果中间出现坏块就会写到9,那你的LOGO也就被清了一部分。……


正解!
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

35
 
呵呵~~还没完~等我把LOGO完全弄好了~我再来结贴~先谢谢你们 帮我把脉~
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

36
 
/*
    @func   BOOL | FMD_ReadSector | Reads the specified sector(s) from NAND flash.
    @rdesc  TRUE = Success, FALSE = Failure.
    @comm   
    @xref   
*/
BOOL FMD_ReadSector(SECTOR_ADDR startSectorAddr, LPBYTE pSectorBuff, PSectorInfo pSectorInfoBuff, DWORD dwNumSectors)
{
    ULONG SectorAddr = (ULONG)startSectorAddr;
        ULONG MECC;

    if (!pSectorBuff && !pSectorInfoBuff)
        return(FALSE);

    BOOL bLastMode = SetKMode(TRUE);

    NF_nFCE_L();                        // Select the flash chip.
    NF_WAITRB();                                    // Wait for flash to complete command.

    NF_CMD(CMD_RESET);                                // Send reset command.
    NF_WAITRB();                                    // Wait for flash to complete command.
   
    while (dwNumSectors--)
    {
        ULONG blockPage = (((SectorAddr / NAND_PAGE_CNT) * NAND_PAGE_CNT) | (SectorAddr % NAND_PAGE_CNT));

                if (!pSectorBuff)
        {
            NF_CMD(CMD_READ2);                                    // Send read confirm command.
            NF_WAITRB();                                        // Wait for command to complete.

            NF_ADDR(0);                                            // Column = 0.
            NF_ADDR(blockPage         & 0xff);                    // Page address.
            NF_ADDR((blockPage >>  8) & 0xff);
                        if (NEED_EXT_ADDR)
                    NF_ADDR((blockPage >> 16) & 0xff);  
            NF_WAITRB();                                        // Wait for command to complete.

            RdPageInfo((PBYTE)pSectorInfoBuff);                    // Read page/sector information.

            pSectorInfoBuff++;
        }
                else
        {
            NF_CMD(CMD_READ);                                    // Send read command.
            NF_WAITRB();                                        // Wait for command to complete.

            NF_ADDR(0);                                            // Column = 0.
            NF_ADDR(blockPage         & 0xff);                    // Page address.
            NF_ADDR((blockPage >>  8) & 0xff);
                        if (NEED_EXT_ADDR)
                    NF_ADDR((blockPage >> 16) & 0xff);  
            NF_WAITRB();                                        // Wait for command to complete.

            //  Handle unaligned buffer pointer
                       NF_RSTECC();
                NF_MECC_UnLock();
            if( ((DWORD) pSectorBuff) & 0x3)
            {
                RdPage512Unalign (pSectorBuff);
            }
            else
            {
                RdPage512(pSectorBuff);                        // Read page/sector data.
            }
                NF_MECC_Lock();

                        if (pSectorInfoBuff)
                        {
                                RdPageInfo((PBYTE)pSectorInfoBuff);            // Read page/sector information.
                pSectorInfoBuff ++;
                        }
                        else
                        {
                BYTE TempInfo[8];
                                RdPageInfo(TempInfo);                                           // Read page/sector information.
                        }

                        MECC  = NF_RDDATA() << 0;
                        MECC |= NF_RDDATA() << 8;
                        MECC |= NF_RDDATA() << 16;
                        MECC |= NF_RDDATA() << 24;
                        
                        NF_WRMECCD0( ((MECC&0xff00)<<8)|(MECC&0xff) );
                         NF_WRMECCD1( ((MECC&0xff000000)>>8)|((MECC&0xff0000)>>16) );
                        
                         if (NF_RDESTST0 & 0x3)
                         {
                            RETAILMSG(1,(TEXT("ecc error %x %x \r\n"),NF_RDMECC0(),MECC));
                        
                            NF_nFCE_H();                            // Deselect the flash chip.
                            SetKMode (bLastMode);
                                 return FALSE;   
   
                        }                            pSectorBuff += NAND_PAGE_SIZE;
        }
        ++SectorAddr;
    }
    NF_nFCE_H();                        // Deselect the flash chip.

    SetKMode (bLastMode);

    return(TRUE);

    这段代码是我的2440 NANDFLASH驱动FMD.CPP中读NAND信息的函数,,,
红色部分我的理解是如果这个BLOCK的第0个PAGE是被定义为保留的标志(NF_RDESTST0 & 0x3)则ECC校验出错,从而实现对BLOCK的RESVERed功能?

我的理解对吗?
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

37
 
我是不是该结贴了呢?呵呵~谢谢Veabol~sunrain_hjb~haiou_arm   呵呵~谢谢
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表