diff options
Diffstat (limited to 'x-loader/drivers/k9f1g08r0a.c')
-rw-r--r-- | x-loader/drivers/k9f1g08r0a.c | 55 |
1 files changed, 42 insertions, 13 deletions
diff --git a/x-loader/drivers/k9f1g08r0a.c b/x-loader/drivers/k9f1g08r0a.c index 8968a1b..988533c 100644 --- a/x-loader/drivers/k9f1g08r0a.c +++ b/x-loader/drivers/k9f1g08r0a.c @@ -42,6 +42,7 @@ */ #define MT29F1G_MFR 0x2c /* Micron */ #define MT29F1G_MFR2 0x20 /* numonyx */ +#define MT29F1G_MFR3 0xad /* Hynix */ #define MT29F1G_ID 0xa1 /* x8, 1GiB */ #define MT29F2G_ID 0xba /* x16, 2GiB */ #define MT29F4G_ID 0xbc /* x16, 4GiB */ @@ -154,6 +155,29 @@ static int NanD_Address(unsigned int numbytes, unsigned long ofs) return 0; } +int nand_readid(int *mfr, int *id) +{ + NAND_ENABLE_CE(); + + if (NanD_Command(NAND_CMD_RESET)) { + NAND_DISABLE_CE(); + return 1; + } + + if (NanD_Command(NAND_CMD_READID)) { + NAND_DISABLE_CE(); + return 1; + } + + NanD_Address(ADDR_COLUMN, 0); + + *mfr = READ_NAND(NAND_ADDR); + *id = READ_NAND(NAND_ADDR); + + NAND_DISABLE_CE(); + return 0; +} + /* read chip mfr and id * return 0 if they match board config * return 1 if not @@ -162,34 +186,39 @@ int nand_chip() { int mfr, id; - NAND_ENABLE_CE(); + NAND_ENABLE_CE(); - if (NanD_Command(NAND_CMD_RESET)) { - printf("Err: RESET\n"); - NAND_DISABLE_CE(); + if (NanD_Command(NAND_CMD_RESET)) { + printf("Err: RESET\n"); + NAND_DISABLE_CE(); return 1; } - if (NanD_Command(NAND_CMD_READID)) { - printf("Err: READID\n"); - NAND_DISABLE_CE(); + if (NanD_Command(NAND_CMD_READID)) { + printf("Err: READID\n"); + NAND_DISABLE_CE(); return 1; - } + } - NanD_Address(ADDR_COLUMN, 0); + NanD_Address(ADDR_COLUMN, 0); - mfr = READ_NAND(NAND_ADDR); + mfr = READ_NAND(NAND_ADDR); id = READ_NAND(NAND_ADDR); NAND_DISABLE_CE(); - if (((mfr == MT29F1G_MFR || mfr == MT29F1G_MFR2) && + if (((mfr == MT29F1G_MFR || mfr == MT29F1G_MFR2 || mfr == MT29F1G_MFR3) && (id == MT29F1G_ID || id == MT29F2G_ID || id == MT29F4G_ID)) || (mfr == K9F1G08R0A_MFR && (id == K9F1G08R0A_ID))) { return 0; } else { - printf("Unknown chip: mfr was 0x%02x, id was 0x%02x\n", mfr, id); - return 1; + if ((mfr == 0) && (id == 0)) { + printf("No NAND detected\n"); + return 0; + } else { + printf("Unknown chip: mfr was 0x%02x, id was 0x%02x\n", mfr, id); + return 1; + } } } |