int retval;
int address;
int length;
- duration_t duration;
- char *duration_text;
target_t *target = get_current_target(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;
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;
image_t image;
uint32_t written;
- duration_t duration;
- char *duration_text;
-
- int retval, retvaltemp;
+ int retval;
if (argc < 1)
{
return ERROR_FAIL;
}
- duration_start_measure(&duration);
+ struct duration bench;
+ duration_start(&bench);
if (argc >= 2)
{
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;
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;
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;
exit(-1);
}
- duration_start_measure(&duration);
+ struct duration bench;
+ duration_start(&bench);
for (wrote = 0; wrote < (count*wordsize); wrote += cur_size)
{
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;
}
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);
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);
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) {
}
}
- 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;
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);
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);
}
}
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);
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);
}
}
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) {
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)) !=
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);
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) {
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)
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);
fileio_t fileio;
- duration_t duration;
- char *duration_text;
if (argc < 3)
{
}
}
- duration_start_measure(&duration);
+ struct duration bench;
+ duration_start(&bench);
if (fileio_open(&fileio, args[1], FILEIO_READ, FILEIO_BINARY) != ERROR_OK)
{
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;
}
}
fileio_t fileio;
- duration_t duration;
- char *duration_text;
uint8_t *page = NULL;
uint32_t page_size = 0;
return ERROR_OK;
}
- duration_start_measure(&duration);
+ struct duration bench;
+ duration_start(&bench);
while (size > 0)
{
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;
}
#endif
#include "time_support.h"
-#include "log.h"
/* calculate difference between two struct timeval values */
return 0;
}
-void duration_start_measure(duration_t *duration)
+int duration_start(struct duration *duration)
{
- gettimeofday(&duration->start, NULL);
+ return gettimeofday(&duration->start, NULL);
}
-int duration_stop_measure(duration_t *duration, char **text)
+int duration_measure(struct duration *duration)
{
struct timeval end;
+ int retval = gettimeofday(&end, NULL);
+ if (0 == retval)
+ timeval_subtract(&duration->elapsed, &end, &duration->start);
+ return retval;
+}
- gettimeofday(&end, NULL);
-
- timeval_subtract(&duration->duration, &end, &duration->start);
-
- if (text)
- {
- float t;
- t = duration->duration.tv_sec;
- t += (float)duration->duration.tv_usec/1000000.0;
- *text = malloc(100);
- snprintf(*text, 100, "%fs", t);
- }
+float duration_elapsed(struct duration *duration)
+{
+ float t = duration->elapsed.tv_sec;
+ t += (float)duration->elapsed.tv_usec / 1000000.0;
+ return t;
+}
- return ERROR_OK;
+float duration_kbps(struct duration *duration, size_t count)
+{
+ return count / (1024.0 * duration_elapsed(duration));
}
long long timeval_ms()
# endif
#endif
-extern int timeval_subtract(struct timeval *result, struct timeval *x, struct timeval *y);
-extern int timeval_add(struct timeval *result, struct timeval *x, struct timeval *y);
-extern int timeval_add_time(struct timeval *result, int sec, int usec);
-/* gettimeofday() timeval in 64 bit ms */
-extern long long timeval_ms(void);
+int timeval_subtract(struct timeval *result, struct timeval *x, struct timeval *y);
+int timeval_add(struct timeval *result, struct timeval *x, struct timeval *y);
+int timeval_add_time(struct timeval *result, int sec, int usec);
-typedef struct duration_s
+/// @returns gettimeofday() timeval as 64-bit in ms
+long long timeval_ms(void);
+
+struct duration
{
struct timeval start;
- struct timeval duration;
-} duration_t;
+ struct timeval elapsed;
+};
+
+/// Update the duration->start field to start the @a duration measurement.
+int duration_start(struct duration *duration);
+/// Update the duration->elapsed field to finish the @a duration measurment.
+int duration_measure(struct duration *duration);
-extern void duration_start_measure(duration_t *duration);
-extern int duration_stop_measure(duration_t *duration, char **text);
+/// @returns Elapsed time in seconds.
+float duration_elapsed(struct duration *duration);
+/// @returns KB/sec for the elapsed @a duration and @a count bytes.
+float duration_kbps(struct duration *duration, size_t count);
#endif /* TIME_SUPPORT_H */
uint32_t min_address = 0;
uint32_t max_address = 0xffffffff;
int i;
- int retvaltemp;
-
image_t image;
- duration_t duration;
- char *duration_text;
-
int retval = parse_load_image_command_args(cmd_ctx, args, argc,
&image, &min_address, &max_address);
if (ERROR_OK != retval)
return retval;
target_t *target = get_current_target(cmd_ctx);
- duration_start_measure(&duration);
+
+ struct duration bench;
+ duration_start(&bench);
if (image_open(&image, args[0], (argc >= 3) ? args[2] : NULL) != ERROR_OK)
{
free(buffer);
}
- 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, "downloaded %" PRIu32 " bytes "
+ "in %fs (%0.3f kb/s)", image_size,
+ duration_elapsed(&bench), duration_kbps(&bench, image_size));
}
- if (retval == ERROR_OK)
- {
- command_print(cmd_ctx, "downloaded %u byte in %s",
- (unsigned int)image_size,
- duration_text);
- }
- free(duration_text);
-
image_close(&image);
return retval;
uint8_t buffer[560];
int retvaltemp;
- duration_t duration;
- char *duration_text;
target_t *target = get_current_target(cmd_ctx);
return ERROR_OK;
}
- duration_start_measure(&duration);
+ struct duration bench;
+ duration_start(&bench);
int retval = ERROR_OK;
while (size > 0)
if ((retvaltemp = fileio_close(&fileio)) != ERROR_OK)
return retvaltemp;
- if ((retvaltemp = duration_stop_measure(&duration, &duration_text)) != ERROR_OK)
- return retvaltemp;
-
- if (retval == ERROR_OK)
+ if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK))
{
- command_print(cmd_ctx, "dumped %lld byte in %s",
- fileio.size, duration_text);
- free(duration_text);
+ command_print(cmd_ctx,
+ "dumped %lld bytes in %fs (%0.3f kb/s)", fileio.size,
+ duration_elapsed(&bench), duration_kbps(&bench, fileio.size));
}
return retval;
uint32_t buf_cnt;
uint32_t image_size;
int i;
- int retval, retvaltemp;
+ int retval;
uint32_t checksum = 0;
uint32_t mem_checksum = 0;
image_t image;
- duration_t duration;
- char *duration_text;
-
target_t *target = get_current_target(cmd_ctx);
if (argc < 1)
return ERROR_FAIL;
}
- duration_start_measure(&duration);
+ struct duration bench;
+ duration_start(&bench);
if (argc >= 2)
{
image_size += buf_cnt;
}
done:
-
- if ((retvaltemp = duration_stop_measure(&duration, &duration_text)) != ERROR_OK)
- {
- image_close(&image);
- return retvaltemp;
- }
-
- if (retval == ERROR_OK)
+ if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK))
{
- command_print(cmd_ctx, "verified %u bytes in %s",
- (unsigned int)image_size,
- duration_text);
+ command_print(cmd_ctx, "verified %" PRIu32 " bytes "
+ "in %fs (%0.3f kb/s)", image_size,
+ duration_elapsed(&bench), duration_kbps(&bench, image_size));
}
- free(duration_text);
image_close(&image);
image_t image;
- duration_t duration;
- char *duration_text;
-
int retval = parse_load_image_command_args(cmd_ctx, args, argc,
&image, &min_address, &max_address);
if (ERROR_OK != retval)
return retval;
- duration_start_measure(&duration);
+ struct duration bench;
+ duration_start(&bench);
if (image_open(&image, args[0], (argc >= 3) ? args[2] : NULL) != ERROR_OK)
{
free(buffer);
}
- duration_stop_measure(&duration, &duration_text);
- if (retval == ERROR_OK)
+ if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK))
{
- command_print(cmd_ctx, "Loaded %u bytes in %s", (unsigned int)image_size, duration_text);
- command_print(cmd_ctx, "NB!!! image has not been loaded to target, issue a subsequent 'fast_load' to do so.");
+ command_print(cmd_ctx, "Loaded %" PRIu32 " bytes "
+ "in %fs (%0.3f kb/s)", image_size,
+ duration_elapsed(&bench), duration_kbps(&bench, image_size));
+
+ command_print(cmd_ctx,
+ "WARNING: image has not been loaded to target!"
+ "You can issue a 'fast_load' to finish loading.");
}
- free(duration_text);
image_close(&image);