8139|26

70

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

有人改写过nboot吗? [复制链接]

nand flash里bootloader的结构如下:
0:nboot
1:tocblock1 file
2:eboot
有人这样安装吗?

有人改写过nboot吗?
我的板子是2410的,我从网上找到了2410 BSP里面关于nboot的代码
读了下nboot里面的代码,硬件主要是初始化串口,感觉这些是通用的,在我的板子上,能直接用这个nboot吗?
多谢

最新回复

这个你的函数readebootfromnand()中有这样一个参数的把  详情 回复 发表于 2009-1-12 10:50
点赞 关注

回复
举报

65

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
这里很多人都改过,呵呵。
不是通用的,重点是startup.s那里,C里面看上去像通用的样子,但寄存器肯定不一样的。
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
这个看看2440的5.0BSP应该不难。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用 1 楼 Seven_zhangxw 的回复:
这里很多人都改过,呵呵。
不是通用的,重点是startup.s那里,C里面看上去像通用的样子,但寄存器肯定不一样的。

1:startup.s这个文件nboot里没有吧?最起码我找的那份nboot里面没有
2:就2410串口来说,寄存器应该是一样的吧?我第一步就是先用nboot把串口给调通了
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 3 楼 iamcow 的回复:
引用 1 楼 Seven_zhangxw 的回复:
这里很多人都改过,呵呵。
不是通用的,重点是startup.s那里,C里面看上去像通用的样子,但寄存器肯定不一样的。

1:startup.s这个文件nboot里没有吧?最起码我找的那份nboot里面没有
2:就2410串口来说,寄存器应该是一样的吧?我第一步就是先用nboot把串口给调通了


没有怎么启动?
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

6
 
nboot的入口函数是不是2410loader.c里面的main函数?

void Main(void)
{
   
    //        By default, we launch image CE image. If you want to launch
    //        Eboot, you need to hold down APP4 button (sw803) when it boots.
    JumpAddr=0x30200000;
    MMU_EnableICache();
    Uart_Init();
    Uart_SendString(SIGN_ON);
    NF_Init();   
    LcdDisplayPic();
    ReadImageFromNand();
    Launch(JumpAddr);
}

串口初始化这块需要修改吗?要改什么地方?
我如下写:
void Main(void)
{
   
    //        By default, we launch image CE image. If you want to launch
    //        Eboot, you need to hold down APP4 button (sw803) when it boots.
    JumpAddr=0x30200000;
    MMU_EnableICache();
    Uart_Init();
    Uart_SendString(SIGN_ON);
    NF_Init();
    Uart_SendString("hello world");   
//    LcdDisplayPic();
//    ReadImageFromNand();
//    Launch(JumpAddr);
}

然后在ADS下编译,烧写编出来的nboot.bin到nand flash的第0块,然后接上超级终端,能不能看到"hello world"
如果我想看到,还该做些什么?
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 4 楼 gooogleman 的回复:
引用 3 楼 iamcow 的回复:
引用 1 楼 Seven_zhangxw 的回复:
这里很多人都改过,呵呵。
不是通用的,重点是startup.s那里,C里面看上去像通用的样子,但寄存器肯定不一样的。

1:startup.s这个文件nboot里没有吧?最起码我找的那份nboot里面没有
2:就2410串口来说,寄存器应该是一样的吧?我第一步就是先用nboot把串口给调通了


没有怎么启动?

我这里指的是nboot,只烧写nboot,先不启动加载内核好不好?
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

8
 
main函数之前是有汇编的。
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

9
 
一般是芯片公司给我们写好了的!因为他们对自己的芯片才最熟悉了。
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

10
 
就这个问题本身来说,10个做WinCE的人差不多有七八个改过吧。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

11
 
应该是2410init.s其实和大家说的没太大的区别,和start。s一个性质的
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

12
 
哦,我找到的那个2410 nboot文件夹里面没有startup.s这个
文件,倒是有2410init.s,它和startup.s的作用是一样的吗?

这些东西是在ADS里面编译的,倒是可以生成nboot。bin文件,




 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

13
 
恩,一样的,生成nboot。bin不就成功了,调试下就号了,看看eboot有没有被拷贝到0x30038000
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

14
 
名字不一样而已,做的事情差不多
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

15
 
确实如此,回去读了 下2410init.s
读的不是太仔细

串口的初始化工作是在c代码里面完成的,
void Main(void)
{
   
    // By default, we launch image CE image. If you want to launch
    // Eboot, you need to hold down APP4 button (sw803) when it boots.
    JumpAddr=0x30200000;
    MMU_EnableICache();
    Uart_Init();
    Uart_SendString(SIGN_ON);
    NF_Init();
    Uart_SendString("hello world");  
//    LcdDisplayPic();
//    ReadImageFromNand();
//    Launch(JumpAddr);
}

