From 5de615132dd634a3ee7a7bdfa2a06ca0515b2771 Mon Sep 17 00:00:00 2001 From: Michael Sparmann Date: Sun, 14 Mar 2010 15:41:40 +0000 Subject: Don't parallelize Nano2G NAND reads, just do pipelined ECC. (10% performance loss :-/ ) git-svn-id: svn://svn.rockbox.org/rockbox/trunk@25168 a1c6a512-1295-4272-9138-f99709370657 --- .../target/arm/s5l8700/ipodnano2g/nand-nano2g.c | 42 ++++++++++++---------- 1 file changed, 23 insertions(+), 19 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 ba1f0df534..cd38ede315 100644 --- a/firmware/target/arm/s5l8700/ipodnano2g/nand-nano2g.c +++ b/firmware/target/arm/s5l8700/ipodnano2g/nand-nano2g.c @@ -528,28 +528,20 @@ uint32_t nand_read_page_fast(uint32_t page, void* databuffer, nand_last_activity_value = current_tick; led(true); if (!nand_powered) nand_power_up(); - for (i = 0; i < 4; i++) + uint8_t status[4]; + for (i = 0; i < 4; i++) status[i] = (nand_type[i] == 0xFFFFFFFF); + if (!status[0]) { - if (nand_type[i] == 0xFFFFFFFF) continue; - nand_set_fmctrl0(i, FMCTRL0_ENABLEDMA); + nand_set_fmctrl0(0, FMCTRL0_ENABLEDMA); if (nand_send_cmd(NAND_CMD_READ)) - { - rc |= 1 << (i << 2); - continue; - } - if (nand_send_address(page, databuffer ? 0 : 0x800)) - { - rc |= 1 << (i << 2); - continue; - } - if (nand_send_cmd(NAND_CMD_READ2)) - { - rc |= 1 << (i << 2); - continue; - } + status[0] = 1; } - uint8_t status[4]; - for (i = 0; i < 4; i++) status[i] = (nand_type[i] == 0xFFFFFFFF); + if (!status[0]) + if (nand_send_address(page, 0)) + status[0] = 1; + if (!status[0]) + if (nand_send_cmd(NAND_CMD_READ2)) + status[0] = 1; if (!status[0]) if (nand_wait_status_ready(0)) status[0] = 1; @@ -561,6 +553,18 @@ uint32_t nand_read_page_fast(uint32_t page, void* databuffer, status[0] = 1; for (i = 1; i < 4; i++) { + if (!status[i]) + { + nand_set_fmctrl0(i, FMCTRL0_ENABLEDMA); + if (nand_send_cmd(NAND_CMD_READ)) + status[i] = 1; + } + if (!status[i]) + if (nand_send_address(page, 0)) + status[i] = 1; + if (!status[i]) + if (nand_send_cmd(NAND_CMD_READ2)) + status[i] = 1; if (!status[i]) if (nand_wait_status_ready(i)) status[i] = 1; -- cgit v1.2.3