/* wafer thin wrapper for invoking the flash driver */
static int flash_driver_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count)
{
- int retval=ERROR_OK;
- if (bank->target->state != TARGET_HALTED)
- {
- ERROR("target not halted - aborting flash write");
- retval=ERROR_TARGET_NOT_HALTED;
- } else
- {
- retval=bank->driver->write(bank, buffer, offset, count);
- }
+ int retval;
+
+ retval=bank->driver->write(bank, buffer, offset, count);
if (retval!=ERROR_OK)
{
- ERROR("Writing to flash bank at address 0x%08x at offset 0x%8.8x", bank->base, offset);
+ LOG_ERROR("error writing to flash at address 0x%08x at offset 0x%8.8x (%d)", bank->base, offset, retval);
}
+
return retval;
}
static int flash_driver_erase(struct flash_bank_s *bank, int first, int last)
{
- int retval=ERROR_OK;
- if (bank->target->state != TARGET_HALTED)
- {
- ERROR("target not halted - aborting flash erase");
- retval=ERROR_TARGET_NOT_HALTED;
- } else if ((first < 0) || (last < first) || (last >= bank->num_sectors))
- {
- ERROR("invalid flash sector");
- retval=ERROR_FLASH_SECTOR_INVALID;
- } else
- {
- retval=bank->driver->erase(bank, first, last);
- }
+ int retval;
+
+ retval=bank->driver->erase(bank, first, last);
if (retval!=ERROR_OK)
{
- ERROR("Failed erasing banks %d to %d", first, last);
+ LOG_ERROR("failed erasing sectors %d to %d (%d)", first, last, retval);
}
+
return retval;
}
int flash_driver_protect(struct flash_bank_s *bank, int set, int first, int last)
{
int retval;
- if (bank->target->state != TARGET_HALTED)
- {
- ERROR("target not halted - aborting flash erase");
- retval=ERROR_TARGET_NOT_HALTED;
- } else if ((first < 0) || (last < first) || (last >= bank->num_sectors))
- {
- ERROR("invalid flash sector");
- retval=ERROR_FLASH_SECTOR_INVALID;
- } else
- {
- retval=bank->driver->protect(bank, set, first, last);
- }
+
+ retval=bank->driver->protect(bank, set, first, last);
if (retval!=ERROR_OK)
{
- ERROR("Failed protecting banks %d to %d", first, last);
+ LOG_ERROR("failed setting protection for areas %d to %d (%d)", first, last, retval);
}
+
return retval;
}
return p;
}
}
- ERROR("flash bank %d does not exist", num);
+ LOG_ERROR("flash bank %d does not exist", num);
return NULL;
}
+int flash_get_bank_count()
+{
+ flash_bank_t *p;
+ int i = 0;
+ for (p = flash_banks; p; p = p->next)
+ {
+ i++;
+ }
+ return i;
+}
+
flash_bank_t *get_flash_bank_by_num(int num)
{
flash_bank_t *p = get_flash_bank_by_num_noprobe(num);
if (retval != ERROR_OK)
{
- ERROR("auto_probe failed %d\n", retval);
+ LOG_ERROR("auto_probe failed %d\n", retval);
return NULL;
}
return p;
if ((target = get_target_by_num(strtoul(args[5], NULL, 0))) == NULL)
{
- ERROR("target %lu not defined", strtoul(args[5], NULL, 0));
+ LOG_ERROR("target %lu not defined", strtoul(args[5], NULL, 0));
return ERROR_OK;
}
/* register flash specific commands */
if (flash_drivers[i]->register_commands(cmd_ctx) != ERROR_OK)
{
- ERROR("couldn't register '%s' commands", args[0]);
+ LOG_ERROR("couldn't register '%s' commands", args[0]);
exit(-1);
}
if (flash_drivers[i]->flash_bank_command(cmd_ctx, cmd, args, argc, c) != ERROR_OK)
{
- ERROR("'%s' driver rejected flash bank at 0x%8.8x", args[0], c->base);
+ LOG_ERROR("'%s' driver rejected flash bank at 0x%8.8x", args[0], c->base);
free(c);
return ERROR_OK;
}
/* no matching flash driver found */
if (!found)
{
- ERROR("flash driver '%s' not found", args[0]);
+ LOG_ERROR("flash driver '%s' not found", args[0]);
exit(-1);
}
flash_bank_t *p;
int i = 0;
int j = 0;
+ int retval;
if (argc != 1)
{
erase_state, protect_state);
}
- p->driver->info(p, buf, 1024);
+ *buf = '\0'; /* initialize buffer, otherwise it migh contain garbage if driver function fails */
+ retval = p->driver->info(p, buf, sizeof(buf));
command_print(cmd_ctx, "%s", buf);
+ if (retval != ERROR_OK)
+ LOG_ERROR("error retrieving flash info (%d)", retval);
}
}
if (!target)
{
- ERROR("no target selected");
+ LOG_ERROR("no target selected");
return ERROR_OK;
}
retval = image_open(&image, args[0], (argc == 3) ? args[2] : NULL);
if (retval != ERROR_OK)
{
- command_print(cmd_ctx, "image_open error: %s", image.error_str);
return retval;
}
if (fileio_open(&fileio, args[1], FILEIO_READ, FILEIO_BINARY) != ERROR_OK)
{
- command_print(cmd_ctx, "flash write_binary error: %s", fileio.error_str);
return ERROR_OK;
}
buffer = malloc(fileio.size);
if (fileio_read(&fileio, fileio.size, buffer, &buf_cnt) != ERROR_OK)
{
- command_print(cmd_ctx, "flash write_binary error: %s", fileio.error_str);
return ERROR_OK;
}
if (retval != ERROR_OK)
{
- ERROR("auto_probe failed %d\n", retval);
+ LOG_ERROR("auto_probe failed %d\n", retval);
return NULL;
}
/* check whether address belongs to this flash bank */
if ((addr >= c->base) && (addr < c->base + c->size) && target == c->target)
return c;
}
- ERROR("No flash at address 0x%08x\n", addr);
+ LOG_ERROR("No flash at address 0x%08x\n", addr);
return NULL;
}
if (image->sections[section].size == 0)
{
- WARNING("empty section %d", section);
+ LOG_WARNING("empty section %d", section);
section++;
section_offset = 0;
continue;
{
if (image->sections[section_last + 1].base_address < (run_address + run_size))
{
- DEBUG("section %d out of order(very slightly surprising, but supported)", section_last + 1);
+ LOG_DEBUG("section %d out of order(very slightly surprising, but supported)", section_last + 1);
break;
}
if (image->sections[section_last + 1].base_address != (run_address + run_size))
if (argc != 1)
{
return ERROR_COMMAND_SYNTAX_ERROR;
-
}
if (strcmp(args[0], "on") == 0)