#include "target.h" less wildly
[fw/openocd] / src / flash / mflash.c
index 0a502629e1af864126669313e52cf5743c5f5322..49dc432f36eb002c7a41c5b384264a1a5c15f23b 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 %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);
 
        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,