struct fileio: improve member types
[openocd.git] / src / flash / mflash.c
index 0a502629e1af864126669313e52cf5743c5f5322..4356f2709b30e812e8f836ad3addc8b0b133036e 100644 (file)
 #endif
 
 #include "mflash.h"
+#include "target.h"
 #include "time_support.h"
 #include "fileio.h"
 #include "log.h"
 
 
-static int s3c2440_set_gpio_to_output (mflash_gpio_num_t gpio);
-static int s3c2440_set_gpio_output_val (mflash_gpio_num_t gpio, uint8_t val);
-static int pxa270_set_gpio_to_output (mflash_gpio_num_t gpio);
-static int pxa270_set_gpio_output_val (mflash_gpio_num_t gpio, uint8_t val);
+static int s3c2440_set_gpio_to_output (struct mflash_gpio_num gpio);
+static int s3c2440_set_gpio_output_val (struct mflash_gpio_num gpio, uint8_t val);
+static int pxa270_set_gpio_to_output (struct mflash_gpio_num gpio);
+static int pxa270_set_gpio_output_val (struct mflash_gpio_num gpio, uint8_t val);
 
-static command_t *mflash_cmd;
+static struct command *mflash_cmd;
 
-static mflash_bank_t *mflash_bank;
+static struct mflash_bank *mflash_bank;
 
