Index: firmware/export/s5l8700.h =================================================================== --- firmware/export/s5l8700.h (Revision 23621) +++ firmware/export/s5l8700.h (Arbeitskopie) @@ -389,6 +389,11 @@ #define FMCSTAT_BANK2READY (1 << 6) #define FMCSTAT_BANK3READY (1 << 7) +/* described in the s5l8700 datasheet(there is a little typo: FCMSTAT vs. FMCSTAT) */ +#define FMCSTAT_WFIFO_HEMPTY (1 << 5) +#define FMCSTAT_WFIFO_EMPTY (1 << 8) + + /* 13. SECURE DIGITAL CARD INTERFACE (SDCI) */ #define SDCI_CTRL (*(REG32_PTR_T)(0x3C300000)) /* Control Register */ #define SDCI_DCTRL (*(REG32_PTR_T)(0x3C300004)) /* Data Control Register */ Index: firmware/target/arm/s5l8700/ipodnano2g/nand-nano2g.c =================================================================== --- firmware/target/arm/s5l8700/ipodnano2g/nand-nano2g.c (Revision 23621) +++ firmware/target/arm/s5l8700/ipodnano2g/nand-nano2g.c (Arbeitskopie) @@ -125,6 +125,12 @@ } } +uint32_t nand_wait_fifo_done(void) +{ + while((!(FMCSTAT & FMCSTAT_WFIFO_EMPTY))&&(!(FMCSTAT & FMCSTAT_WFIFO_HEMPTY))); + return 0; +} + uint32_t nand_wait_rbbdone(void) { long timeout = current_tick + HZ / 50; @@ -186,8 +192,9 @@ { nand_set_fmctrl0(bank, 0); if (nand_send_cmd(NAND_CMD_RESET)) return 1; if (nand_wait_chip_ready(bank)) return 1; FMCTRL1 = FMCTRL1_CLEARRFIFO | FMCTRL1_CLEARWFIFO; + if(nand_wait_fifo_done()) return 1; return 0; } @@ -198,6 +205,7 @@ if ((FMCSTAT & (FMCSTAT_BANK0READY << bank))) FMCSTAT = (FMCSTAT_BANK0READY << bank); FMCTRL1 = FMCTRL1_CLEARRFIFO | FMCTRL1_CLEARWFIFO; + if(nand_wait_fifo_done()) return 1; if (nand_send_cmd(NAND_CMD_GET_STATUS)) return 1; while (1) { @@ -207,6 +215,7 @@ if (nand_wait_addrdone()) return 1; if ((FMFIFO & NAND_STATUS_READY)) break; FMCTRL1 = FMCTRL1_CLEARRFIFO; + } FMCTRL1 = FMCTRL1_CLEARRFIFO; return nand_send_cmd(NAND_CMD_READ); @@ -233,7 +242,11 @@ if (nand_timeout(timeout)) return 1; if (!direction) invalidate_dcache(); if (nand_wait_addrdone()) return 1; - if (!direction) FMCTRL1 = FMCTRL1_CLEARRFIFO | FMCTRL1_CLEARWFIFO; + if (!direction) + { + FMCTRL1 = FMCTRL1_CLEARRFIFO | FMCTRL1_CLEARWFIFO; + nand_wait_fifo_done(); + } return 0; } @@ -299,6 +312,7 @@ if (nand_wait_addrdone()) return nand_unlock(0xFFFFFFFF); result = FMFIFO; FMCTRL1 = FMCTRL1_CLEARRFIFO | FMCTRL1_CLEARWFIFO; + if(nand_wait_fifo_done()) return 1; return nand_unlock(result); }