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

S3C2440的板子上移植U-BOOT-1.1.6時,使用的NAND FlashSamsung K9F1208U0B。模仿vivinand flash的操作,運用如下代碼讀取manufacture IDdevice 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);

獲得的mfrid都是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引起的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章