Hi, included is a patch that adds possibility to supply erase_page function in a driver, overriding the default behaviour of core.c
From 7fa880bfe5a541b1b5df520cf023268491d4ca2e Mon Sep 17 00:00:00 2001 From: Marek Vasut <marek.va...@gmail.com> Date: Sat, 12 Dec 2009 00:39:54 +0100 Subject: [PATCH] NAND: Add erase_page callback
Signed-off-by: Marek Vasut <marek.va...@gmail.com> --- src/flash/nand/core.c | 59 ++++++++++++++++++++++++++-------------------- src/flash/nand/driver.h | 3 ++ 2 files changed, 36 insertions(+), 26 deletions(-) diff --git a/src/flash/nand/core.c b/src/flash/nand/core.c index d52cf5d..1ee2813 100644 --- a/src/flash/nand/core.c +++ b/src/flash/nand/core.c @@ -536,39 +536,46 @@ int nand_erase(struct nand_device *nand, int first_block, int last_block) for (i = first_block; i <= last_block; i++) { - /* Send erase setup command */ - nand->controller->command(nand, NAND_CMD_ERASE1); - page = i * (nand->erase_size / nand->page_size); - /* Send page address */ - if (nand->page_size <= 512) + if (nand->controller->erase_page) { - /* row */ - nand->controller->address(nand, page & 0xff); - nand->controller->address(nand, (page >> 8) & 0xff); - - /* 3rd cycle only on devices with more than 32 MiB */ - if (nand->address_cycles >= 4) - nand->controller->address(nand, (page >> 16) & 0xff); - - /* 4th cycle only on devices with more than 8 GiB */ - if (nand->address_cycles >= 5) - nand->controller->address(nand, (page >> 24) & 0xff); + nand->controller->erase_page(nand, page); } else { - /* row */ - nand->controller->address(nand, page & 0xff); - nand->controller->address(nand, (page >> 8) & 0xff); + /* Send erase setup command */ + nand->controller->command(nand, NAND_CMD_ERASE1); - /* 3rd cycle only on devices with more than 128 MiB */ - if (nand->address_cycles >= 5) - nand->controller->address(nand, (page >> 16) & 0xff); - } + /* Send page address */ + if (nand->page_size <= 512) + { + /* row */ + nand->controller->address(nand, page & 0xff); + nand->controller->address(nand, (page >> 8) & 0xff); + + /* 3rd cycle only on devices with more than 32 MiB */ + if (nand->address_cycles >= 4) + nand->controller->address(nand, (page >> 16) & 0xff); - /* Send erase confirm command */ - nand->controller->command(nand, NAND_CMD_ERASE2); + /* 4th cycle only on devices with more than 8 GiB */ + if (nand->address_cycles >= 5) + nand->controller->address(nand, (page >> 24) & 0xff); + } + else + { + /* row */ + nand->controller->address(nand, page & 0xff); + nand->controller->address(nand, (page >> 8) & 0xff); + + /* 3rd cycle only on devices with more than 128 MiB */ + if (nand->address_cycles >= 5) + nand->controller->address(nand, (page >> 16) & 0xff); + } + + /* Send erase confirm command */ + nand->controller->command(nand, NAND_CMD_ERASE2); + } retval = nand->controller->nand_ready ? nand->controller->nand_ready(nand, 1000) : diff --git a/src/flash/nand/driver.h b/src/flash/nand/driver.h index fe73e90..402b2ba 100644 --- a/src/flash/nand/driver.h +++ b/src/flash/nand/driver.h @@ -75,6 +75,9 @@ struct nand_flash_controller /** Read a page from the NAND device. */ int (*read_page)(struct nand_device *nand, uint32_t page, uint8_t *data, uint32_t data_size, uint8_t *oob, uint32_t oob_size); + /** Erase a page from the NAND device. */ + int (*erase_page)(struct nand_device *nand, uint32_t page); + /** Check if the controller is ready for more instructions with timeout. */ int (*controller_ready)(struct nand_device *nand, int timeout); -- 1.6.5
_______________________________________________ Openocd-development mailing list Openocd-development@lists.berlios.de https://lists.berlios.de/mailman/listinfo/openocd-development