在S3C2440的闆子上移植U-BOOT- 1.1.6 時,使用的NAND Flash為Samsung K9F1208U0B。模仿vivi對nand flash的操作,運用如下代碼讀取manufacture ID和device ID,能夠擷取正确的值:
void get_manufacture_device_id( char * manuID, char * deviceID)
{
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,但是卻不能獲得正确的值:
mfr = READ_NAND(nand -> IO_ADDR);
id = READ_NAND(nand -> IO_ADDR);
獲得的mfr和id都是0xec,而正确的id應該為0x76。調試半天,終于發現問題所在,當将include/S3c2440.h的結構:
typedef struct {
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;
改變為:
typedef struct {
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()中,通過
mfr = READ_NAND(nand -> IO_ADDR);
id = READ_NAND(nand -> IO_ADDR);
擷取的值分别為0xEC和0x76。正确!
要說這是由于 volatile引起的,則在include/S3c24x0.h中已經定義了: typedef volatile u8 S3C24X0_REG8;
typedef volatile u16 S3C24X0_REG16;
typedef volatile u32 S3C24X0_REG32;
故這可能是有crosstool chain引起的。