nand flash里bootloader的结构如下:
0:nboot
1:tocblock1 file
2:eboot
有人这样安装吗?
有人改写过nboot吗?
我的板子是2410的,我从网上找到了2410 BSP里面关于nboot的代码
读了下nboot里面的代码,硬件主要是初始化串口,感觉这些是通用的,在我的板子上,能直接用这个nboot吗?
多谢
这里很多人都改过,呵呵。
不是通用的,重点是startup.s那里,C里面看上去像通用的样子,但寄存器肯定不一样的。
引用: 引用 1 楼 Seven_zhangxw 的回复:
这里很多人都改过,呵呵。
不是通用的,重点是startup.s那里,C里面看上去像通用的样子,但寄存器肯定不一样的。
1:startup.s这个文件nboot里没有吧?最起码我找的那份nboot里面没有
2:就2410串口来说,寄存器应该是一样的吧?我第一步就是先用nboot把串口给调通了
引用: 引用 3 楼 iamcow 的回复:
引用 1 楼 Seven_zhangxw 的回复:
这里很多人都改过,呵呵。
不是通用的,重点是startup.s那里,C里面看上去像通用的样子,但寄存器肯定不一样的。
1:startup.s这个文件nboot里没有吧?最起码我找的那份nboot里面没有
2:就2410串口来说,寄存器应该是一样的吧?我第一步就是先用nboot把串口给调通了
没有怎么启动?
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"
如果我想看到,还该做些什么?
引用: 引用 4 楼 gooogleman 的回复:
引用 3 楼 iamcow 的回复:
引用 1 楼 Seven_zhangxw 的回复:
这里很多人都改过,呵呵。
不是通用的,重点是startup.s那里,C里面看上去像通用的样子,但寄存器肯定不一样的。
1:startup.s这个文件nboot里没有吧?最起码我找的那份nboot里面没有
2:就2410串口来说,寄存器应该是一样的吧?我第一步就是先用nboot把串口给调通了
没有怎么启动?
我这里指的是nboot,只烧写nboot,先不启动加载内核好不好?
一般是芯片公司给我们写好了的!因为他们对自己的芯片才最熟悉了。
就这个问题本身来说,10个做WinCE的人差不多有七八个改过吧。
应该是2410init.s其实和大家说的没太大的区别,和start。s一个性质的
哦,我找到的那个2410 nboot文件夹里面没有startup.s这个
文件,倒是有2410init.s,它和startup.s的作用是一样的吗?
这些东西是在ADS里面编译的,倒是可以生成nboot。bin文件,
恩,一样的,生成nboot。bin不就成功了,调试下就号了,看看eboot有没有被拷贝到0x30038000
确实如此,回去读了 下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 烧写就没问题了?
多谢各位。
nboot下到了第0块,可是启动时终端狂出错,不停的显示
ERR_DISK_OP_FAIL2: 0x00000ca0(这个数字是不断增加的,这只是其中一行)
ECC mismatch for Sector: 0x00000ca1(这个数字是不断增加的,这只是其中一行),
感觉是不是读取eboot时校验出错了呢?
该如何下手修改?请大家帮忙分析,我可以给多加些分
多谢
估计ecc有问题,关掉调试信息好了,没ecc也不影响的
我把出错的地方拿出来了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;
}