summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Sparmann <theseven@rockbox.org>2010-03-14 15:41:40 +0000
committerMichael Sparmann <theseven@rockbox.org>2010-03-14 15:41:40 +0000
commit5de615132dd634a3ee7a7bdfa2a06ca0515b2771 (patch)
tree29fca0cfd6b53562aeacc7751becd46271ef5d75
parent183e9f152015c77259513567bbc3e8ad3e674dfd (diff)
downloadrockbox-5de615132dd634a3ee7a7bdfa2a06ca0515b2771.zip
rockbox-5de615132dd634a3ee7a7bdfa2a06ca0515b2771.tar.gz
rockbox-5de615132dd634a3ee7a7bdfa2a06ca0515b2771.tar.bz2
rockbox-5de615132dd634a3ee7a7bdfa2a06ca0515b2771.tar.xz
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
-rw-r--r--firmware/target/arm/s5l8700/ipodnano2g/nand-nano2g.c42
1 files changed, 23 insertions, 19 deletions
diff --git a/firmware/target/arm/s5l8700/ipodnano2g/nand-nano2g.c b/firmware/target/arm/s5l8700/ipodnano2g/nand-nano2g.c
index ba1f0df..cd38ede 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;
@@ -562,6 +554,18 @@ uint32_t nand_read_page_fast(uint32_t page, void* databuffer,
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;
if (!status[i])