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

Reply via email to