这个hello world已经可以看到,网上找到的代码串口顺序和我的板子串口正好相反,调换了下串口,就没问题了
但是读取第2 block 里的eboot时出现,ECC提示错误,还不是很明白

下面的关键问题是
1:如何读取eboot,并且我怎么修改才能保证网上找到的eboot可以用?

2:另外,我对tocblock1 file这个东西也比较迷糊,它是如何生成的?谁能给详细介绍下这个东西吧多谢了
它描述了eboot 和nk.bin在nand flash里面所存放的具体block吗?
是不是我烧写eboot,nk.bin时按照这个对应的block 烧写就没问题了?

多谢各位。
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

16
 
关注中,做好了来鞋下经验
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

17
 
re
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

18
 
nboot下到了第0块,可是启动时终端狂出错,不停的显示
ERR_DISK_OP_FAIL2: 0x00000ca0(这个数字是不断增加的,这只是其中一行)
ECC mismatch for Sector: 0x00000ca1(这个数字是不断增加的,这只是其中一行),
感觉是不是读取eboot时校验出错了呢?

该如何下手修改?请大家帮忙分析,我可以给多加些分
多谢


 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

19
 
估计ecc有问题,关掉调试信息好了,没ecc也不影响的
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

20
 
我把出错的地方拿出来了nboot 文件夹里的nand.c,最重要的一个函数FMD_ReadSector
有一个地方比较疑惑,大家看我的中文注释的地方

//  FMD_ReadSector
//
//  Read the content of the sector.
//
//  startSectorAddr: Starting page address
//  pSectorBuff  : Buffer for the data portion
//  pSectorInfoBuff: Buffer for Sector Info structure
//  dwNumSectors : Number of sectors
//
BOOL
FMD_ReadSector(
    SECTOR_ADDR startSectorAddr,
    LPBYTE pSectorBuff,
    PSectorInfo pSectorInfoBuff,
    DWORD dwNumSectors
    )
{
    DWORD   i, r = 0;
    BYTE   ecc0,ecc1,ecc2;
    BOOL   rc = TRUE;
    ECCRegVal eccRegVal;  //注意这个结构体,在这里声明的,它有两个成员,后面可以看到,

    //  BUGBUGBUG: I need to come back to support dwNumSectors > 1
    //
    //  Sanity check
    if (!pSectorBuff && !pSectorInfoBuff || dwNumSectors > 1 || !pSectorBuff) {
        Uart_SendString("ERROR_INVALID_PARAMETER\n");
        return FALSE;
    }

//    Uart_SendString("R: ");
//    Uart_SendDWORD(startSectorAddr, TRUE);

_retry:
    //  Initialize ECC register
    NF_RSTECC();

    //  Enable the chip
    NF_nFCE_L();   
   
    // Issue Read command
    NF_CMD(CMD_READ);

    //  Set up address
    NF_ADDR(0x00);
    NF_ADDR((startSectorAddr) & 0xff);
    NF_ADDR((startSectorAddr >> 8) & 0xff);
    if (NEED_EXT_ADDR) {
        NF_ADDR((startSectorAddr >> 16) & 0xff);
    }

    for (i = 0; i < 5; i++);   // wait tWB(100ns)

    NF_WAITRB();        // wait tR(max 12us)

    // read the data
    __RdPage512(pSectorBuff);
//    __RdPage256(pSectorBuff);

        //        Read the ECC from ECC Register
        //!!!好,注意,在这里通过读nand的ECC寄存器,初始化第一个成员
         //并没有初始化第二个成员,且这两个成员间似乎没有什么必然关系,至少我看不出来
       eccRegVal.dwECCVal = NF_ECC();   
                        
       
        //        Skip first 8 bytes
        for(i=0; i<8; i++){
                ecc0 = NF_DATA_R();
        }
       
        ecc0 = NF_DATA_R();    //读nand flash
        ecc1 = NF_DATA_R();
        ecc2 = NF_DATA_R();
       
    NF_nFCE_H();

    if ( !rc && r++ < 3 ) {
        Uart_SendString("FMD_ReadSector: ");
        Uart_SendDWORD(startSectorAddr, TRUE);

        NF_Reset();
        
        for (i = 0; i < 5; i++);   // delay

        rc = TRUE;
        
        goto _retry;
    }
   
       //这个地方出现了eccRegVal结构体的第二个成员,这个成员从来都没有被初始化过,
        //为何就直接和它比较啊?这样比较肯定过不去啊,这是怎么回事?高手说说啊
        if(        ecc0 != eccRegVal.bECCBuf[0] ||
                ecc0 != eccRegVal.bECCBuf[0] ||
                ecc0 != eccRegVal.bECCBuf[0] )  {
                Uart_SendString("ECC mismatch for Sector: ");
                Uart_SendDWORD(startSectorAddr, TRUE);
                rc = FALSE;
        }

    return rc;
}
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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