天天看點

移植U-BOOT到S3C2440闆子上對讀flash的device ID不對的分析

在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引起的。