diff packages/io/nand/current/src/nand.c @ 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 4cce65f46b89
line wrap: on
line diff
--- 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));