From 12e302262d8d47f8a5ed1b38fa1c89d49c3a08b6 Mon Sep 17 00:00:00 2001 From: Michael Sparmann Date: Sun, 31 Jan 2010 13:46:25 +0000 Subject: iPod Nano 2G NAND fixes by Franz-Josef Haider git-svn-id: svn://svn.rockbox.org/rockbox/trunk@24414 a1c6a512-1295-4272-9138-f99709370657 --- firmware/target/arm/s5l8700/ipodnano2g/nand-nano2g.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) (limited to 'firmware/target/arm/s5l8700/ipodnano2g') diff --git a/firmware/target/arm/s5l8700/ipodnano2g/nand-nano2g.c b/firmware/target/arm/s5l8700/ipodnano2g/nand-nano2g.c index 73673cdd67..d4839893d3 100644 --- a/firmware/target/arm/s5l8700/ipodnano2g/nand-nano2g.c +++ b/firmware/target/arm/s5l8700/ipodnano2g/nand-nano2g.c @@ -21,6 +21,7 @@ #include "config.h" +#include "panic.h" #include "system.h" #include "kernel.h" #include "cpu.h" @@ -188,6 +189,7 @@ uint32_t nand_reset(uint32_t bank) 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 +199,7 @@ uint32_t nand_wait_status_ready(uint32_t bank) 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 +236,7 @@ uint32_t nand_transfer_data(uint32_t bank, uint32_t direction, if (!direction) invalidate_dcache(); if (nand_wait_addrdone()) return 1; if (!direction) FMCTRL1 = FMCTRL1_CLEARRFIFO | FMCTRL1_CLEARWFIFO; + else FMCTRL1 = FMCTRL1_CLEARRFIFO; return 0; } @@ -298,7 +301,7 @@ uint32_t nand_get_chip_type(uint32_t bank) 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 +334,14 @@ void nand_power_up(void) 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_type[i] != 0xFFFFFFFF) + { + if(nand_reset(i)) + if(nand_reset(i)) 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); -- cgit v1.2.3