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