summaryrefslogtreecommitdiffstats
path: root/firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c
diff options
context:
space:
mode:
authorMichael Sparmann <theseven@rockbox.org>2010-03-13 20:20:07 +0000
committerMichael Sparmann <theseven@rockbox.org>2010-03-13 20:20:07 +0000
commit2cfd0f2e7339e58f9c2cff70eda1aa9fc020a8b8 (patch)
treee2a912d28cfeaaccee6bbc32e2c0a9521543baab /firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c
parent1a7e090b41ac1dd9a54d51952df8adbee521c147 (diff)
downloadrockbox-2cfd0f2e7339e58f9c2cff70eda1aa9fc020a8b8.tar.gz
rockbox-2cfd0f2e7339e58f9c2cff70eda1aa9fc020a8b8.zip
Implement Nano2G VFL multi-page read API (as a dummy for now)
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@25145 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c')
-rw-r--r--firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c32
1 files changed, 23 insertions, 9 deletions
diff --git a/firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c b/firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c
index 23fc8b8543..ed594b42e3 100644
--- a/firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c
+++ b/firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c
@@ -852,7 +852,7 @@ uint32_t ftl_vfl_read(uint32_t vpage, void* buffer, void* sparebuffer,
#ifndef FTL_READONLY
/* Writes the specified vPage, dealing with all kinds of trouble */
-uint32_t ftl_vfl_write(uint32_t vpage, void* buffer, void* sparebuffer)
+uint32_t ftl_vfl_write_single(uint32_t vpage, void* buffer, void* sparebuffer)
{
uint32_t ppb = (*ftl_nand_type).pagesperblock * ftl_banks;
uint32_t syshyperblocks = (*ftl_nand_type).blocks
@@ -884,6 +884,20 @@ uint32_t ftl_vfl_write(uint32_t vpage, void* buffer, void* sparebuffer)
#endif
+#ifndef FTL_READONLY
+/* Writes the specified vPage, dealing with all kinds of trouble */
+uint32_t ftl_vfl_write(uint32_t vpage, uint32_t count, void* buffer, void* sparebuffer)
+{
+ uint32_t i;
+ for (i = 0; i < count; i++)
+ {
+ uint32_t rc = ftl_vfl_write_single(vpage + i, buffer, sparebuffer);
+ if (rc) return rc;
+ }
+}
+#endif
+
+
/* Mounts the VFL on all banks */
uint32_t ftl_vfl_open(void)
{
@@ -1258,7 +1272,7 @@ uint32_t ftl_save_erasectr_page(uint32_t index)
ftl_sparebuffer[0].meta.usn = ftl_cxt.usn;
ftl_sparebuffer[0].meta.idx = index;
ftl_sparebuffer[0].meta.type = 0x46;
- if (ftl_vfl_write(ftl_cxt.ftlctrlpage, &ftl_erasectr[index << 10],
+ if (ftl_vfl_write(ftl_cxt.ftlctrlpage, 1, &ftl_erasectr[index << 10],
&ftl_sparebuffer[0]) != 0)
return 1;
if ((ftl_vfl_read(ftl_cxt.ftlctrlpage, ftl_buffer,
@@ -1330,7 +1344,7 @@ uint32_t ftl_copy_page(uint32_t source, uint32_t destination,
else if (rc != 0) ftl_copyspare[0].user.eccmark = 0x55;
if (type == 1 && destination % ppb == ppb - 1)
ftl_copyspare[0].user.type = 0x41;
- return ftl_vfl_write(destination, ftl_copybuffer[0], &ftl_copyspare[0]);
+ return ftl_vfl_write(destination, 1, ftl_copybuffer[0], &ftl_copyspare[0]);
}
#endif
@@ -1352,7 +1366,7 @@ uint32_t ftl_copy_block(uint32_t source, uint32_t destination)
ftl_sparebuffer[0].user.type = 0x40;
if (rc != 0) ftl_sparebuffer[0].user.eccmark = 0x55;
if (i == ppb - 1) ftl_sparebuffer[0].user.type = 0x41;
- if (ftl_vfl_write(destination * ppb + i,
+ if (ftl_vfl_write(destination * ppb + i, 1,
ftl_copybuffer[0], &ftl_sparebuffer[0]) != 0)
{
error = 1;
@@ -1614,7 +1628,7 @@ uint32_t ftl_commit_cxt(void)
ftl_sparebuffer[0].meta.usn = ftl_cxt.usn;
ftl_sparebuffer[0].meta.idx = i;
ftl_sparebuffer[0].meta.type = 0x44;
- if (ftl_vfl_write(ftl_cxt.ftlctrlpage, &ftl_map[i << 10],
+ if (ftl_vfl_write(ftl_cxt.ftlctrlpage, 1, &ftl_map[i << 10],
&ftl_sparebuffer[0]) != 0)
return 1;
ftl_cxt.ftl_map_pages[i] = ftl_cxt.ftlctrlpage;
@@ -1624,7 +1638,7 @@ uint32_t ftl_commit_cxt(void)
memset(&ftl_sparebuffer[0], 0xFF, 0x40);
ftl_sparebuffer[0].meta.usn = ftl_cxt.usn;
ftl_sparebuffer[0].meta.type = 0x43;
- if (ftl_vfl_write(ftl_cxt.ftlctrlpage, &ftl_cxt, &ftl_sparebuffer[0]) != 0)
+ if (ftl_vfl_write(ftl_cxt.ftlctrlpage, 1, &ftl_cxt, &ftl_sparebuffer[0]) != 0)
return 1;
return 0;
}
@@ -1701,7 +1715,7 @@ uint32_t ftl_write(uint32_t sector, uint32_t count, const void* buffer)
memset(&ftl_sparebuffer[0], 0xFF, 0x40);
ftl_sparebuffer[0].meta.usn = ftl_cxt.usn;
ftl_sparebuffer[0].meta.type = 0x47;
- if (ftl_vfl_write(ftl_cxt.ftlctrlpage, ftl_buffer,
+ if (ftl_vfl_write(ftl_cxt.ftlctrlpage, 1, ftl_buffer,
&ftl_sparebuffer[0]) == 0)
break;
}
@@ -1746,7 +1760,7 @@ uint32_t ftl_write(uint32_t sector, uint32_t count, const void* buffer)
ftl_sparebuffer[0].user.usn = ftl_cxt.nextblockusn;
ftl_sparebuffer[0].user.type = 0x40;
if (j == ppb - 1) ftl_sparebuffer[0].user.type = 0x41;
- while (ftl_vfl_write(vblock * ppb + j,
+ while (ftl_vfl_write(vblock * ppb + j, 1,
&((uint8_t*)buffer)[(i + j) << 11],
&ftl_sparebuffer[0]) != 0);
}
@@ -1772,7 +1786,7 @@ uint32_t ftl_write(uint32_t sector, uint32_t count, const void* buffer)
ftl_sparebuffer[0].user.type = 0x40;
uint32_t abspage = (*logentry).scatteredvblock * ppb
+ (*logentry).pagesused++;
- if (ftl_vfl_write(abspage, &((uint8_t*)buffer)[i << 11],
+ if (ftl_vfl_write(abspage, 1, &((uint8_t*)buffer)[i << 11],
&ftl_sparebuffer[0]) == 0)
{
if ((*logentry).pageoffsets[page] == 0xFFFF)