在S3C2440的板子上移植U-BOOT-1.1.6時,使用的NAND Flash爲Samsung K9F1208U0B。模仿vivi對nand flash的操作,運用如下代碼讀取manufacture ID和device ID,能夠獲取正確的值:
{
int i;
NAND_CHIP_ENABLE;
NAND_CLEAR_RB;
NFCMD = 0xFF;
for(i = 0; i < 0x10; i++)
{
}
NFCMD = 0x90;
NFADDR = 0x00;
for(i = 0; i < 0x10; i++)
{
}
NAND_DETECT_RB;
*manuID = (NFDATA & 0xff);
*deviceID = (NFDATA & 0xff);
}
但是在U-BOOT中,通過nand_probe()->NanD_ScanChips()->NanD_IdentChip()來讀取manufacture ID和device ID時,幾乎是同vivi一樣的sequence,但是卻不能獲得正確的值:
id = READ_NAND(nand->IO_ADDR);
獲得的mfr和id都是0xec,而正確的id應該爲0x76。調試半天,終於發現問題所在,當將include/S3c2440.h的結構:
S3C24X0_REG32 NFCONF;
S3C24X0_REG32 NFCONT;
S3C24X0_REG32 NFCMD;
S3C24X0_REG32 NFADDR;
S3C24X0_REG32 NFDATA;
S3C24X0_REG32 NFMECC0;
S3C24X0_REG32 NFMECC1;
S3C24X0_REG32 NFSECC;
S3C24X0_REG32 NFSTAT;
S3C24X0_REG32 NFESTAT0;
S3C24X0_REG32 NFESTAT1;
S3C24X0_REG32 NFECC;
}S3C2440_NAND;
改變爲:
S3C24X0_REG32 NFCONF;
S3C24X0_REG32 NFCONT;
S3C24X0_REG32 NFCMD;
S3C24X0_REG32 NFADDR;
S3C24X0_REG8 NFDATA;
S3C24X0_REG8 Dummy1;
S3C24X0_REG8 Dummy2;
S3C24X0_REG8 Dummy3;
S3C24X0_REG32 NFMECC0;
S3C24X0_REG32 NFMECC1;
S3C24X0_REG32 NFSECC;
S3C24X0_REG32 NFSTAT;
S3C24X0_REG32 NFESTAT0;
S3C24X0_REG32 NFESTAT1;
S3C24X0_REG32 NFECC;
}S3C2440_NAND;
再在NanD_IdentChip()中,通過
id = READ_NAND(nand->IO_ADDR);
獲取的值分別爲0xEC和0x76。正確!
typedef volatile u16 S3C24X0_REG16;
typedef volatile u32 S3C24X0_REG32;
故這可能是有crosstool chain引起的。