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

Reply via email to