diff options
Diffstat (limited to 'src/flash')
-rw-r--r-- | src/flash/flash.c | 117 | ||||
-rw-r--r-- | src/flash/mflash.c | 74 | ||||
-rw-r--r-- | src/flash/nand.c | 32 |
3 files changed, 88 insertions, 135 deletions
diff --git a/src/flash/flash.c b/src/flash/flash.c index 329ade63..22c6069e 100644 --- a/src/flash/flash.c +++ b/src/flash/flash.c @@ -503,8 +503,6 @@ static int handle_flash_erase_address_command(struct command_context_s *cmd_ctx, int retval; int address; int length; - duration_t duration; - char *duration_text; target_t *target = get_current_target(cmd_ctx); @@ -528,16 +526,16 @@ static int handle_flash_erase_address_command(struct command_context_s *cmd_ctx, /* We can't know if we did a resume + halt, in which case we no longer know the erased state */ flash_set_dirty(); - duration_start_measure(&duration); + struct duration bench; + duration_start(&bench); - if ((retval = flash_erase_address_range(target, address, length)) == ERROR_OK) + retval = flash_erase_address_range(target, address, length); + + if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK)) { - if ((retval = duration_stop_measure(&duration, &duration_text)) != ERROR_OK) - { - return retval; - } - command_print(cmd_ctx, "erased address 0x%8.8x length %i in %s", address, length, duration_text); - free(duration_text); + command_print(cmd_ctx, "erased address 0x%8.8x (length %i)" + " in %fs (%0.3f kb/s)", address, length, + duration_elapsed(&bench), duration_kbps(&bench, length)); } return retval; @@ -613,19 +611,16 @@ static int handle_flash_erase_command(struct command_context_s *cmd_ctx, first, last, p->num_sectors)) != ERROR_OK) return retval; - duration_t duration; - char *duration_text; - duration_start_measure(&duration); + struct duration bench; + duration_start(&bench); - if ((retval = flash_driver_erase(p, first, last)) == ERROR_OK) { - if ((retval = duration_stop_measure(&duration, - &duration_text)) != ERROR_OK) - return retval; - command_print(cmd_ctx, "erased sectors %i through %i " - "on flash bank %i in %s", - (int) first, (int) last, (int) bank_nr, - duration_text); - free(duration_text); + retval = flash_driver_erase(p, first, last); + + if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK)) + { + command_print(cmd_ctx, "erased sectors %" PRIu32 " " + "through %" PRIu32" on flash bank %" PRIu32 " " + "in %fs", first, last, bank_nr, duration_elapsed(&bench)); } return ERROR_OK; @@ -683,10 +678,7 @@ static int handle_flash_write_image_command(struct command_context_s *cmd_ctx, c image_t image; uint32_t written; - duration_t duration; - char *duration_text; - - int retval, retvaltemp; + int retval; if (argc < 1) { @@ -728,7 +720,8 @@ static int handle_flash_write_image_command(struct command_context_s *cmd_ctx, c return ERROR_FAIL; } - duration_start_measure(&duration); + struct duration bench; + duration_start(&bench); if (argc >= 2) { @@ -756,23 +749,13 @@ static int handle_flash_write_image_command(struct command_context_s *cmd_ctx, c return retval; } - if ((retvaltemp = duration_stop_measure(&duration, &duration_text)) != ERROR_OK) + if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK)) { - image_close(&image); - return retvaltemp; + command_print(cmd_ctx, "wrote %" PRIu32 " byte from file %s " + "in %fs (%0.3f kb/s)", written, args[0], + duration_elapsed(&bench), duration_kbps(&bench, written)); } - 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); return retval; @@ -780,7 +763,7 @@ 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; + int err = ERROR_OK; uint32_t address; uint32_t pattern; uint32_t count; @@ -789,8 +772,6 @@ static int handle_flash_fill_command(struct command_context_s *cmd_ctx, char *cm 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); uint32_t i; uint32_t wordsize; @@ -843,7 +824,8 @@ static int handle_flash_fill_command(struct command_context_s *cmd_ctx, char *cm exit(-1); } - duration_start_measure(&duration); + struct duration bench; + duration_start(&bench); for (wrote = 0; wrote < (count*wordsize); wrote += cur_size) { @@ -872,24 +854,14 @@ static int handle_flash_fill_command(struct command_context_s *cmd_ctx, char *cm return ERROR_FAIL; } } - } - if ((retval = duration_stop_measure(&duration, &duration_text)) != ERROR_OK) + if (duration_measure(&bench) == ERROR_OK) { - return retval; + command_print(cmd_ctx, "wrote %" PRIu32 " bytes to 0x%8.8" PRIx32 + " in %fs (%0.3f kb/s)", wrote, address, + duration_elapsed(&bench), duration_kbps(&bench, wrote)); } - - 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; } @@ -898,17 +870,13 @@ static int handle_flash_write_bank_command(struct command_context_s *cmd_ctx, ch uint32_t offset; uint8_t *buffer; uint32_t buf_cnt; - fileio_t fileio; - duration_t duration; - char *duration_text; - - if (argc != 3) return ERROR_COMMAND_SYNTAX_ERROR; - duration_start_measure(&duration); + struct duration bench; + duration_start(&bench); flash_bank_t *p; int retval = flash_command_get_bank_by_num(cmd_ctx, args[0], &p); @@ -935,24 +903,13 @@ static int handle_flash_write_bank_command(struct command_context_s *cmd_ctx, ch free(buffer); buffer = NULL; - int retvaltemp; - if ((retvaltemp = duration_stop_measure(&duration, &duration_text)) != ERROR_OK) - { - fileio_close(&fileio); - return retvaltemp; - } - if (retval == ERROR_OK) + if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK)) { - float elapsed = (float)duration.duration.tv_sec; - elapsed += (float)duration.duration.tv_usec / 1000000.0; - float speed = (float)fileio.size / elapsed; - command_print(cmd_ctx, - "wrote %lld byte from file %s to flash bank %u " - "at offset 0x%8.8" PRIx32 " in %s (%f kb/s)", + command_print(cmd_ctx, "wrote %lld byte from file %s to flash bank %u" + " at offset 0x%8.8" PRIx32 " in %fs (%0.3f kb/s)", fileio.size, args[1], p->bank_number, offset, - duration_text, speed / 1024); + duration_elapsed(&bench), duration_kbps(&bench, fileio.size)); } - free(duration_text); fileio_close(&fileio); diff --git a/src/flash/mflash.c b/src/flash/mflash.c index bf759c97..5a392a4d 100644 --- a/src/flash/mflash.c +++ b/src/flash/mflash.c @@ -215,11 +215,11 @@ static int mg_dsk_wait(mg_io_type_wait wait, uint32_t time) uint8_t status, error; target_t *target = mflash_bank->target; uint32_t mg_task_reg = mflash_bank->base + MG_REG_OFFSET; - duration_t duration; int ret; long long t = 0; - duration_start_measure(&duration); + struct duration bench; + duration_start(&bench); while (time) { @@ -275,10 +275,11 @@ static int mg_dsk_wait(mg_io_type_wait wait, uint32_t time) } } - duration_stop_measure(&duration, NULL); - - t = duration.duration.tv_usec/1000; - t += duration.duration.tv_sec*1000; + ret = duration_measure(&bench); + if (ERROR_OK == ret) + t = duration_elapsed(&bench) * 1000.0; + else + LOG_ERROR("mflash: duration measurement failed: %d", ret); if (t > time) break; @@ -427,14 +428,14 @@ static int mg_mflash_do_read_sects(void *buff, uint32_t sect_num, uint32_t sect_ int ret; target_t *target = mflash_bank->target; uint8_t *buff_ptr = buff; - duration_t duration; if ((ret = mg_dsk_io_cmd(sect_num, sect_cnt, mg_io_cmd_read)) != ERROR_OK) return ret; address = mflash_bank->base + MG_BUFFER_OFFSET; - duration_start_measure(&duration); + struct duration bench; + duration_start(&bench); for (i = 0; i < sect_cnt; i++) { ret = mg_dsk_wait(mg_io_wait_drq, MG_OEM_DISK_WAIT_TIME_NORMAL); @@ -453,11 +454,10 @@ static int mg_mflash_do_read_sects(void *buff, uint32_t sect_num, uint32_t sect_ LOG_DEBUG("mflash: %" PRIu32 " (0x%8.8" PRIx32 ") sector read", sect_num + i, (sect_num + i) * MG_MFLASH_SECTOR_SIZE); - duration_stop_measure(&duration, NULL); - - if ((duration.duration.tv_sec * 1000 + duration.duration.tv_usec / 1000) > 3000) { + ret = duration_measure(&bench); + if ((ERROR_OK == ret) && (duration_elapsed(&bench) > 3)) { LOG_INFO("mflash: read %" PRIu32 "'th sectors", sect_num + i); - duration_start_measure(&duration); + duration_start(&bench); } } @@ -500,14 +500,14 @@ static int mg_mflash_do_write_sects(void *buff, uint32_t sect_num, uint32_t sect int ret; target_t *target = mflash_bank->target; uint8_t *buff_ptr = buff; - duration_t duration; if ((ret = mg_dsk_io_cmd(sect_num, sect_cnt, cmd)) != ERROR_OK) return ret; address = mflash_bank->base + MG_BUFFER_OFFSET; - duration_start_measure(&duration); + struct duration bench; + duration_start(&bench); for (i = 0; i < sect_cnt; i++) { ret = mg_dsk_wait(mg_io_wait_drq, MG_OEM_DISK_WAIT_TIME_NORMAL); @@ -526,11 +526,10 @@ static int mg_mflash_do_write_sects(void *buff, uint32_t sect_num, uint32_t sect LOG_DEBUG("mflash: %" PRIu32 " (0x%8.8" PRIx32 ") sector write", sect_num + i, (sect_num + i) * MG_MFLASH_SECTOR_SIZE); - duration_stop_measure(&duration, NULL); - - if ((duration.duration.tv_sec * 1000 + duration.duration.tv_usec / 1000) > 3000) { + ret = duration_measure(&bench); + if ((ERROR_OK == ret) && (duration_elapsed(&bench) > 3)) { LOG_INFO("mflash: wrote %" PRIu32 "'th sectors", sect_num + i); - duration_start_measure(&duration); + duration_start(&bench); } } @@ -708,8 +707,6 @@ static int mg_write_cmd(struct command_context_s *cmd_ctx, char *cmd, char **arg uint32_t address, buf_cnt, cnt, res, i; uint8_t *buffer; fileio_t fileio; - duration_t duration; - char *duration_text; int ret; if (argc != 3) { @@ -731,7 +728,8 @@ static int mg_write_cmd(struct command_context_s *cmd_ctx, char *cmd, char **arg cnt = fileio.size / MG_FILEIO_CHUNK; res = fileio.size % MG_FILEIO_CHUNK; - duration_start_measure(&duration); + struct duration bench; + duration_start(&bench); for (i = 0; i < cnt; i++) { if ((ret = fileio_read(&fileio, MG_FILEIO_CHUNK, buffer, &buf_cnt)) != @@ -749,21 +747,19 @@ static int mg_write_cmd(struct command_context_s *cmd_ctx, char *cmd, char **arg goto mg_write_cmd_err; } - duration_stop_measure(&duration, &duration_text); - - command_print(cmd_ctx, "wrote %lli byte from file %s in %s (%f kB/s)", - fileio.size, args[1], duration_text, - (float)fileio.size / 1024.0 / ((float)duration.duration.tv_sec + ((float)duration.duration.tv_usec / 1000000.0))); + if (duration_measure(&bench) == ERROR_OK) + { + command_print(cmd_ctx, "wrote %lli byte from file %s " + "in %fs (%0.3f kB/s)", fileio.size, args[1], + duration_elapsed(&bench), duration_kbps(&bench, fileio.size)); + } - free(duration_text); free(buffer); fileio_close(&fileio); return ERROR_OK; mg_write_cmd_err: - duration_stop_measure(&duration, &duration_text); - free(duration_text); free(buffer); fileio_close(&fileio); @@ -775,8 +771,6 @@ static int mg_dump_cmd(struct command_context_s *cmd_ctx, char *cmd, char **args uint32_t address, size_written, size, cnt, res, i; uint8_t *buffer; fileio_t fileio; - duration_t duration; - char *duration_text; int ret; if (argc != 4) { @@ -799,7 +793,8 @@ static int mg_dump_cmd(struct command_context_s *cmd_ctx, char *cmd, char **args cnt = size / MG_FILEIO_CHUNK; res = size % MG_FILEIO_CHUNK; - duration_start_measure(&duration); + struct duration bench; + duration_start(&bench); for (i = 0; i < cnt; i++) { if ((ret = mg_mflash_read(address, buffer, MG_FILEIO_CHUNK)) != ERROR_OK) @@ -817,21 +812,20 @@ static int mg_dump_cmd(struct command_context_s *cmd_ctx, char *cmd, char **args goto mg_dump_cmd_err; } - duration_stop_measure(&duration, &duration_text); - - command_print(cmd_ctx, "dump image (address 0x%8.8" PRIx32 " size %" PRIu32 ") to file %s in %s (%f kB/s)", - address, size, args[1], duration_text, - (float)size / 1024.0 / ((float)duration.duration.tv_sec + ((float)duration.duration.tv_usec / 1000000.0))); + if (duration_measure(&bench) == ERROR_OK) + { + command_print(cmd_ctx, "dump image (address 0x%8.8" PRIx32 " " + "size %" PRIu32 ") to file %s in %fs (%0.3f kB/s)", + address, size, args[1], + duration_elapsed(&bench), duration_kbps(&bench, size)); + } - free(duration_text); free(buffer); fileio_close(&fileio); return ERROR_OK; mg_dump_cmd_err: - duration_stop_measure(&duration, &duration_text); - free(duration_text); free(buffer); fileio_close(&fileio); diff --git a/src/flash/nand.c b/src/flash/nand.c index 81a04f7a..8f67624d 100644 --- a/src/flash/nand.c +++ b/src/flash/nand.c @@ -1330,8 +1330,6 @@ static int handle_nand_write_command(struct command_context_s *cmd_ctx, char *cm fileio_t fileio; - duration_t duration; - char *duration_text; if (argc < 3) { @@ -1372,7 +1370,8 @@ static int handle_nand_write_command(struct command_context_s *cmd_ctx, char *cm } } - duration_start_measure(&duration); + struct duration bench; + duration_start(&bench); if (fileio_open(&fileio, args[1], FILEIO_READ, FILEIO_BINARY) != ERROR_OK) { @@ -1478,11 +1477,13 @@ static int handle_nand_write_command(struct command_context_s *cmd_ctx, char *cm free(page); oob = NULL; page = NULL; - duration_stop_measure(&duration, &duration_text); - command_print(cmd_ctx, "wrote file %s to NAND flash %s up to offset 0x%8.8" PRIx32 " in %s", - args[1], args[0], offset, duration_text); - free(duration_text); - duration_text = NULL; + if (duration_measure(&bench) == ERROR_OK) + { + command_print(cmd_ctx, "wrote file %s to NAND flash %s " + "up to offset 0x%8.8" PRIx32 " in %fs (%0.3f kb/s)", + args[1], args[0], offset, duration_elapsed(&bench), + duration_kbps(&bench, fileio.size)); + } return ERROR_OK; } @@ -1506,8 +1507,6 @@ static int handle_nand_dump_command(struct command_context_s *cmd_ctx, char *cmd } fileio_t fileio; - duration_t duration; - char *duration_text; uint8_t *page = NULL; uint32_t page_size = 0; @@ -1560,7 +1559,8 @@ static int handle_nand_dump_command(struct command_context_s *cmd_ctx, char *cmd return ERROR_OK; } - duration_start_measure(&duration); + struct duration bench; + duration_start(&bench); while (size > 0) { @@ -1596,10 +1596,12 @@ static int handle_nand_dump_command(struct command_context_s *cmd_ctx, char *cmd oob = NULL; fileio_close(&fileio); - duration_stop_measure(&duration, &duration_text); - command_print(cmd_ctx, "dumped %lld byte in %s", fileio.size, duration_text); - free(duration_text); - duration_text = NULL; + if (duration_measure(&bench) == ERROR_OK) + { + command_print(cmd_ctx, "dumped %lld byte in %fs (%0.3f kb/s)", + fileio.size, duration_elapsed(&bench), + duration_kbps(&bench, fileio.size)); + } return ERROR_OK; } |