Added a new function to encapsulate reading a page of data from a NAND device
using either the read_block_data function of a NAND controller or to use direct
reading of data from the NAND device. This also adds some performance
enhancements and uses the read_data function if the read_block_data function
fails.
---
src/flash/nand/core.c | 67 ++++++++++++++++---------------------------------
src/flash/nand/core.h | 2 +
2 files changed, 24 insertions(+), 45 deletions(-)
diff --git a/src/flash/nand/core.c b/src/flash/nand/core.c
index 044f4e2..de601b4 100644
--- a/src/flash/nand/core.c
+++ b/src/flash/nand/core.c
@@ -742,11 +742,30 @@ int nand_page_command(struct nand_device *nand, uint32_t
page,
return ERROR_OK;
}
+int nand_read_data_page(struct nand_device *nand, uint8_t *data, uint32_t size)
+{
+ uint32_t i;
+ int retval = ERROR_NAND_OPERATION_FAILED;
+
+ if (nand->controller->read_block_data != NULL) {
+ retval = (nand->controller->read_block_data)(nand, data, size);
+ }
+
+ if (ERROR_NAND_NO_BUFFER == retval) {
+ int incr = (nand->device->options & NAND_BUSWIDTH_16) ? 2 : 1;
+ for (i = 0; i < size; i += incr) {
+ nand->controller->read_data(nand, data);
+ data += incr;
+ }
+ }
+
+ return ERROR_OK;
+}
+
int nand_read_page_raw(struct nand_device *nand, uint32_t page,
uint8_t *data, uint32_t data_size,
uint8_t *oob, uint32_t oob_size)
{
- uint32_t i;
int retval;
retval = nand_page_command(nand, page, NAND_CMD_READ0, !data);
@@ -754,52 +773,10 @@ int nand_read_page_raw(struct nand_device *nand, uint32_t
page,
return retval;
if (data)
- {
- if (nand->controller->read_block_data != NULL)
- (nand->controller->read_block_data)(nand, data,
data_size);
- else
- {
- for (i = 0; i < data_size;)
- {
- if (nand->device->options & NAND_BUSWIDTH_16)
- {
- nand->controller->read_data(nand, data);
- data += 2;
- i += 2;
- }
- else
- {
- nand->controller->read_data(nand, data);
- data += 1;
- i += 1;
- }
- }
- }
- }
+ nand_read_data_page(nand, data, data_size);
if (oob)
- {
- if (nand->controller->read_block_data != NULL)
- (nand->controller->read_block_data)(nand, oob,
oob_size);
- else
- {
- for (i = 0; i < oob_size;)
- {
- if (nand->device->options & NAND_BUSWIDTH_16)
- {
- nand->controller->read_data(nand, oob);
- oob += 2;
- i += 2;
- }
- else
- {
- nand->controller->read_data(nand, oob);
- oob += 1;
- i += 1;
- }
- }
- }
- }
+ nand_read_data_page(nand, oob, oob_size);
return ERROR_OK;
}
diff --git a/src/flash/nand/core.h b/src/flash/nand/core.h
index b8dc01c..990114a 100644
--- a/src/flash/nand/core.h
+++ b/src/flash/nand/core.h
@@ -211,6 +211,8 @@ struct nand_device *get_nand_device_by_num(int num);
int nand_page_command(struct nand_device *nand, uint32_t page,
uint8_t cmd, bool oob_only);
+int nand_read_data_page(struct nand_device *nand, uint8_t *data, uint32_t
size);
+
int nand_read_page_raw(struct nand_device *nand, uint32_t page,
uint8_t *data, uint32_t data_size, uint8_t *oob, uint32_t
oob_size);
int nand_write_page_raw(struct nand_device *nand, uint32_t page,
--
1.6.5.2
_______________________________________________
Openocd-development mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/openocd-development