* Copyright (C) 2007-2010 Øyvind Harboe <oyvind.harboe@zylin.com> *
* Copyright (C) 2008 by Spencer Oliver <spen@spen-soft.co.uk> *
* Copyright (C) 2009 Zachary T Welch <zw@superlucidity.net> *
+ * Copyright (C) 2010 by Antonio Borneo <borneo.antonio@gmail.com> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
return retval;
}
+int flash_driver_read(struct flash_bank *bank,
+ uint8_t *buffer, uint32_t offset, uint32_t count)
+{
+ int retval;
+
+ LOG_DEBUG("call flash_driver_read()");
+
+ retval = bank->driver->read(bank, buffer, offset, count);
+ if (retval != ERROR_OK)
+ {
+ LOG_ERROR("error reading to flash at address 0x%08" PRIx32 " at offset 0x%8.8" PRIx32 " (%d)",
+ bank->base, offset, retval);
+ }
+
+ return retval;
+}
+
+int default_flash_read(struct flash_bank *bank,
+ uint8_t *buffer, uint32_t offset, uint32_t count)
+{
+ return target_read_buffer(bank->target, offset + bank->base, count, buffer);
+}
+
void flash_bank_add(struct flash_bank *bank)
{
/* put flash bank in linked list */
return i;
}
-struct flash_bank *get_flash_bank_by_name(const char *name)
+struct flash_bank *get_flash_bank_by_name_noprobe(const char *name)
{
unsigned requested = get_flash_name_index(name);
unsigned found = 0;
return NULL;
}
+int get_flash_bank_by_name(const char *name, struct flash_bank **bank_result)
+{
+ struct flash_bank *bank;
+ int retval;
+
+ bank = get_flash_bank_by_name_noprobe(name);
+ if (bank != NULL)
+ {
+ retval = bank->driver->auto_probe(bank);
+
+ if (retval != ERROR_OK)
+ {
+ LOG_ERROR("auto_probe failed %d\n", retval);
+ return retval;
+ }
+ }
+
+ *bank_result = bank;
+ return ERROR_OK;
+}
+
int get_flash_bank_by_num(int num, struct flash_bank **bank)
{
struct flash_bank *p = get_flash_bank_by_num_noprobe(num);
return ERROR_OK;
}
-/* lookup flash bank by address */
-struct flash_bank *get_flash_bank_by_addr(struct target *target, uint32_t addr)
+/* lookup flash bank by address, bank not found is success, but
+ * result_bank is set to NULL. */
+int get_flash_bank_by_addr(struct target *target, uint32_t addr, bool check, struct flash_bank **result_bank)
{
struct flash_bank *c;
if (retval != ERROR_OK)
{
LOG_ERROR("auto_probe failed %d\n", retval);
- return NULL;
+ return retval;
}
/* check whether address belongs to this flash bank */
if ((addr >= c->base) && (addr <= c->base + (c->size - 1)) && target == c->target)
- return c;
+ {
+ *result_bank = c;
+ return ERROR_OK;
+ }
}
- LOG_ERROR("No flash at address 0x%08" PRIx32 "\n", addr);
- return NULL;
+ *result_bank = NULL;
+ if (check)
+ {
+ LOG_ERROR("No flash at address 0x%08" PRIx32 "\n", addr);
+ return ERROR_FAIL;
+ }
+ return ERROR_OK;
}
int default_flash_mem_blank_check(struct flash_bank *bank)
int last = -1;
int i;
- if ((c = get_flash_bank_by_addr(target, addr)) == NULL)
- return ERROR_FLASH_DST_OUT_OF_BANK; /* no corresponding bank found */
+ int retval = get_flash_bank_by_addr(target, addr, true, &c);
+ if (retval != ERROR_OK)
+ return retval;
if (c->size == 0 || c->num_sectors == 0)
{
}
/* find the corresponding flash bank */
- if ((c = get_flash_bank_by_addr(target, run_address)) == NULL)
+ int retval;
+ retval = get_flash_bank_by_addr(target, run_address, false, &c);
+ if (retval != ERROR_OK)
+ return retval;
+ if (c == NULL)
{
section++; /* and skip it */
section_offset = 0;
LOG_INFO("Padding image section %d with %d bytes", section_last-1, pad_bytes);
}
- assert (run_address + run_size - 1 <= c->base + c->size - 1);
+ if (run_address + run_size - 1 > c->base + c->size - 1)
+ {
+ LOG_ERROR("The image is too big for the flash");
+ return ERROR_FAIL;
+ }
/* If we're applying any sector automagic, then pad this
* (maybe-combined) segment to the end of its last sector.
intptr_t diff = (intptr_t)sections[section] - (intptr_t)image->sections;
int t_section_num = diff / sizeof(struct imageection);
- LOG_DEBUG("image_read_section: section = %d, t_section_num = %d, section_offset = %d, buffer_size = %d, size_read = %d",
+ LOG_DEBUG("image_read_section: section = %d, t_section_num = %d, section_offset = %d, buffer_size = %d, size_read = %d",
(int)section,
(int)t_section_num, (int)section_offset, (int)buffer_size, (int)size_read);
if ((retval = image_read_section(image, t_section_num, section_offset,