if (strcmp(args[0], nand_flash_controllers[i]->name) == 0)
{
/* register flash specific commands */
- if (nand_flash_controllers[i]->register_commands(cmd_ctx) != ERROR_OK)
+ if ((retval = nand_flash_controllers[i]->register_commands(cmd_ctx)) != ERROR_OK)
{
LOG_ERROR("couldn't register '%s' commands", args[0]);
- exit(-1);
+ return retval;
}
c = malloc(sizeof(nand_device_t));
/* Send read status command */
device->controller->command(device, NAND_CMD_STATUS);
- usleep(1000);
+ alive_sleep(1);
/* read status */
if (device->device->options & NAND_BUSWIDTH_16)
* or 2048 for the beginning of OOB area)
*/
device->controller->address(device, 0x0);
- device->controller->address(device, 0x8);
+ if (data)
+ device->controller->address(device, 0x0);
+ else
+ device->controller->address(device, 0x8);
/* row */
device->controller->address(device, page & 0xff);
if (offset % p->page_size)
{
command_print(cmd_ctx, "only page size aligned offsets and sizes are supported");
+ fileio_close(&fileio);
+ free(oob);
+ free(page);
return ERROR_OK;
}
{
u32 size_read;
- if (page)
+ if (NULL != page)
{
fileio_read(&fileio, page_size, page, &size_read);
buf_cnt -= size_read;
}
}
- if (oob)
+ if (NULL != oob)
{
fileio_read(&fileio, oob_size, oob, &size_read);
buf_cnt -= size_read;
{
command_print(cmd_ctx, "failed writing file %s to NAND flash %s at offset 0x%8.8x",
args[1], args[0], offset);
+
+ fileio_close(&fileio);
+ free(oob);
+ free(page);
+
return ERROR_OK;
}
offset += page_size;
}
fileio_close(&fileio);
-
+ free(oob);
+ free(page);
+ oob = NULL;
+ page = NULL;
duration_stop_measure(&duration, &duration_text);
command_print(cmd_ctx, "wrote file %s to NAND flash %s at offset 0x%8.8x in %s",
args[1], args[0], offset, duration_text);
free(duration_text);
+ duration_text = NULL;
}
else
{
if ((retval = nand_read_page(p, address / p->page_size, page, page_size, oob, oob_size)) != ERROR_OK)
{
command_print(cmd_ctx, "reading NAND flash page failed");
+ free(page);
+ free(oob);
+ fileio_close(&fileio);
return ERROR_OK;
}
- if (page)
+ if (NULL != page)
{
fileio_write(&fileio, page_size, page, &size_written);
bytes_done += page_size;
}
- if (oob)
+ if (NULL != oob)
{
fileio_write(&fileio, oob_size, oob, &size_written);
bytes_done += oob_size;
address += p->page_size;
}
- if (page)
- free(page);
-
- if (oob)
- free(oob);
-
+ free(page);
+ page = NULL;
+ free(oob);
+ oob = NULL;
fileio_close(&fileio);
duration_stop_measure(&duration, &duration_text);
command_print(cmd_ctx, "dumped %"PRIi64" byte in %s", fileio.size, duration_text);
free(duration_text);
+ duration_text = NULL;
}
else
{