X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fflash%2Farm_nandio.c;h=1b43b5f14fa1f84ade05e751290b9c26375d6c79;hb=c65d94f7d0e0c511794ea1f42ddf01e66f97e236;hp=4647c79487c6e91392e47c3d141f413340caf728;hpb=2958665f6b1239705a7dcc2b275810c394023f0f;p=fw%2Fopenocd diff --git a/src/flash/arm_nandio.c b/src/flash/arm_nandio.c index 4647c7948..1b43b5f14 100644 --- a/src/flash/arm_nandio.c +++ b/src/flash/arm_nandio.c @@ -25,7 +25,7 @@ #endif #include "arm_nandio.h" -#include "armv4_5.h" +#include #include /** @@ -40,7 +40,8 @@ * @param area Pointer to a pointer to a working area to copy code to * @return Success or failure of the operation */ -int arm_code_to_working_area(struct target *target, const uint32_t *code, unsigned code_size, +int arm_code_to_working_area(struct target *target, + const uint32_t *code, unsigned code_size, unsigned additional, struct working_area **area) { uint8_t code_buf[code_size]; @@ -48,6 +49,11 @@ int arm_code_to_working_area(struct target *target, const uint32_t *code, unsign int retval; unsigned size = code_size + additional; + /* REVISIT this assumes size doesn't ever change. + * That's usually correct; but there are boards with + * both large and small page chips, where it won't be... + */ + /* make sure we have a working area */ if (NULL == *area) { retval = target_alloc_working_area(target, size, area); @@ -109,7 +115,7 @@ int arm_nandwrite(struct arm_nand_data *nand, uint8_t *data, int size) 0xe1200070, /* e: bkpt #0 */ }; - if (!nand->copy_area) { + if (nand->op != ARM_NAND_WRITE || !nand->copy_area) { retval = arm_code_to_working_area(target, code, sizeof(code), nand->chunk_size, &nand->copy_area); if (retval != ERROR_OK) { @@ -117,6 +123,8 @@ int arm_nandwrite(struct arm_nand_data *nand, uint8_t *data, int size) } } + nand->op = ARM_NAND_WRITE; + /* copy data to work area */ target_buf = nand->copy_area->address + sizeof(code); retval = target_bulk_write_memory(target, target_buf, size / 4, data); @@ -192,7 +200,7 @@ int arm_nandread(struct arm_nand_data *nand, uint8_t *data, uint32_t size) }; /* create the copy area if not yet available */ - if (!nand->copy_area) { + if (nand->op != ARM_NAND_READ || !nand->copy_area) { retval = arm_code_to_working_area(target, code, sizeof(code), nand->chunk_size, &nand->copy_area); if (retval != ERROR_OK) { @@ -200,6 +208,7 @@ int arm_nandread(struct arm_nand_data *nand, uint8_t *data, uint32_t size) } } + nand->op = ARM_NAND_READ; target_buf = nand->copy_area->address + sizeof(code); /* set up algorithm and parameters */ @@ -223,7 +232,7 @@ int arm_nandread(struct arm_nand_data *nand, uint8_t *data, uint32_t size) retval = target_run_algorithm(target, 0, NULL, 3, reg_params, nand->copy_area->address, exit, 1000, &algo); if (retval != ERROR_OK) - LOG_ERROR("error executing hosted NAND write"); + LOG_ERROR("error executing hosted NAND read"); destroy_reg_param(®_params[0]); destroy_reg_param(®_params[1]);