有人改写过nboot吗?

xingtao   2009-1-4 22:01 楼主
nand flash里bootloader的结构如下:
0:nboot
1:tocblock1 file
2:eboot
有人这样安装吗?

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

回复评论 (26)

这里很多人都改过,呵呵。
不是通用的,重点是startup.s那里,C里面看上去像通用的样子,但寄存器肯定不一样的。
点赞  2009-1-4 22:12
这个看看2440的5.0BSP应该不难。
点赞  2009-1-4 22:18
引用: 引用 1 楼 Seven_zhangxw 的回复:
这里很多人都改过,呵呵。
不是通用的,重点是startup.s那里,C里面看上去像通用的样子,但寄存器肯定不一样的。

1:startup.s这个文件nboot里没有吧?最起码我找的那份nboot里面没有
2:就2410串口来说,寄存器应该是一样的吧?我第一步就是先用nboot把串口给调通了
点赞  2009-1-4 22:55
引用: 引用 3 楼 iamcow 的回复:
引用 1 楼 Seven_zhangxw 的回复:
这里很多人都改过,呵呵。
不是通用的,重点是startup.s那里,C里面看上去像通用的样子,但寄存器肯定不一样的。

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


没有怎么启动?
点赞  2009-1-4 22:57
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"
如果我想看到,还该做些什么?
点赞  2009-1-4 23:08
引用: 引用 4 楼 gooogleman 的回复:
引用 3 楼 iamcow 的回复:
引用 1 楼 Seven_zhangxw 的回复:
这里很多人都改过,呵呵。
不是通用的,重点是startup.s那里,C里面看上去像通用的样子,但寄存器肯定不一样的。

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


没有怎么启动?

我这里指的是nboot,只烧写nboot,先不启动加载内核好不好?
点赞  2009-1-4 23:10
main函数之前是有汇编的。
点赞  2009-1-4 23:26
一般是芯片公司给我们写好了的!因为他们对自己的芯片才最熟悉了。
点赞  2009-1-5 08:52
就这个问题本身来说,10个做WinCE的人差不多有七八个改过吧。
点赞  2009-1-5 09:14
应该是2410init.s其实和大家说的没太大的区别,和start。s一个性质的
点赞  2009-1-5 10:37
哦,我找到的那个2410 nboot文件夹里面没有startup.s这个
文件,倒是有2410init.s,它和startup.s的作用是一样的吗?

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




点赞  2009-1-6 10:07
恩,一样的,生成nboot。bin不就成功了,调试下就号了,看看eboot有没有被拷贝到0x30038000
点赞  2009-1-6 14:49
名字不一样而已,做的事情差不多
点赞  2009-1-6 15:52
确实如此,回去读了 下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 烧写就没问题了?

多谢各位。
点赞  2009-1-7 11:36
关注中,做好了来鞋下经验
点赞  2009-1-7 14:11
re
点赞  2009-1-7 23:27
nboot下到了第0块,可是启动时终端狂出错,不停的显示
ERR_DISK_OP_FAIL2: 0x00000ca0(这个数字是不断增加的,这只是其中一行)
ECC mismatch for Sector: 0x00000ca1(这个数字是不断增加的,这只是其中一行),
感觉是不是读取eboot时校验出错了呢?

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


点赞  2009-1-9 15:28
估计ecc有问题,关掉调试信息好了,没ecc也不影响的
点赞  2009-1-9 16:27
我把出错的地方拿出来了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;
}
点赞  2009-1-9 17:10
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复