Index: firmware/target/arm/s5l8700/ipodnano2g/nand-nano2g.c =================================================================== --- firmware/target/arm/s5l8700/ipodnano2g/nand-nano2g.c (Revision 24333) +++ firmware/target/arm/s5l8700/ipodnano2g/nand-nano2g.c (Arbeitskopie) @@ -21,6 +21,7 @@ #include "config.h" +#include "panic.h" #include "system.h" #include "kernel.h" #include "cpu.h" @@ -188,6 +188,7 @@ if (nand_send_cmd(NAND_CMD_RESET)) return 1; if (nand_wait_chip_ready(bank)) return 1; FMCTRL1 = FMCTRL1_CLEARRFIFO | FMCTRL1_CLEARWFIFO; + sleep(0); return 0; } @@ -197,7 +198,7 @@ nand_set_fmctrl0(bank, 0); if ((FMCSTAT & (FMCSTAT_BANK0READY << bank))) FMCSTAT = (FMCSTAT_BANK0READY << bank); - FMCTRL1 = FMCTRL1_CLEARRFIFO | FMCTRL1_CLEARWFIFO; + FMCTRL1 = FMCTRL1_CLEARRFIFO; if (nand_send_cmd(NAND_CMD_GET_STATUS)) return 1; while (1) { @@ -234,6 +235,7 @@ if (!direction) invalidate_dcache(); if (nand_wait_addrdone()) return 1; if (!direction) FMCTRL1 = FMCTRL1_CLEARRFIFO | FMCTRL1_CLEARWFIFO; + else FMCTRL1 = FMCTRL1_CLEARRFIFO; /* that one avoids data corruption */ return 0; } @@ -298,7 +300,7 @@ FMCTRL1 = FMCTRL1_DOREADDATA; if (nand_wait_addrdone()) return nand_unlock(0xFFFFFFFF); result = FMFIFO; - FMCTRL1 = FMCTRL1_CLEARRFIFO | FMCTRL1_CLEARWFIFO; + FMCTRL1 = FMCTRL1_CLEARRFIFO; return nand_unlock(result); } @@ -331,7 +333,14 @@ pmu_ldo_power_on(4); sleep(HZ / 20); nand_last_activity_value = current_tick; - for (i = 0; i < 4; i++) nand_reset(i); + for (i = 0; i < 4; i++) + { + if(nand_reset(i)) + { + if(nand_type[i] != 0xFFFFFFFF) /* this bank exists and reset failed */ + panicf("nand_power_up: nand_reset(bank=%d) failed.",(unsigned int)i); + } + } nand_powered = 1; nand_last_activity_value = current_tick; mutex_unlock(&nand_mtx);