Rolf Meeser <rolfm_9dq@yahoo.de> adds flash support for NXP's LPC2900 family (ARM968E).
[fw/openocd] / src / flash / flash.c
index 212b6de776ef508c0297d66ef19472950e26ea2d..e73dfa7013faa7e88774a8a5a3a31df49af8ca50 100644 (file)
@@ -2,7 +2,7 @@
  *   Copyright (C) 2005 by Dominic Rath                                    *
  *   Dominic.Rath@gmx.de                                                   *
  *                                                                         *
- *   Copyright (C) 2007,2008 Øyvind Harboe                                 *
+ *   Copyright (C) 2007,2008 Øyvind Harboe                                 *
  *   oyvind.harboe@zylin.com                                               *
  *                                                                         *
  *   Copyright (C) 2008 by Spencer Oliver                                  *
 #endif
 
 #include "flash.h"
-#include "command.h"
-#include "target.h"
-#include "time_support.h"
-#include "fileio.h"
 #include "image.h"
-#include "log.h"
-#include "armv4_5.h"
-#include "algorithm.h"
-#include "binarybuffer.h"
-#include "armv7m.h"
-
-#include <string.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <errno.h>
-#include <inttypes.h>
+#include "time_support.h"
 
 /* command handlers */
 static int handle_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
