天天看点

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