Mercurial > nand-ecoscentric
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));