@@ -63,9 +47,11 @@ static int handle_flash_protect_command(struct command_context_s *cmd_ctx, char
 /* flash drivers
  */
 extern flash_driver_t lpc2000_flash;
+extern flash_driver_t lpc288x_flash;
+extern flash_driver_t lpc2900_flash;
 extern flash_driver_t cfi_flash;
+extern flash_driver_t at91sam3_flash;
 extern flash_driver_t at91sam7_flash;
-extern flash_driver_t at91sam7_old_flash;
 extern flash_driver_t str7x_flash;
 extern flash_driver_t str9x_flash;
 extern flash_driver_t aduc702x_flash;
@@ -74,15 +60,17 @@ extern flash_driver_t str9xpec_flash;
 extern flash_driver_t stm32x_flash;
 extern flash_driver_t tms470_flash;
 extern flash_driver_t ecosflash_flash;
-extern flash_driver_t lpc288x_flash;
 extern flash_driver_t ocl_flash;
 extern flash_driver_t pic32mx_flash;
+extern flash_driver_t avr_flash;
 
 flash_driver_t *flash_drivers[] = {
        &lpc2000_flash,
+       &lpc288x_flash,
+       &lpc2900_flash,
        &cfi_flash,
        &at91sam7_flash,
-       &at91sam7_old_flash,
+       &at91sam3_flash,
        &str7x_flash,
        &str9x_flash,
        &aduc702x_flash,
@@ -91,9 +79,9 @@ flash_driver_t *flash_drivers[] = {
        &stm32x_flash,
        &tms470_flash,
        &ecosflash_flash,
-       &lpc288x_flash,
        &ocl_flash,
        &pic32mx_flash,
+       &avr_flash,
        NULL,
 };
 
@@ -101,14 +89,15 @@ flash_bank_t *flash_banks;
 static         command_t *flash_cmd;
 
 /* wafer thin wrapper for invoking the flash driver */
-static int flash_driver_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count)
+static int flash_driver_write(struct flash_bank_s *bank, uint8_t *buffer, uint32_t offset, uint32_t count)
 {
        int retval;
 
-       retval=bank->driver->write(bank, buffer, offset, count);
-       if (retval!=ERROR_OK)
+       retval = bank->driver->write(bank, buffer, offset, count);
+       if (retval != ERROR_OK)
        {
-               LOG_ERROR("error writing to flash at address 0x%08x at offset 0x%8.8x (%d)", bank->base, offset, retval);
+               LOG_ERROR("error writing to flash at address 0x%08" PRIx32 " at offset 0x%8.8" PRIx32 " (%d)",
+                         bank->base, offset, retval);
        }
 
        return retval;
@@ -118,8 +107,8 @@ static int flash_driver_erase(struct flash_bank_s *bank, int first, int last)
 {
        int retval;
 
-       retval=bank->driver->erase(bank, first, last);
-       if (retval!=ERROR_OK)
+       retval = bank->driver->erase(bank, first, last);
+       if (retval != ERROR_OK)
        {
                LOG_ERROR("failed erasing sectors %d to %d (%d)", first, last, retval);
        }
@@ -131,8 +120,8 @@ int flash_driver_protect(struct flash_bank_s *bank, int set, int first, int last
 {
        int retval;
 
-       retval=bank->driver->protect(bank, set, first, last);
-       if (retval!=ERROR_OK)
+       retval = bank->driver->protect(bank, set, first, last);
+       if (retval != ERROR_OK)
        {
                LOG_ERROR("failed setting protection for areas %d to %d (%d)", first, last, retval);
        }
@@ -157,10 +146,10 @@ static int jim_flash_banks(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
                return JIM_ERR;
        }
 
-       Jim_Obj *list=Jim_NewListObj(interp, NULL, 0);
+       Jim_Obj *list = Jim_NewListObj(interp, NULL, 0);
        for (p = flash_banks; p; p = p->next)
        {
-               Jim_Obj *elem=Jim_NewListObj(interp, NULL, 0);
+               Jim_Obj *elem = Jim_NewListObj(interp, NULL, 0);
 
                Jim_ListAppendElement(interp, elem, Jim_NewStringObj(interp, "name", -1));
                Jim_ListAppendElement(interp, elem, Jim_NewStringObj(interp, p->driver->name, -1));
@@ -212,7 +201,7 @@ int flash_init_drivers(struct command_context_s *cmd_ctx)
                register_command(cmd_ctx, flash_cmd, "write_image", handle_flash_write_image_command, COMMAND_EXEC,
                                                 "write_image [erase] <file> [offset] [type]");
                register_command(cmd_ctx, flash_cmd, "protect", handle_flash_protect_command, COMMAND_EXEC,
-                                                "set protection of sectors at <bank> <first> <last> <on|off>");
+                                                "set protection of sectors at <bank> <first> <last> <on | off>");
        }
 
        return ERROR_OK;
@@ -275,9 +264,9 @@ static int handle_flash_bank_command(struct command_context_s *cmd_ctx, char *cm
                return ERROR_COMMAND_SYNTAX_ERROR;
        }
 
-       if ((target = get_target_by_num(strtoul(args[5], NULL, 0))) == NULL)
+       if ((target = get_target(args[5])) == NULL)
        {
-               LOG_ERROR("target %lu not defined", strtoul(args[5], NULL, 0));
+               LOG_ERROR("target '%s' not defined", args[5]);
                return ERROR_FAIL;
        }
 
@@ -306,9 +295,9 @@ static int handle_flash_bank_command(struct command_context_s *cmd_ctx, char *cm
                        c->sectors = NULL;
                        c->next = NULL;
 
-                       if ((retval=flash_drivers[i]->flash_bank_command(cmd_ctx, cmd, args, argc, c)) != ERROR_OK)
+                       if ((retval = flash_drivers[i]->flash_bank_command(cmd_ctx, cmd, args, argc, c)) != ERROR_OK)
                        {
-                               LOG_ERROR("'%s' driver rejected flash bank at 0x%8.8x", args[0], c->base);
+                               LOG_ERROR("'%s' driver rejected flash bank at 0x%8.8" PRIx32 , args[0], c->base);
                                free(c);
                                return retval;
                        }
@@ -346,7 +335,7 @@ static int handle_flash_bank_command(struct command_context_s *cmd_ctx, char *cm
 static int handle_flash_info_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
 {
        flash_bank_t *p;
-       int i = 0;
+       uint32_t i = 0;
        int j = 0;
        int retval;
 
@@ -365,8 +354,14 @@ static int handle_flash_info_command(struct command_context_s *cmd_ctx, char *cm
                        if ((retval = p->driver->auto_probe(p)) != ERROR_OK)
                                return retval;
 
-                       command_print(cmd_ctx, "#%i: %s at 0x%8.8x, size 0x%8.8x, buswidth %i, chipwidth %i",
-                                               i, p->driver->name, p->base, p->size, p->bus_width, p->chip_width);
+                       command_print(cmd_ctx,
+                                     "#%" PRIi32 " : %s at 0x%8.8" PRIx32 ", size 0x%8.8" PRIx32 ", buswidth %i, chipwidth %i",
+                                     i,
+                                     p->driver->name,
+                                     p->base,
+                                     p->size,
+                                     p->bus_width,
+                                     p->chip_width);
                        for (j = 0; j < p->num_sectors; j++)
                        {
                                char *protect_state;
@@ -378,9 +373,13 @@ static int handle_flash_info_command(struct command_context_s *cmd_ctx, char *cm
                                else
                                        protect_state = "protection state unknown";
 
-                               command_print(cmd_ctx, "\t#%3i: 0x%8.8x (0x%x %ikB) %s",
-                                                       j, p->sectors[j].offset, p->sectors[j].size, p->sectors[j].size>>10,
-                                                       protect_state);
+                               command_print(cmd_ctx,
+                                             "\t#%3i: 0x%8.8" PRIx32 " (0x%" PRIx32 " %" PRIi32 "kB) %s",
+                                             j,
+                                             p->sectors[j].offset,
+                                             p->sectors[j].size,
+                                             p->sectors[j].size >> 10,
+                                             protect_state);
                        }
 
                        *buf = '\0'; /* initialize buffer, otherwise it migh contain garbage if driver function fails */
@@ -409,16 +408,16 @@ static int handle_flash_probe_command(struct command_context_s *cmd_ctx, char *c
        {
                if ((retval = p->driver->probe(p)) == ERROR_OK)
                {
-                       command_print(cmd_ctx, "flash '%s' found at 0x%8.8x", p->driver->name, p->base);
+                       command_print(cmd_ctx, "flash '%s' found at 0x%8.8" PRIx32, p->driver->name, p->base);
                }
                else if (retval == ERROR_FLASH_BANK_INVALID)
                {
-                       command_print(cmd_ctx, "probing failed for flash bank '#%s' at 0x%8.8x",
+                       command_print(cmd_ctx, "probing failed for flash bank '#%s' at 0x%8.8" PRIx32,
                                                  args[0], p->base);
                }
                else
                {
-                       command_print(cmd_ctx, "unknown error when probing flash bank '#%s' at 0x%8.8x",
+                       command_print(cmd_ctx, "unknown error when probing flash bank '#%s' at 0x%8.8" PRIx32,
                                                  args[0], p->base);
                }
        }
@@ -446,11 +445,11 @@ static int handle_flash_erase_check_command(struct command_context_s *cmd_ctx, c
                int j;
                if ((retval = p->driver->erase_check(p)) == ERROR_OK)
                {
-                       command_print(cmd_ctx, "successfully checked erase state", p->driver->name, p->base);
+                       command_print(cmd_ctx, "successfully checked erase state");
                }
                else
                {
-                       command_print(cmd_ctx, "unknown error when checking erase state of flash bank #%s at 0x%8.8x",
+                       command_print(cmd_ctx, "unknown error when checking erase state of flash bank #%s at 0x%8.8" PRIx32,
                                args[0], p->base);
                }
 
@@ -465,9 +464,13 @@ static int handle_flash_erase_check_command(struct command_context_s *cmd_ctx, c
                        else
                                erase_state = "erase state unknown";
 
-                       command_print(cmd_ctx, "\t#%3i: 0x%8.8x (0x%x %ikB) %s",
-                                               j, p->sectors[j].offset, p->sectors[j].size, p->sectors[j].size>>10,
-                                               erase_state);
+                       command_print(cmd_ctx,
+                                     "\t#%3i: 0x%8.8" PRIx32 " (0x%" PRIx32 " %" PRIi32 "kB) %s",
+                                     j,
+                                     p->sectors[j].offset,
+                                     p->sectors[j].size,
+                                     p->sectors[j].size >> 10,
+                                     erase_state);
                }
        }
 
@@ -541,11 +544,11 @@ static int handle_flash_protect_check_command(struct command_context_s *cmd_ctx,
                }
                else if (retval == ERROR_FLASH_OPERATION_FAILED)
                {
-                       command_print(cmd_ctx, "checking protection state failed (possibly unsupported) by flash #%s at 0x%8.8x", args[0], p->base);
+                       command_print(cmd_ctx, "checking protection state failed (possibly unsupported) by flash #%s at 0x%8.8" PRIx32, args[0], p->base);
                }
                else
                {
-                       command_print(cmd_ctx, "unknown error when checking protection state of flash bank '#%s' at 0x%8.8x", args[0], p->base);
+                       command_print(cmd_ctx, "unknown error when checking protection state of flash bank '#%s' at 0x%8.8" PRIx32, args[0], p->base);
                }
        }
        else
@@ -581,7 +584,8 @@ static int handle_flash_erase_command(struct command_context_s *cmd_ctx, char *c
                                return retval;
                        }
 
-                       command_print(cmd_ctx, "erased sectors %i through %i on flash bank %i in %s", first, last, strtoul(args[0], 0, 0), duration_text);
+                       command_print(cmd_ctx, "erased sectors %i through %i on flash bank %li in %s",
+                               first, last, strtoul(args[0], 0, 0), duration_text);
                        free(duration_text);
                }
        }
@@ -620,7 +624,9 @@ static int handle_flash_protect_command(struct command_context_s *cmd_ctx, char
                retval = flash_driver_protect(p, set, first, last);
                if (retval == ERROR_OK)
                {
-                       command_print(cmd_ctx, "%s protection for sectors %i through %i on flash bank %i", (set) ? "set" : "cleared", first, last, strtoul(args[0], 0, 0));
+                       command_print(cmd_ctx, "%s protection for sectors %i through %i on flash bank %li",
+                               (set) ? "set" : "cleared", first,
+                               last, strtoul(args[0], 0, 0));
                }
        }
        else
@@ -637,7 +643,7 @@ static int handle_flash_write_image_command(struct command_context_s *cmd_ctx, c
        target_t *target = get_current_target(cmd_ctx);
 
        image_t image;
-       u32 written;
+       uint32_t written;
 
        duration_t duration;
        char *duration_text;
@@ -652,7 +658,7 @@ static int handle_flash_write_image_command(struct command_context_s *cmd_ctx, c
        /* flash auto-erase is disabled by default*/
        int auto_erase = 0;
 
-       if (strcmp(args[0], "erase")==0)
+       if (strcmp(args[0], "erase") == 0)
        {
                auto_erase = 1;
                args++;
@@ -704,12 +710,16 @@ static int handle_flash_write_image_command(struct command_context_s *cmd_ctx, c
                image_close(&image);
                return retvaltemp;
        }
-       if (retval == ERROR_OK)
-       {
-               command_print(cmd_ctx, "wrote %u byte from file %s in %s (%f kb/s)",
-                               written, args[0], duration_text,
-                               (float)written / 1024.0 / ((float)duration.duration.tv_sec + ((float)duration.duration.tv_usec / 1000000.0)));
-       }
+
+       float speed;
+
+       speed = written / 1024.0;
+       speed /= ((float)duration.duration.tv_sec
+                       + ((float)duration.duration.tv_usec / 1000000.0));
+       command_print(cmd_ctx,
+                       "wrote %" PRIu32 " byte from file %s in %s (%f kb/s)",
+                       written, args[0], duration_text, speed);
+
        free(duration_text);
 
        image_close(&image);
@@ -720,18 +730,19 @@ static int handle_flash_write_image_command(struct command_context_s *cmd_ctx, c
 static int handle_flash_fill_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
 {
        int err = ERROR_OK, retval;
-       u32 address;
-       u32 pattern;
-       u32 count;
-       u8 chunk[1024];
-       u32 wrote = 0;
-       u32 cur_size = 0;
-       int chunk_count;
+       uint32_t address;
+       uint32_t pattern;
+       uint32_t count;
+       uint8_t chunk[1024];
+       uint8_t readback[1024];
+       uint32_t wrote = 0;
+       uint32_t cur_size = 0;
+       uint32_t chunk_count;
        char *duration_text;
        duration_t duration;
        target_t *target = get_current_target(cmd_ctx);
-       u32 i;
-       int wordsize;
+       uint32_t i;
+       uint32_t wordsize;
 
        if (argc != 3)
        {
@@ -742,35 +753,35 @@ static int handle_flash_fill_command(struct command_context_s *cmd_ctx, char *cm
        pattern = strtoul(args[1], NULL, 0);
        count   = strtoul(args[2], NULL, 0);
 
-       if(count == 0)
+       if (count == 0)
                return ERROR_OK;
 
-       switch(cmd[4])
+       switch (cmd[4])
        {
        case 'w':
-               wordsize=4;
+               wordsize = 4;
                break;
        case 'h':
-               wordsize=2;
+               wordsize = 2;
                break;
        case 'b':
-               wordsize=1;
+               wordsize = 1;
                break;
        default:
                return ERROR_COMMAND_SYNTAX_ERROR;
        }
 
        chunk_count = MIN(count, (1024 / wordsize));
-       switch(wordsize)
+       switch (wordsize)
        {
        case 4:
-               for(i = 0; i < chunk_count; i++)
+               for (i = 0; i < chunk_count; i++)
                {
                        target_buffer_set_u32(target, chunk + i * wordsize, pattern);
                }
                break;
        case 2:
-               for(i = 0; i < chunk_count; i++)
+               for (i = 0; i < chunk_count; i++)
                {
                        target_buffer_set_u16(target, chunk + i * wordsize, pattern);
                }
@@ -785,18 +796,34 @@ static int handle_flash_fill_command(struct command_context_s *cmd_ctx, char *cm
 
        duration_start_measure(&duration);
 
-       for (wrote=0; wrote<(count*wordsize); wrote += cur_size)
+       for (wrote = 0; wrote < (count*wordsize); wrote += cur_size)
        {
-               cur_size = MIN( (count*wordsize - wrote), sizeof(chunk) );
+               cur_size = MIN((count*wordsize - wrote), sizeof(chunk));
                flash_bank_t *bank;
                bank = get_flash_bank_by_addr(target, address);
-               if(bank == NULL)
+               if (bank == NULL)
                {
                        return ERROR_FAIL;
                }
                err = flash_driver_write(bank, chunk, address - bank->base + wrote, cur_size);
-               if (err!=ERROR_OK)
+               if (err != ERROR_OK)
                        return err;
+
+               err = target_read_buffer(target, address + wrote, cur_size, readback);
+               if (err != ERROR_OK)
+                       return err;
+
+               unsigned i;
+               for (i = 0; i < cur_size; i++)
+               {
+                       if (readback[i]!=chunk[i])
+                       {
+                               LOG_ERROR("Verfication error address 0x%08" PRIx32 ", read back 0x%02x, expected 0x%02x",
+                                                 address + wrote + i, readback[i], chunk[i]);
+                               return ERROR_FAIL;
+                       }
+               }
+
        }
 
        if ((retval = duration_stop_measure(&duration, &duration_text)) != ERROR_OK)
@@ -804,24 +831,24 @@ static int handle_flash_fill_command(struct command_context_s *cmd_ctx, char *cm
                return retval;
        }
 
-       if(err == ERROR_OK)
-       {
-               float speed;
-               speed=wrote / 1024.0;
-               speed/=((float)duration.duration.tv_sec + ((float)duration.duration.tv_usec / 1000000.0));
-               command_print(cmd_ctx, "wrote %d bytes to 0x%8.8x in %s (%f kb/s)",
-                       count*wordsize, address, duration_text,
-                       speed);
-       }
+       float speed;
+
+       speed = wrote / 1024.0;
+       speed /= ((float)duration.duration.tv_sec
+                       + ((float)duration.duration.tv_usec / 1000000.0));
+       command_print(cmd_ctx,
+                       "wrote %" PRIu32 " bytes to 0x%8.8" PRIx32 " in %s (%f kb/s)",
+                       wrote, address, duration_text, speed);
+
        free(duration_text);
        return ERROR_OK;
 }
 
 static int handle_flash_write_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
 {
-       u32 offset;
-       u8 *buffer;
-       u32 buf_cnt;
+       uint32_t offset;
+       uint8_t *buffer;
+       uint32_t buf_cnt;
 
        fileio_t fileio;
 
@@ -869,11 +896,16 @@ static int handle_flash_write_bank_command(struct command_context_s *cmd_ctx, ch
                fileio_close(&fileio);
                return retvaltemp;
        }
-       if (retval==ERROR_OK)
+       if (retval == ERROR_OK)
        {
-       command_print(cmd_ctx, "wrote  %"PRIi64" byte from file %s to flash bank %i at offset 0x%8.8x in %s (%f kb/s)",
-               fileio.size, args[1], strtoul(args[0], NULL, 0), offset, duration_text,
-               (float)fileio.size / 1024.0 / ((float)duration.duration.tv_sec + ((float)duration.duration.tv_usec / 1000000.0)));
+       command_print(cmd_ctx,
+                                 "wrote  %lld byte from file %s to flash bank %li at offset 0x%8.8" PRIx32 " in %s (%f kb/s)",
+                                 fileio.size,
+                                 args[1],
+                                 strtoul(args[0], NULL, 0),
+                                 offset,
+                                 duration_text,
+                                 (float)fileio.size / 1024.0 / ((float)duration.duration.tv_sec + ((float)duration.duration.tv_usec / 1000000.0)));
        }
        free(duration_text);
 
@@ -898,7 +930,7 @@ void flash_set_dirty(void)
 }
 
 /* lookup flash bank by address */
-flash_bank_t *get_flash_bank_by_addr(target_t *target, u32 addr)
+flash_bank_t *get_flash_bank_by_addr(target_t *target, uint32_t addr)
 {
        flash_bank_t *c;
 
@@ -917,12 +949,12 @@ flash_bank_t *get_flash_bank_by_addr(target_t *target, u32 addr)
                if ((addr >= c->base) && (addr <= c->base + (c->size - 1)) && target == c->target)
                        return c;
        }
-       LOG_ERROR("No flash at address 0x%08x\n", addr);
+       LOG_ERROR("No flash at address 0x%08" PRIx32 "\n", addr);
        return NULL;
 }
 
 /* erase given flash region, selects proper bank according to target and address */
-int flash_erase_address_range(target_t *target, u32 addr, u32 length)
+int flash_erase_address_range(target_t *target, uint32_t addr, uint32_t length)
 {
        flash_bank_t *c;
        int first = -1;
@@ -964,19 +996,19 @@ int flash_erase_address_range(target_t *target, u32 addr, u32 length)
                }
        }
 
-       if( first == -1 || last == -1 )
+       if (first == -1 || last == -1)
                return ERROR_OK;
 
        return flash_driver_erase(c, first, last);
 }
 
 /* write (optional verify) an image to flash memory of the given target */
-int flash_write(target_t *target, image_t *image, u32 *written, int erase)
+int flash_write(target_t *target, image_t *image, uint32_t *written, int erase)
 {
-       int retval=ERROR_OK;
+       int retval = ERROR_OK;
 
        int section;
-       u32 section_offset;
+       uint32_t section_offset;
        flash_bank_t *c;
        int *padding;
 
@@ -1000,12 +1032,12 @@ int flash_write(target_t *target, image_t *image, u32 *written, int erase)
        /* loop until we reach end of the image */
        while (section < image->num_sections)
        {
-               u32 buffer_size;
-               u8 *buffer;
+               uint32_t buffer_size;
+               uint8_t *buffer;
                int section_first;
                int section_last;
-               u32 run_address = image->sections[section].base_address + section_offset;
-               u32 run_size = image->sections[section].size - section_offset;
+               uint32_t run_address = image->sections[section].base_address + section_offset;
+               uint32_t run_size = image->sections[section].size - section_offset;
                int pad_bytes = 0;
 
                if (image->sections[section].size ==  0)
@@ -1046,14 +1078,14 @@ int flash_write(target_t *target, image_t *image, u32 *written, int erase)
                        run_size += pad_bytes;
                        padding[section_last] = 0;
 
-                       LOG_INFO("Padding image section %d with %d bytes", section_last-1, pad_bytes );
+                       LOG_INFO("Padding image section %d with %d bytes", section_last-1, pad_bytes);
                }
 
                /* fit the run into bank constraints */
                if (run_address + run_size - 1 > c->base + c->size - 1)
                {
                        LOG_WARNING("writing %d bytes only - as image section is %d bytes and bank is only %d bytes", \
-                                       c->base + c->size - run_address, run_size, c->size);
+                                   (int)(c->base + c->size - run_address), (int)(run_size), (int)(c->size));
                        run_size = c->base + c->size - run_address;
                }
 
@@ -1064,7 +1096,7 @@ int flash_write(target_t *target, image_t *image, u32 *written, int erase)
                /* read sections to the buffer */
                while (buffer_size < run_size)
                {
-                       u32 size_read;
+                       uint32_t size_read;
 
                        size_read = run_size - buffer_size;
                        if (size_read > image->sections[section].size - section_offset)
@@ -1080,7 +1112,7 @@ int flash_write(target_t *target, image_t *image, u32 *written, int erase)
 
                        /* see if we need to pad the section */
                        while (padding[section]--)
-                                (buffer+buffer_size)[size_read++] = 0xff;
+                                (buffer + buffer_size)[size_read++] = 0xff;
 
                        buffer_size += size_read;
                        section_offset += size_read;
@@ -1097,7 +1129,7 @@ int flash_write(target_t *target, image_t *image, u32 *written, int erase)
                if (erase)
                {
                        /* calculate and erase sectors */
-                       retval = flash_erase_address_range( target, run_address, run_size );
+                       retval = flash_erase_address_range(target, run_address, run_size);
                }
 
                if (retval == ERROR_OK)
@@ -1126,10 +1158,10 @@ int flash_write(target_t *target, image_t *image, u32 *written, int erase)
 int default_flash_mem_blank_check(struct flash_bank_s *bank)
 {
        target_t *target = bank->target;
-       u8 buffer[1024];
+       uint8_t buffer[1024];
        int buffer_size = sizeof(buffer);
        int i;
-       int nBytes;
+       uint32_t nBytes;
 
        if (bank->target->state != TARGET_HALTED)
        {
@@ -1139,12 +1171,12 @@ int default_flash_mem_blank_check(struct flash_bank_s *bank)
 
        for (i = 0; i < bank->num_sectors; i++)
        {
-               int j;
+               uint32_t j;
                bank->sectors[i].is_erased = 1;
 
                for (j = 0; j < bank->sectors[i].size; j += buffer_size)
                {
-                       int chunk;
+                       uint32_t chunk;
                        int retval;
                        chunk = buffer_size;
                        if (chunk > (j - bank->sectors[i].size))
@@ -1152,7 +1184,7 @@ int default_flash_mem_blank_check(struct flash_bank_s *bank)
                                chunk = (j - bank->sectors[i].size);
                        }
 
-                       retval = target->type->read_memory(target, bank->base + bank->sectors[i].offset + j, 4, chunk/4, buffer);
+                       retval = target_read_memory(target, bank->base + bank->sectors[i].offset + j, 4, chunk/4, buffer);
                        if (retval != ERROR_OK)
                                return retval;
 
@@ -1176,7 +1208,7 @@ int default_flash_blank_check(struct flash_bank_s *bank)
        int i;
        int retval;
        int fast_check = 0;
-       u32 blank;
+       uint32_t blank;
 
        if (bank->target->state != TARGET_HALTED)
        {
@@ -1186,8 +1218,8 @@ int default_flash_blank_check(struct flash_bank_s *bank)
 
        for (i = 0; i < bank->num_sectors; i++)
        {
-               u32 address = bank->base + bank->sectors[i].offset;
-               u32 size = bank->sectors[i].size;
+               uint32_t address = bank->base + bank->sectors[i].offset;
+               uint32_t size = bank->sectors[i].size;
 
                if ((retval = target_blank_check_memory(target, address, size, &blank)) != ERROR_OK)
                {