changeset 3391:46870ac5c312

io/nand: Create internal nandi_write_page_raw_explicit_ecc interface for use by test programs.
author Ross Younger <wry@ecoscentric.com>
date Mon, 20 Oct 2014 21:06:39 +1300
parents 9b8c245fbdef
children cc4cb48d90ad
files packages/io/nand/current/ChangeLog packages/io/nand/current/include/nand_internal.h packages/io/nand/current/src/nand.c
diffstat 3 files changed, 28 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/packages/io/nand/current/ChangeLog
+++ b/packages/io/nand/current/ChangeLog
@@ -1,3 +1,8 @@
+2014-10-20  Ross Younger  <wry@ecoscentric.com>
+
+	* src/nand.c include/nand_internal.h: Create internal
+	nandi_write_page_raw_explicit_ecc interface for use by test programs.
+
 2014-10-05  Ross Younger  <wry@ecoscentric.com>
 
 	* include/nand.h: Create CYG_NAND_BYTES_PER_BLOCK so this
--- a/packages/io/nand/current/include/nand_internal.h
+++ b/packages/io/nand/current/include/nand_internal.h
@@ -76,6 +76,18 @@ int nandi_write_page_raw(cyg_nand_device
                          const CYG_BYTE * src,
                          const CYG_BYTE * spare, size_t spare_size);
 
+/* Takes a DEVICE address. Caller must hold the devlock!
+ * 'ecc' overrides the ECC read from the algorithm.
+ * This is for use by code which tests how well the ECC algorithm
+ * is performing.
+ * 'ecc_size' must match CYG_NAND_ECCPERPAGE(dev).
+ */
+int nandi_write_page_raw_explicit_ecc(
+                         cyg_nand_device *dev, cyg_nand_page_addr page,
+                         const CYG_BYTE * src,
+                         const CYG_BYTE * spare, size_t spare_size,
+                         const CYG_BYTE * ecc, size_t ecc_size);
+
 /* NOTE for driver authors:
  * If calling these functions from within a plf_partition_setup function,
  * i.e. within the cyg_nand_lookup call chain, the device lock is
--- a/packages/io/nand/current/src/nand.c
+++ b/packages/io/nand/current/src/nand.c
@@ -574,7 +574,7 @@ int cyg_nandp_write_page(cyg_nand_partit
 #endif
     LOCK_DEV(dev);
     locked = 1;
-    EG(nandi_write_page_raw(dev, page, src, spare, spare_size));
+    EG(nandi_write_page_raw_explicit_ecc(dev, page, src, spare, spare_size, 0, 0));
 
 err_exit:
     if (locked) UNLOCK_DEV(dev);
@@ -588,6 +588,13 @@ err_exit:
 int nandi_write_page_raw(cyg_nand_device *dev, cyg_nand_page_addr page,
         const CYG_BYTE * src, const CYG_BYTE * spare, size_t spare_size)
 {
+    return nandi_write_page_raw_explicit_ecc(dev, page, src, spare, spare_size, 0, 0);
+}
+
+__externC
+int nandi_write_page_raw_explicit_ecc(cyg_nand_device *dev, cyg_nand_page_addr page,
+        const CYG_BYTE * src, const CYG_BYTE * spare, size_t spare_size, const CYG_BYTE * xecc, size_t xecc_size)
+{
 #ifdef CYGSEM_IO_NAND_READONLY
     return -EROFS;
 #else
@@ -595,6 +602,8 @@ int nandi_write_page_raw(cyg_nand_device
     CYG_BYTE oob_packed[dev->spare_per_page];
     CYG_BYTE ecc[CYG_NAND_ECCPERPAGE(dev)];
 
+    CYG_ASSERTC((xecc_size==0) || (xecc_size==CYG_NAND_ECCPERPAGE(dev)));
+
     const int do_hw_ecc = (dev->ecc->flags & NAND_ECC_FLAG_IS_HARDWARE);
     const unsigned write_data_stride = do_hw_ecc ? dev->ecc->data_size : CYG_NAND_BYTES_PER_PAGE(dev);
     const unsigned ecc_data_stride = dev->ecc->data_size;
@@ -646,6 +655,7 @@ int nandi_write_page_raw(cyg_nand_device
     }
     TIMETAG();
 
+    if (xecc_size) memcpy(&ecc[0], xecc, xecc_size);
     nand_oob_pack(dev, spare, spare_size, ecc, oob_packed);
     NAND_CHATTER(8,dev,"Write page %u\n", page);
     EG(dev->fns->write_finish(dev, oob_packed, dev->spare_per_page));