changeset 2973:82fb78794a87

st nand: add read_part_page support, tidy a little
author Ross Younger <wry@ecoscentric.com>
date Mon, 09 Nov 2009 16:33:25 +0000
parents 102e0529ace7
children 54682dd5e6fe
files packages/devs/nand/st/nandxxxx3a/current/ChangeLog packages/devs/nand/st/nandxxxx3a/current/include/nandxxxx3a.inl
diffstat 2 files changed, 33 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/packages/devs/nand/st/nandxxxx3a/current/ChangeLog
+++ b/packages/devs/nand/st/nandxxxx3a/current/ChangeLog
@@ -1,3 +1,7 @@
+2009-11-09  Ross Younger  <wry@ecoscentric.com>
+
+	* Driver update: add read_part_page function.
+
 2009-11-06  Ross Younger  <wry@ecoscentric.com>
 
 	* nand_st_xxxx3a.sgml: Remove link to cortexm hal.
--- a/packages/devs/nand/st/nandxxxx3a/current/include/nandxxxx3a.inl
+++ b/packages/devs/nand/st/nandxxxx3a/current/include/nandxxxx3a.inl
@@ -198,8 +198,7 @@ static int nandxxxx3a_read_begin(cyg_nan
 static int nandxxxx3a_read_stride(cyg_nand_device *dev, void *dest, size_t size)
 {
     //struct nandxxxx3a_priv *priv = dev->priv;
-    if (dest && size)
-        read_data_bulk(dev, dest, size);
+    read_data_bulk(dev, dest, size);
     return 0;
 }
 
@@ -218,6 +217,29 @@ static int nandxxxx3a_read_finish(cyg_na
     return 0;
 }
 
+static int nandxxxx3a_read_part(cyg_nand_device *dev, void *dest,
+                        cyg_nand_page_addr page, size_t offset, size_t length)
+{
+    //struct nandxxxx3a_priv *priv = dev->priv;
+
+    NAND_CHATTER(7,dev,"Reading page %d (partial; offset %d, length %d)\n",
+                 page, offset, length);
+
+    cyg_nand_column_addr col = offset & 0xff;
+    CYG_BYTE cmd = offset & 256 ? 1 /* READ_B */ : 0 /* READ_A */;
+    LOCK(dev);
+
+    write_cmd(dev, cmd);
+    write_addr(dev, page, col);
+    wait_ready_or_time(dev, 1, 12);
+    read_data_bulk(dev, dest, length);
+
+    // read A? read B?
+    UNLOCK(dev);
+    return 0;
+}
+
+
 static int nandxxxx3a_write_begin(cyg_nand_device *dev, cyg_nand_page_addr page)
 {
     struct nandxxxx3a_priv *priv = dev->priv;
@@ -235,10 +257,8 @@ static int nandxxxx3a_write_stride(cyg_n
                                    const void *src, size_t size)
 {
     struct nandxxxx3a_priv *priv = dev->priv;
-    if (src && size) {
-        write_data_bulk(dev, src, size);
-        priv->written += size;
-    }
+    write_data_bulk(dev, src, size);
+    priv->written += size;
     return 0;
 }
 
@@ -334,7 +354,9 @@ static int nandxxxx3a_factorybad(cyg_nan
 
 CYG_NAND_FUNS_V2(nandxxxx3a_funs, nandxxxx3a_devinit,
                  nandxxxx3a_read_begin, nandxxxx3a_read_stride,
-                 nandxxxx3a_read_finish, nandxxxx3a_write_begin,
+                 nandxxxx3a_read_finish,
+                 nandxxxx3a_read_part,
+                 nandxxxx3a_write_begin,
                  nandxxxx3a_write_stride, nandxxxx3a_write_finish,
                  nandxxxx3a_erase_block,
                  nandxxxx3a_factorybad);