-static mflash_gpio_drv_t pxa270_gpio = {
+static struct mflash_gpio_drv pxa270_gpio = {
        .name = "pxa270",
        .set_gpio_to_output = pxa270_set_gpio_to_output,
        .set_gpio_output_val = pxa270_set_gpio_output_val
 };
 
-static mflash_gpio_drv_t s3c2440_gpio = {
+static struct mflash_gpio_drv s3c2440_gpio = {
        .name = "s3c2440",
        .set_gpio_to_output = s3c2440_set_gpio_to_output,
        .set_gpio_output_val = s3c2440_set_gpio_output_val
 };
 
-static mflash_gpio_drv_t *mflash_gpio[] =
+static struct mflash_gpio_drv *mflash_gpio[] =
 {
                &pxa270_gpio,
                &s3c2440_gpio,
@@ -64,10 +65,10 @@ static mflash_gpio_drv_t *mflash_gpio[] =
 #define PXA270_GPSR0 0x40E00018
 #define PXA270_GPCR0 0x40E00024
 
-static int pxa270_set_gpio_to_output (mflash_gpio_num_t gpio)
+static int pxa270_set_gpio_to_output (struct mflash_gpio_num gpio)
 {
        uint32_t addr, value, mask;
-       target_t *target = mflash_bank->target;
+       struct target *target = mflash_bank->target;
        int ret;
 
        /* remove alternate function. */
@@ -101,10 +102,10 @@ static int pxa270_set_gpio_to_output (mflash_gpio_num_t gpio)
        return ret;
 }
 
-static int pxa270_set_gpio_output_val (mflash_gpio_num_t gpio, uint8_t val)
+static int pxa270_set_gpio_output_val (struct mflash_gpio_num gpio, uint8_t val)
 {
        uint32_t addr, value, mask;
-       target_t *target = mflash_bank->target;
+       struct target *target = mflash_bank->target;
        int ret;
 
        mask = 0x1u << (gpio.num & 0x1F);
@@ -130,10 +131,10 @@ static int pxa270_set_gpio_output_val (mflash_gpio_num_t gpio, uint8_t val)
 #define S3C2440_GPJCON 0x560000d0
 #define S3C2440_GPJDAT 0x560000d4
 
-static int s3c2440_set_gpio_to_output (mflash_gpio_num_t gpio)
+static int s3c2440_set_gpio_to_output (struct mflash_gpio_num gpio)
 {
        uint32_t data, mask, gpio_con;
-       target_t *target = mflash_bank->target;
+       struct target *target = mflash_bank->target;
        int ret;
 
        if (gpio.port[0] >= 'a' && gpio.port[0] <= 'h') {
@@ -162,10 +163,10 @@ static int s3c2440_set_gpio_to_output (mflash_gpio_num_t gpio)
        return ret;
 }
 
-static int s3c2440_set_gpio_output_val (mflash_gpio_num_t gpio, uint8_t val)
+static int s3c2440_set_gpio_output_val (struct mflash_gpio_num gpio, uint8_t val)
 {
        uint32_t data, mask, gpio_dat;
-       target_t *target = mflash_bank->target;
+       struct target *target = mflash_bank->target;
        int ret;
 
        if (gpio.port[0] >= 'a' && gpio.port[0] <= 'h') {
@@ -199,7 +200,7 @@ static int mg_hdrst(uint8_t level)
 static int mg_init_gpio (void)
 {
        int ret;
-       mflash_gpio_drv_t *gpio_drv = mflash_bank->gpio_drv;
+       struct mflash_gpio_drv *gpio_drv = mflash_bank->gpio_drv;
 
        ret = gpio_drv->set_gpio_to_output(mflash_bank->rst_pin);
        if (ret != ERROR_OK)
@@ -213,13 +214,13 @@ static int mg_init_gpio (void)
 static int mg_dsk_wait(mg_io_type_wait wait, uint32_t time)
 {
        uint8_t status, error;
-       target_t *target = mflash_bank->target;
+       struct target *target = mflash_bank->target;
        uint32_t mg_task_reg = mflash_bank->base + MG_REG_OFFSET;
-       duration_t duration;
        int ret;
-       long long t=0;
+       long long t = 0;
 
-       duration_start_measure(&duration);
+       struct duration bench;
+       duration_start(&bench);
 
        while (time) {
 
@@ -232,7 +233,7 @@ static int mg_dsk_wait(mg_io_type_wait wait, uint32_t time)
                        if (wait == mg_io_wait_bsy)
                                return ERROR_OK;
                } else {
-                       switch(wait)
+                       switch (wait)
                        {
                                case mg_io_wait_not_bsy:
                                        return ERROR_OK;
@@ -275,10 +276,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;
@@ -290,7 +292,7 @@ static int mg_dsk_wait(mg_io_type_wait wait, uint32_t time)
 
 static int mg_dsk_srst(uint8_t on)
 {
-       target_t *target = mflash_bank->target;
+       struct target *target = mflash_bank->target;
        uint32_t mg_task_reg = mflash_bank->base + MG_REG_OFFSET;
        uint8_t value;
        int ret;
@@ -298,7 +300,7 @@ static int mg_dsk_srst(uint8_t on)
        if ((ret = target_read_u8(target, mg_task_reg + MG_REG_DRV_CTRL, &value)) != ERROR_OK)
                return ret;
 
-       if(on) {
+       if (on) {
                value |= (mg_io_rbit_devc_srst);
        } else {
                value &= ~mg_io_rbit_devc_srst;
@@ -310,7 +312,7 @@ static int mg_dsk_srst(uint8_t on)
 
 static int mg_dsk_io_cmd(uint32_t sect_num, uint32_t cnt, uint8_t cmd)
 {
-       target_t *target = mflash_bank->target;
+       struct target *target = mflash_bank->target;
        uint32_t mg_task_reg = mflash_bank->base + MG_REG_OFFSET;
        uint8_t value;
        int ret;
@@ -335,7 +337,7 @@ static int mg_dsk_io_cmd(uint32_t sect_num, uint32_t cnt, uint8_t cmd)
 
 static int mg_dsk_drv_info(void)
 {
-       target_t *target = mflash_bank->target;
+       struct target *target = mflash_bank->target;
        uint32_t mg_buff = mflash_bank->base + MG_BUFFER_OFFSET;
        int ret;
 
@@ -348,7 +350,7 @@ static int mg_dsk_drv_info(void)
        LOG_INFO("mflash: read drive info");
 
        if (! mflash_bank->drv_info)
-               mflash_bank->drv_info = malloc(sizeof(mg_drv_info_t));
+               mflash_bank->drv_info = malloc(sizeof(struct mg_drv_info));
 
        target_read_memory(target, mg_buff, 2, sizeof(mg_io_type_drv_info) >> 1,
                        (uint8_t *)&mflash_bank->drv_info->drv_id);
@@ -407,15 +409,15 @@ static int mg_mflash_probe(void)
        return mg_dsk_drv_info();
 }
 
-static int mg_probe_cmd(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+COMMAND_HANDLER(mg_probe_cmd)
 {
        int ret;
 
        ret = mg_mflash_probe();
 
        if (ret == ERROR_OK) {
-               command_print(cmd_ctx, "mflash (total %u sectors) found at 0x%8.8x",
-                               mflash_bank->drv_info->tot_sects, mflash_bank->base );
+               command_print(cmd_ctx, "mflash (total %" PRIu32 " sectors) found at 0x%8.8" PRIx32 "",
+                               mflash_bank->drv_info->tot_sects, mflash_bank->base);
        }
 
        return ret;
@@ -425,16 +427,16 @@ static int mg_mflash_do_read_sects(void *buff, uint32_t sect_num, uint32_t sect_
 {
        uint32_t i, address;
        int ret;
-       target_t *target = mflash_bank->target;
+       struct target *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 )
+       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);
@@ -451,13 +453,12 @@ static int mg_mflash_do_read_sects(void *buff, uint32_t sect_num, uint32_t sect_
                if (ret != ERROR_OK)
                        return ret;
 
-               LOG_DEBUG("mflash: %u (0x%8.8x) sector read", sect_num + i, (sect_num + i) * MG_MFLASH_SECTOR_SIZE);
+               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) {
-                       LOG_INFO("mflash: read %u'th sectors", sect_num + i);
-                       duration_start_measure(&duration);
+               ret = duration_measure(&bench);
+               if ((ERROR_OK == ret) && (duration_elapsed(&bench) > 3)) {
+                       LOG_INFO("mflash: read %" PRIu32 "'th sectors", sect_num + i);
+                       duration_start(&bench);
                }
        }
 
@@ -474,8 +475,8 @@ static int mg_mflash_read_sects(void *buff, uint32_t sect_num, uint32_t sect_cnt
        residue = sect_cnt % 256;
 
        for (i = 0; i < quotient; i++) {
-               LOG_DEBUG("mflash: sect num : %u buff : 0x%0lx", sect_num, 
-                       (unsigned long)buff_ptr);
+               LOG_DEBUG("mflash: sect num : %" PRIu32 " buff : %p",
+                               sect_num, buff_ptr);
                ret = mg_mflash_do_read_sects(buff_ptr, sect_num, 256);
                if (ret != ERROR_OK)
                        return ret;
@@ -485,8 +486,8 @@ static int mg_mflash_read_sects(void *buff, uint32_t sect_num, uint32_t sect_cnt
        }
 
        if (residue) {
-               LOG_DEBUG("mflash: sect num : %u buff : %0lx", sect_num, 
-                       (unsigned long)buff_ptr);
+               LOG_DEBUG("mflash: sect num : %" PRIx32 " buff : %p",
+                               sect_num, buff_ptr);
                return mg_mflash_do_read_sects(buff_ptr, sect_num, residue);
        }
 
@@ -498,16 +499,16 @@ static int mg_mflash_do_write_sects(void *buff, uint32_t sect_num, uint32_t sect
 {
        uint32_t i, address;
        int ret;
-       target_t *target = mflash_bank->target;
+       struct target *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 )
+       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);
@@ -517,20 +518,19 @@ static int mg_mflash_do_write_sects(void *buff, uint32_t sect_num, uint32_t sect
                ret = target_write_memory(target, address, 2, MG_MFLASH_SECTOR_SIZE / 2, buff_ptr);
                if (ret != ERROR_OK)
                        return ret;
-               
+
                buff_ptr += MG_MFLASH_SECTOR_SIZE;
 
                ret = target_write_u8(target, mflash_bank->base + MG_REG_OFFSET + MG_REG_COMMAND, mg_io_cmd_confirm_write);
                if (ret != ERROR_OK)
                        return ret;
 
-               LOG_DEBUG("mflash: %u (0x%8.8x) sector write", sect_num + i, (sect_num + i) * MG_MFLASH_SECTOR_SIZE);
-
-               duration_stop_measure(&duration, NULL);
+               LOG_DEBUG("mflash: %" PRIu32 " (0x%8.8" PRIx32 ") sector write", sect_num + i, (sect_num + i) * MG_MFLASH_SECTOR_SIZE);
 
-               if ((duration.duration.tv_sec * 1000 + duration.duration.tv_usec / 1000) > 3000) {
-                       LOG_INFO("mflash: wrote %u'th sectors", sect_num + i);
-                       duration_start_measure(&duration);
+               ret = duration_measure(&bench);
+               if ((ERROR_OK == ret) && (duration_elapsed(&bench) > 3)) {
+                       LOG_INFO("mflash: wrote %" PRIu32 "'th sectors", sect_num + i);
+                       duration_start(&bench);
                }
        }
 
@@ -552,8 +552,8 @@ static int mg_mflash_write_sects(void *buff, uint32_t sect_num, uint32_t sect_cn
        residue = sect_cnt % 256;
 
        for (i = 0; i < quotient; i++) {
-               LOG_DEBUG("mflash: sect num : %u buff : %0lx", sect_num, 
-                       (unsigned long)buff_ptr);
+               LOG_DEBUG("mflash: sect num : %" PRIu32 "buff : %p", sect_num,
+                       buff_ptr);
                ret = mg_mflash_do_write_sects(buff_ptr, sect_num, 256, mg_io_cmd_write);
                if (ret != ERROR_OK)
                        return ret;
@@ -563,8 +563,8 @@ static int mg_mflash_write_sects(void *buff, uint32_t sect_num, uint32_t sect_cn
        }
 
        if (residue) {
-               LOG_DEBUG("mflash: sect num : %u buff : %0lx", sect_num, 
-                       (unsigned long)buff_ptr);
+               LOG_DEBUG("mflash: sect num : %" PRIu32 " buff : %p", sect_num,
+                       buff_ptr);
                return mg_mflash_do_write_sects(buff_ptr, sect_num, residue, mg_io_cmd_write);
        }
 
@@ -592,11 +592,11 @@ static int mg_mflash_read (uint32_t addr, uint8_t *buff, uint32_t len)
 
                if (end_addr < next_sec_addr) {
                        memcpy(buff_ptr, sect_buff + (cur_addr & MG_MFLASH_SECTOR_SIZE_MASK), end_addr - cur_addr);
-                       LOG_DEBUG("mflash: copies %u byte from sector offset 0x%8.8x", end_addr - cur_addr, cur_addr);
+                       LOG_DEBUG("mflash: copies %" PRIu32 " byte from sector offset 0x%8.8" PRIx32 "", end_addr - cur_addr, cur_addr);
                        cur_addr = end_addr;
                } else {
                        memcpy(buff_ptr, sect_buff + (cur_addr & MG_MFLASH_SECTOR_SIZE_MASK), next_sec_addr - cur_addr);
-                       LOG_DEBUG("mflash: copies %u byte from sector offset 0x%8.8x", next_sec_addr - cur_addr, cur_addr);
+                       LOG_DEBUG("mflash: copies %" PRIu32 " byte from sector offset 0x%8.8" PRIx32 "", next_sec_addr - cur_addr, cur_addr);
                        buff_ptr += (next_sec_addr - cur_addr);
                        cur_addr = next_sec_addr;
                }
@@ -627,7 +627,7 @@ static int mg_mflash_read (uint32_t addr, uint8_t *buff, uint32_t len)
                                return ret;
 
                        memcpy(buff_ptr, sect_buff, end_addr - cur_addr);
-                       LOG_DEBUG("mflash: copies %u byte", end_addr - cur_addr);
+                       LOG_DEBUG("mflash: copies %u byte", (unsigned)(end_addr - cur_addr));
 
                }
        }
@@ -656,11 +656,11 @@ static int mg_mflash_write(uint32_t addr, uint8_t *buff, uint32_t len)
 
                if (end_addr < next_sec_addr) {
                        memcpy(sect_buff + (cur_addr & MG_MFLASH_SECTOR_SIZE_MASK), buff_ptr, end_addr - cur_addr);
-                       LOG_DEBUG("mflash: copies %u byte to sector offset 0x%8.8x", end_addr - cur_addr, cur_addr);
+                       LOG_DEBUG("mflash: copies %" PRIu32 " byte to sector offset 0x%8.8" PRIx32 "", end_addr - cur_addr, cur_addr);
                        cur_addr = end_addr;
                } else {
                        memcpy(sect_buff + (cur_addr & MG_MFLASH_SECTOR_SIZE_MASK), buff_ptr, next_sec_addr - cur_addr);
-                       LOG_DEBUG("mflash: copies %u byte to sector offset 0x%8.8x", next_sec_addr - cur_addr, cur_addr);
+                       LOG_DEBUG("mflash: copies %" PRIu32 " byte to sector offset 0x%8.8" PRIx32 "", next_sec_addr - cur_addr, cur_addr);
                        buff_ptr += (next_sec_addr - cur_addr);
                        cur_addr = next_sec_addr;
                }
@@ -695,7 +695,7 @@ static int mg_mflash_write(uint32_t addr, uint8_t *buff, uint32_t len)
                                return ret;
 
                        memcpy(sect_buff, buff_ptr, end_addr - cur_addr);
-                       LOG_DEBUG("mflash: copies %u byte", end_addr - cur_addr);
+                       LOG_DEBUG("mflash: copies %" PRIu32 " byte", end_addr - cur_addr);
                        ret = mg_mflash_write_sects(sect_buff, sect_num, 1);
                }
        }
@@ -703,20 +703,18 @@ static int mg_mflash_write(uint32_t addr, uint8_t *buff, uint32_t len)
        return ret;
 }
 
-static int mg_write_cmd(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+COMMAND_HANDLER(mg_write_cmd)
 {
        uint32_t address, buf_cnt, cnt, res, i;
        uint8_t *buffer;
-       fileio_t fileio;
-       duration_t duration;
-       char *duration_text;
+       struct fileio fileio;
        int ret;
 
        if (argc != 3) {
                return ERROR_COMMAND_SYNTAX_ERROR;
        }
 
-       address = strtoul(args[2], NULL, 0);
+       COMMAND_PARSE_NUMBER(u32, args[2], address);
 
        ret = fileio_open(&fileio, args[1], FILEIO_READ, FILEIO_BINARY);
        if (ret != ERROR_OK)
@@ -731,7 +729,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)) !=
@@ -741,55 +740,51 @@ static int mg_write_cmd(struct command_context_s *cmd_ctx, char *cmd, char **arg
                        goto mg_write_cmd_err;
                address += MG_FILEIO_CHUNK;
        }
+
        if (res) {
                if ((ret = fileio_read(&fileio, res, buffer, &buf_cnt)) != ERROR_OK)
-                       goto mg_write_cmd_err;                  
+                       goto mg_write_cmd_err;
                if ((ret = mg_mflash_write(address, buffer, res)) != ERROR_OK)
                        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 %zu 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);
 
        return ret;
 }
 
-static int mg_dump_cmd(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+COMMAND_HANDLER(mg_dump_cmd)
 {
        uint32_t address, size_written, size, cnt, res, i;
        uint8_t *buffer;
-       fileio_t fileio;
-       duration_t duration;
-       char *duration_text;
+       struct fileio fileio;
        int ret;
 
        if (argc != 4) {
                return ERROR_COMMAND_SYNTAX_ERROR;
        }
 
-       address = strtoul(args[2], NULL, 0);
-       size = strtoul(args[3], NULL, 0);
+       COMMAND_PARSE_NUMBER(u32, args[2], address);
+       COMMAND_PARSE_NUMBER(u32, args[3], size);
 
        ret = fileio_open(&fileio, args[1], FILEIO_WRITE, FILEIO_BINARY);
        if (ret != ERROR_OK)
                return ret;
+
        buffer = malloc(MG_FILEIO_CHUNK);
        if (!buffer) {
                fileio_close(&fileio);
@@ -798,8 +793,9 @@ 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)
@@ -809,7 +805,7 @@ static int mg_dump_cmd(struct command_context_s *cmd_ctx, char *cmd, char **args
                        goto mg_dump_cmd_err;
                address += MG_FILEIO_CHUNK;
        }
+
        if (res) {
                if ((ret = mg_mflash_read(address, buffer, res)) != ERROR_OK)
                        goto mg_dump_cmd_err;
@@ -817,30 +813,29 @@ 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.8x size %u) 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);
-       return ret;     
+
+       return ret;
 }
 
 static int mg_set_feature(mg_feature_id feature, mg_feature_val config)
 {
-       target_t *target = mflash_bank->target;
+       struct target *target = mflash_bank->target;
        uint32_t mg_task_reg = mflash_bank->base + MG_REG_OFFSET;
        int ret;
 
@@ -871,7 +866,7 @@ static int mg_pll_get_M(unsigned short feedback_div)
 {
        int i, M;
 
-       for (i = 1, M=0; i < 512; i <<= 1, feedback_div >>= 1)
+       for (i = 1, M = 0; i < 512; i <<= 1, feedback_div >>= 1)
                M += (feedback_div & 1) * i;
 
        return M + 2;
@@ -892,7 +887,7 @@ static int mg_pll_get_NO(unsigned char  output_div)
        int i, NO;
 
        for (i = 0, NO = 1; i < 2; ++i, output_div >>= 1)
-               if(output_div & 1)
+               if (output_div & 1)
                        NO = NO << 1;
 
        return NO;
@@ -923,7 +918,7 @@ static double mg_do_calc_pll(double XIN, mg_pll_t * p_pll_val, int is_approximat
 
                                CLK_OUT = XIN * ((double)M / N) / NO;
 
-                               if ((int)((CLK_OUT+ROUND) / DIV)
+                               if ((int)((CLK_OUT + ROUND) / DIV)
                                                == (int)(MG_PLL_CLK_OUT / DIV)) {
                                        if (mg_is_valid_pll(XIN, N, CLK_OUT, NO) == ERROR_OK)
                                        {
@@ -959,7 +954,7 @@ static int mg_verify_interface(void)
        uint16_t buff[MG_MFLASH_SECTOR_SIZE >> 1];
        uint16_t i, j;
        uint32_t address = mflash_bank->base + MG_BUFFER_OFFSET;
-       target_t *target = mflash_bank->target;
+       struct target *target = mflash_bank->target;
        int ret;
 
        for (j = 0; j < 10; j++) {
@@ -1214,8 +1209,7 @@ static int mg_erase_nand(void)
        return ret;
 }
 
-int mg_config_cmd(struct command_context_s *cmd_ctx, char *cmd,
-               char **args, int argc)
+COMMAND_HANDLER(mg_config_cmd)
 {
        double fin, fout;
        mg_pll_t pll;
@@ -1229,7 +1223,7 @@ int mg_config_cmd(struct command_context_s *cmd_ctx, char *cmd,
 
        switch (argc) {
                case 2:
-                       if (!strcmp(args[1], "boot")) 
+                       if (!strcmp(args[1], "boot"))
                                return mg_boot_config();
                        else if (!strcmp(args[1], "storage"))
                                return mg_storage_config();
@@ -1238,7 +1232,9 @@ int mg_config_cmd(struct command_context_s *cmd_ctx, char *cmd,
                        break;
                case 3:
                        if (!strcmp(args[1], "pll")) {
-                               fin = strtoul(args[2], NULL, 0);
+                               unsigned long freq;
+                               COMMAND_PARSE_NUMBER(ulong, args[2], freq);
+                               fin = freq;
 
                                if (fin > MG_PLL_CLK_OUT) {
                                        LOG_ERROR("mflash: input freq. is too large");
@@ -1252,7 +1248,7 @@ int mg_config_cmd(struct command_context_s *cmd_ctx, char *cmd,
                                        return ERROR_MG_INVALID_PLL;
                                }
 
-                               LOG_INFO("mflash: Fout=%u Hz, feedback=%u," 
+                               LOG_INFO("mflash: Fout=%" PRIu32 " Hz, feedback=%u,"
                                                "indiv=%u, outdiv=%u, lock=%u",
                                                (uint32_t)fout, pll.feedback_div,
                                                pll.input_div, pll.output_div,
@@ -1270,7 +1266,7 @@ int mg_config_cmd(struct command_context_s *cmd_ctx, char *cmd,
        }
 }
 
-int mflash_init_drivers(struct command_context_s *cmd_ctx)
+int mflash_init_drivers(struct command_context *cmd_ctx)
 {
        if (mflash_bank) {
                register_command(cmd_ctx, mflash_cmd, "probe", mg_probe_cmd, COMMAND_EXEC, NULL);
@@ -1285,10 +1281,9 @@ int mflash_init_drivers(struct command_context_s *cmd_ctx)
        return ERROR_OK;
 }
 
-static int mg_bank_cmd(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+COMMAND_HANDLER(mg_bank_cmd)
 {
-       target_t *target;
-       char *str;
+       struct target *target;
        int i;
 
        if (argc < 4)
@@ -1302,8 +1297,10 @@ static int mg_bank_cmd(struct command_context_s *cmd_ctx, char *cmd, char **args
                return ERROR_FAIL;
        }
 
-       mflash_bank = calloc(sizeof(mflash_bank_t), 1);
-       mflash_bank->base = strtoul(args[1], NULL, 0);
+       mflash_bank = calloc(sizeof(struct mflash_bank), 1);
+       COMMAND_PARSE_NUMBER(u32, args[1], mflash_bank->base);
+       /// @todo Verify how this parsing should work, then document it.
+       char *str;
        mflash_bank->rst_pin.num = strtoul(args[2], &str, 0);
        if (*str)
                mflash_bank->rst_pin.port[0] = (uint16_t)tolower(str[0]);
@@ -1324,7 +1321,7 @@ static int mg_bank_cmd(struct command_context_s *cmd_ctx, char *cmd, char **args
        return ERROR_OK;
 }
 
-int mflash_register_commands(struct command_context_s *cmd_ctx)
+int mflash_register_commands(struct command_context *cmd_ctx)
 {
        mflash_cmd = register_command(cmd_ctx, NULL, "mflash", NULL, COMMAND_ANY, NULL);
        register_command(cmd_ctx, mflash_cmd, "bank", mg_bank_cmd, COMMAND_CONFIG,

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)