X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fflash%2Farm_nandio.c;h=fdf2109bd74e65e8670e054a092186de66196457;hb=822c06d9e3983b37cd1830c594210973cb560991;hp=20a76f43cc27458ec25b6741006b41ecc3761b04;hpb=ffc704fdeb406abff1a61f4f6a0423535db939fd;p=fw%2Fopenocd diff --git a/src/flash/arm_nandio.c b/src/flash/arm_nandio.c index 20a76f43c..fdf2109bd 100644 --- a/src/flash/arm_nandio.c +++ b/src/flash/arm_nandio.c @@ -25,11 +25,50 @@ #endif #include "arm_nandio.h" -#include "armv4_5.h" -#include "algorithm.h" +#include +#include +/** + * Copies code to a working area. This will allocate room for the code plus the + * additional amount requested if the working area pointer is null. + * + * @param target Pointer to the target to copy code to + * @param code Pointer to the code area to be copied + * @param code_size Size of the code being copied + * @param additional Size of the additional area to be allocated in addition to + * code + * @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, + unsigned additional, struct working_area **area) +{ + uint8_t code_buf[code_size]; + unsigned i; + int retval; + unsigned size = code_size + additional; -/* + /* make sure we have a working area */ + if (NULL == *area) { + retval = target_alloc_working_area(target, size, area); + if (retval != ERROR_OK) { + LOG_DEBUG("%s: no %d byte buffer", __FUNCTION__, (int) size); + return ERROR_NAND_NO_BUFFER; + } + } + + /* buffer code in target endianness */ + for (i = 0; i < code_size / 4; i++) + target_buffer_set_u32(target, code_buf + i * 4, code[i]); + + /* copy code to work area */ + retval = target_write_memory(target, (*area)->address, + 4, code_size / 4, code_buf); + + return retval; +} + +/** * ARM-specific bulk write from buffer to address of 8-bit wide NAND. * For now this only supports ARMv4 and ARMv5 cores. * @@ -39,6 +78,11 @@ * Different code fragments could handle: * - Thumb2 cores like Cortex-M (needs different byteswapping) * - 16-bit wide data (needs different setup too) + * + * @param nand Pointer to the arm_nand_data struct that defines the I/O + * @param data Pointer to the data to be copied to flash + * @param size Size of the data being copied + * @return Success or failure of the operation */ int arm_nandwrite(struct arm_nand_data *nand, uint8_t *data, int size) { @@ -66,29 +110,11 @@ int arm_nandwrite(struct arm_nand_data *nand, uint8_t *data, int size) }; if (!nand->copy_area) { - uint8_t code_buf[sizeof(code)]; - unsigned i; - - /* make sure we have a working area */ - if (target_alloc_working_area(target, - sizeof(code) + nand->chunk_size, - &nand->copy_area) != ERROR_OK) { - LOG_DEBUG("%s: no %d byte buffer", - __FUNCTION__, - (int) sizeof(code) + nand->chunk_size); - return ERROR_NAND_NO_BUFFER; - } - - /* buffer code in target endianness */ - for (i = 0; i < sizeof(code) / 4; i++) - target_buffer_set_u32(target, code_buf + i * 4, code[i]); - - /* copy code to work area */ - retval = target_write_memory(target, - nand->copy_area->address, - 4, sizeof(code) / 4, code_buf); - if (retval != ERROR_OK) + retval = arm_code_to_working_area(target, code, sizeof(code), + nand->chunk_size, &nand->copy_area); + if (retval != ERROR_OK) { return retval; + } } /* copy data to work area */ @@ -138,8 +164,10 @@ int arm_nandwrite(struct arm_nand_data *nand, uint8_t *data, int size) * @param nand Pointer to the arm_nand_data struct that defines the I/O * @param data Pointer to the data buffer to store the read data * @param size Amount of data to be stored to the buffer. + * @return Success or failure of the operation */ -int arm_nandread(struct arm_nand_data *nand, uint8_t *data, uint32_t size) { +int arm_nandread(struct arm_nand_data *nand, uint8_t *data, uint32_t size) +{ struct target *target = nand->target; struct armv4_5_algorithm algo; struct arm *armv4_5 = target->arch_info; @@ -165,23 +193,8 @@ 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) { - uint8_t code_buf[sizeof(code)]; - unsigned i; - - /* make sure we have a working area */ - retval = target_alloc_working_area(target, sizeof(code) + nand->chunk_size, &nand->copy_area); - if (retval != ERROR_OK) { - LOG_DEBUG("%s: no %d byte buffer", __FUNCTION__, (int) sizeof(code) + nand->chunk_size); - return ERROR_NAND_NO_BUFFER; - } - - /* buffer code in target endianness */ - for (i = 0; i < sizeof(code) / 4; i++) { - target_buffer_set_u32(target, code_buf + i * 4, code[i]); - } - - /* copy code to work area */ - retval = target_write_memory(target, nand->copy_area->address, 4, sizeof(code) / 4, code_buf); + retval = arm_code_to_working_area(target, code, sizeof(code), + nand->chunk_size, &nand->copy_area); if (retval != ERROR_OK) { return retval; }