working_area_t -> struct working_area
[openocd.git] / src / flash / ecos.c
index 6b8637c5c289522f71a12fb13f79af0a5e662f75..450bd5b70a79c5183e9c37b09bcf6aca0504d8bf 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2007,2008 Øyvind Harboe                                 *
+ *   Copyright (C) 2007,2008 Øyvind Harboe                                 *
  *   oyvind.harboe@zylin.com                                               *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
 #include "config.h"
 #endif
 
-#include <string.h>
-
-#include "replacements.h"
-
 #include "flash.h"
+#include "embeddedice.h"
+#include "image.h"
 
-#include "target.h"
 
-#include "flash.h"
-#include "target.h"
-#include "log.h"
-#include "binarybuffer.h"
-#include "../target/embeddedice.h"
-#include "types.h"
-
-int ecosflash_register_commands(struct command_context_s *cmd_ctx);
-int ecosflash_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct flash_bank_s *bank);
-int ecosflash_erase(struct flash_bank_s *bank, int first, int last);
-int ecosflash_protect(struct flash_bank_s *bank, int set, int first, int last);
-int ecosflash_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count);
-int ecosflash_probe(struct flash_bank_s *bank);
-int ecosflash_protect_check(struct flash_bank_s *bank);
-int ecosflash_info(struct flash_bank_s *bank, char *buf, int buf_size);
-
-u32 ecosflash_get_flash_status(flash_bank_t *bank);
-void ecosflash_set_flash_mode(flash_bank_t *bank,int mode);
-u32 ecosflash_wait_status_busy(flash_bank_t *bank, u32 waitbits, int timeout);
-int ecosflash_handle_gpnvm_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-
-flash_driver_t ecosflash_flash =
-{
-       .name = "ecosflash",
-       .register_commands = ecosflash_register_commands,
-       .flash_bank_command = ecosflash_flash_bank_command,
-       .erase = ecosflash_erase,
-       .protect = ecosflash_protect,
-       .write = ecosflash_write,
-       .probe = ecosflash_probe,
-       .auto_probe = ecosflash_probe,
-       .erase_check = default_flash_blank_check,
-       .protect_check = ecosflash_protect_check,
-       .info = ecosflash_info
-};
+#if 0
+static uint32_t ecosflash_get_flash_status(flash_bank_t *bank);
+static void ecosflash_set_flash_mode(flash_bank_t *bank,int mode);
+static uint32_t ecosflash_wait_status_busy(flash_bank_t *bank, uint32_t waitbits, int timeout);
+static int ecosflash_handle_gpnvm_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
+#endif
 
-typedef struct ecosflash_flash_bank_s
+struct ecosflash_flash_bank
 {
        struct target_s *target;
-       working_area_t *write_algorithm;
-       working_area_t *erase_check_algorithm;
+       struct working_area *write_algorithm;
+       struct working_area *erase_check_algorithm;
        char *driverPath;
-       u32 start_address;
-} ecosflash_flash_bank_t;
+       uint32_t start_address;
+};
 
-static const int sectorSize=0x10000;
+static const int sectorSize = 0x10000;
 
 char *
 flash_errmsg(int err);
@@ -136,9 +104,9 @@ flash_errmsg(int err)
 
 /* flash bank ecosflash <base> <size> <chip_width> <bus_width> <target#> <driverPath>
  */
-int ecosflash_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct flash_bank_s *bank)
+FLASH_BANK_COMMAND_HANDLER(ecosflash_flash_bank_command)
 {
-       ecosflash_flash_bank_t *info;
+       struct ecosflash_flash_bank *info;
 
        if (argc < 7)
        {
@@ -146,23 +114,23 @@ int ecosflash_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, c
                return ERROR_FLASH_BANK_INVALID;
        }
 
-       info = malloc(sizeof(ecosflash_flash_bank_t));
-       if(info == NULL)
+       info = malloc(sizeof(struct ecosflash_flash_bank));
+       if (info == NULL)
        {
                LOG_ERROR("no memory for flash bank info");
                exit(-1);
        }
        bank->driver_priv = info;
-       info->driverPath=strdup(args[6]);
+       info->driverPath = strdup(args[6]);
 
        /* eCos flash sector sizes are not exposed to OpenOCD, use 0x10000 as
-        * a way to improve impeadance matach between OpenOCD and eCos flash
+        * a way to improve impedance match between OpenOCD and eCos flash
         * driver.
         */
        int i = 0;
-       u32 offset = 0;
-       bank->num_sectors=bank->size/sectorSize;
-       bank->sectors = malloc(sizeof(flash_sector_t) * bank->num_sectors);
+       uint32_t offset = 0;
+       bank->num_sectors = bank->size/sectorSize;
+       bank->sectors = malloc(sizeof(struct flash_sector) * bank->num_sectors);
        for (i = 0; i < bank->num_sectors; i++)
        {
                bank->sectors[i].offset = offset;
@@ -172,32 +140,32 @@ int ecosflash_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, c
                bank->sectors[i].is_protected = 0;
        }
 
-       info->target = get_target_by_num(strtoul(args[5], NULL, 0));
+       info->target = get_target(args[5]);
        if (info->target == NULL)
        {
-               LOG_ERROR("no target '%i' configured", (int)strtoul(args[5], NULL, 0));
+               LOG_ERROR("target '%s' not defined", args[5]);
                return ERROR_FAIL;
        }
        return ERROR_OK;
 }
 
-int loadDriver(ecosflash_flash_bank_t *info)
+static int loadDriver(struct ecosflash_flash_bank *info)
 {
-       u32 buf_cnt;
-       u32 image_size;
+       uint32_t buf_cnt;
+       uint32_t image_size;
        image_t image;
 
        image.base_address_set = 0;
        image.start_address_set = 0;
-       target_t *target=info->target;
+       target_t *target = info->target;
        int retval;
 
-       if ((retval=image_open(&image, info->driverPath, NULL)) != ERROR_OK)
+       if ((retval = image_open(&image, info->driverPath, NULL)) != ERROR_OK)
        {
                return retval;
        }
 
-       info->start_address=image.start_address;
+       info->start_address = image.start_address;
 
        image_size = 0x0;
        int i;
@@ -213,7 +181,7 @@ int loadDriver(ecosflash_flash_bank_t *info)
                }
                target_write_buffer(target, image.sections[i].base_address, buf_cnt, buffer);
                image_size += buf_cnt;
-               LOG_DEBUG("%u byte written at address 0x%8.8x", buf_cnt, image.sections[i].base_address);
+               LOG_DEBUG("%" PRIu32 " byte written at address 0x%8.8" PRIx32 "", buf_cnt, image.sections[i].base_address);
 
                free(buffer);
        }
@@ -223,23 +191,23 @@ int loadDriver(ecosflash_flash_bank_t *info)
        return ERROR_OK;
 }
 
-static int const OFFSET_ERASE=0x0;
-static int const OFFSET_ERASE_SIZE=0x8;
-static int const OFFSET_FLASH=0xc;
-static int const OFFSET_FLASH_SIZE=0x8;
-static int const OFFSET_GET_WORKAREA=0x18;
-static int const OFFSET_GET_WORKAREA_SIZE=0x4;
+static int const OFFSET_ERASE = 0x0;
+static int const OFFSET_ERASE_SIZE = 0x8;
+static int const OFFSET_FLASH = 0xc;
+static int const OFFSET_FLASH_SIZE = 0x8;
+static int const OFFSET_GET_WORKAREA = 0x18;
+static int const OFFSET_GET_WORKAREA_SIZE = 0x4;
 
-int runCode(ecosflash_flash_bank_t *info,
-               u32 codeStart, u32 codeStop, u32 r0, u32 r1, u32 r2,
-               u32 *result,
+static int runCode(struct ecosflash_flash_bank *info,
+               uint32_t codeStart, uint32_t codeStop, uint32_t r0, uint32_t r1, uint32_t r2,
+               uint32_t *result,
                /* timeout in ms */
                int timeout)
 {
-       target_t *target=info->target;
+       target_t *target = info->target;
 
-       reg_param_t reg_params[3];
-       armv4_5_algorithm_t armv4_5_info;
+       struct reg_param reg_params[3];
+       struct armv4_5_algorithm armv4_5_info;
        armv4_5_info.common_magic = ARMV4_5_COMMON_MAGIC;
        armv4_5_info.core_mode = ARMV4_5_MODE_SVC;
        armv4_5_info.core_state = ARMV4_5_STATE_ARM;
@@ -253,7 +221,7 @@ int runCode(ecosflash_flash_bank_t *info,
        buf_set_u32(reg_params[2].value, 0, 32, r2);
 
        int retval;
-       if ((retval = target->type->run_algorithm(target, 0, NULL, 3, reg_params,
+       if ((retval = target_run_algorithm(target, 0, NULL, 3, reg_params,
                        codeStart,
                        codeStop, timeout,
                        &armv4_5_info)) != ERROR_OK)
@@ -262,7 +230,7 @@ int runCode(ecosflash_flash_bank_t *info,
                return retval;
        }
 
-       *result=buf_get_u32(reg_params[0].value, 0, 32);
+       *result = buf_get_u32(reg_params[0].value, 0, 32);
 
        destroy_reg_param(&reg_params[0]);
        destroy_reg_param(&reg_params[1]);
@@ -271,81 +239,81 @@ int runCode(ecosflash_flash_bank_t *info,
        return ERROR_OK;
 }
 
-int eCosBoard_erase(ecosflash_flash_bank_t *info, u32 address, u32 len)
+static int eCosBoard_erase(struct ecosflash_flash_bank *info, uint32_t address, uint32_t len)
 {
        int retval;
        int timeout = (len / 20480 + 1) * 1000; /*asume 20 KB/s*/
 
-       retval=loadDriver(info);
-       if (retval!=ERROR_OK)
+       retval = loadDriver(info);
+       if (retval != ERROR_OK)
                return retval;
 
-       u32 flashErr;
-       retval=runCode(info,
-                       info->start_address+OFFSET_ERASE,
-                       info->start_address+OFFSET_ERASE+OFFSET_ERASE_SIZE,
+       uint32_t flashErr;
+       retval = runCode(info,
+                       info->start_address + OFFSET_ERASE,
+                       info->start_address + OFFSET_ERASE + OFFSET_ERASE_SIZE,
                        address,
                        len,
                        0,
                        &flashErr,
                        timeout
-                       );
-       if (retval!=ERROR_OK)
+);
+       if (retval != ERROR_OK)
                return retval;
 
        if (flashErr != 0x0)
        {
-               LOG_ERROR("Flash erase failed with %d (%s)\n", flashErr, flash_errmsg(flashErr));
+               LOG_ERROR("Flash erase failed with %d (%s)\n", (int)flashErr, flash_errmsg(flashErr));
                return ERROR_FAIL;
        }
 
        return ERROR_OK;
 }
 
-int eCosBoard_flash(ecosflash_flash_bank_t *info, void *data, u32 address, u32 len)
+static int eCosBoard_flash(struct ecosflash_flash_bank *info, void *data, uint32_t address, uint32_t len)
 {
-       target_t *target=info->target;
-       const int chunk=8192;
-       int retval=ERROR_OK;
+       target_t *target = info->target;
+       const int chunk = 8192;
+       int retval = ERROR_OK;
        int timeout = (chunk / 20480 + 1) * 1000; /*asume 20 KB/s + 1 second*/
 
-       retval=loadDriver(info);
-       if (retval!=ERROR_OK)
+       retval = loadDriver(info);
+       if (retval != ERROR_OK)
                return retval;
 
-       u32 buffer;
-       retval=runCode(info,
-                       info->start_address+OFFSET_GET_WORKAREA,
-                       info->start_address+OFFSET_GET_WORKAREA+OFFSET_GET_WORKAREA_SIZE,
+       uint32_t buffer;
+       retval = runCode(info,
+                       info->start_address + OFFSET_GET_WORKAREA,
+                       info->start_address + OFFSET_GET_WORKAREA + OFFSET_GET_WORKAREA_SIZE,
                        0,
                        0,
                        0,
                        &buffer,
                        1000);
-       if (retval!=ERROR_OK)
+       if (retval != ERROR_OK)
                return retval;
 
 
-       int i;
-       for (i=0; i<len; i+=chunk)
+       uint32_t i;
+       for (i = 0; i < len; i += chunk)
        {
-               int t=len-i;
-               if (t>chunk)
+               int t = len-i;
+               if (t > chunk)
                {
-                       t=chunk;
+                       t = chunk;
                }
 
                int retval;
-               retval=target_write_buffer(target, buffer, t, ((u8 *)data)+i);
+               retval = target_write_buffer(target, buffer, t, ((uint8_t *)data) + i);
                if (retval != ERROR_OK)
                        return retval;
 
-               u32 flashErr;
-               retval=runCode(info,
-                               info->start_address+OFFSET_FLASH,
-                               info->start_address+OFFSET_FLASH+OFFSET_FLASH_SIZE,
+               uint32_t flashErr;
+               retval = runCode(info,
+                               info->start_address + OFFSET_FLASH,
+                               info->start_address + OFFSET_FLASH + OFFSET_FLASH_SIZE,
                                buffer,
-                               address+i,
+                               address + i,
                                t,
                                &flashErr,
                                timeout);
@@ -354,19 +322,19 @@ int eCosBoard_flash(ecosflash_flash_bank_t *info, void *data, u32 address, u32 l
 
                if (flashErr != 0x0)
                {
-                       LOG_ERROR("Flash prog failed with %d (%s)\n", flashErr, flash_errmsg(flashErr));
+                       LOG_ERROR("Flash prog failed with %d (%s)\n", (int)flashErr, flash_errmsg(flashErr));
                        return ERROR_FAIL;
                }
        }
        return ERROR_OK;
 }
 
-int ecosflash_probe(struct flash_bank_s *bank)
+static int ecosflash_probe(struct flash_bank_s *bank)
 {
        return ERROR_OK;
 }
 
-int ecosflash_register_commands(struct command_context_s *cmd_ctx)
+static int ecosflash_register_commands(struct command_context_s *cmd_ctx)
 {
        register_command(cmd_ctx, NULL, "ecosflash", NULL, COMMAND_ANY, NULL);
 
@@ -374,9 +342,9 @@ int ecosflash_register_commands(struct command_context_s *cmd_ctx)
 }
 
 #if 0
-static void command(flash_bank_t *bank, u8 cmd, u8 *cmd_buf)
+static void command(flash_bank_t *bank, uint8_t cmd, uint8_t *cmd_buf)
 {
-       ecosflash_flash_bank_t *info = bank->driver_priv;
+       struct ecosflash_flash_bank *info = bank->driver_priv;
        int i;
 
        if (info->target->endianness == TARGET_LITTLE_ENDIAN)
@@ -396,10 +364,11 @@ static void command(flash_bank_t *bank, u8 cmd, u8 *cmd_buf)
 }
 #endif
 
-u32 ecosflash_address(struct flash_bank_s *bank, u32 address)
+#if 0
+static uint32_t ecosflash_address(struct flash_bank_s *bank, uint32_t address)
 {
-       u32 retval = 0;
-       switch(bank->bus_width)
+       uint32_t retval = 0;
+       switch (bank->bus_width)
        {
                case 4:
                        retval = address & 0xfffffffc;
@@ -411,54 +380,71 @@ u32 ecosflash_address(struct flash_bank_s *bank, u32 address)
 
        return retval + bank->base;
 }
+#endif
 
-int ecosflash_erase(struct flash_bank_s *bank, int first, int last)
+static int ecosflash_erase(struct flash_bank_s *bank, int first, int last)
 {
-       struct flash_bank_s *c=bank;
-       ecosflash_flash_bank_t *info = bank->driver_priv;
-       return eCosBoard_erase(info, c->base+first*sectorSize, sectorSize*(last-first+1));
+       struct flash_bank_s *c = bank;
+       struct ecosflash_flash_bank *info = bank->driver_priv;
+       return eCosBoard_erase(info, c->base + first*sectorSize, sectorSize*(last-first + 1));
 }
 
-int ecosflash_protect(struct flash_bank_s *bank, int set, int first, int last)
+static int ecosflash_protect(struct flash_bank_s *bank, int set, int first, int last)
 {
        return ERROR_OK;
 }
 
-int ecosflash_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count)
+static int ecosflash_write(struct flash_bank_s *bank, uint8_t *buffer, uint32_t offset, uint32_t count)
 {
-       ecosflash_flash_bank_t *info = bank->driver_priv;
-       struct flash_bank_s *c=bank;
-       return eCosBoard_flash(info, buffer, c->base+offset, count);
+       struct ecosflash_flash_bank *info = bank->driver_priv;
+       struct flash_bank_s *c = bank;
+       return eCosBoard_flash(info, buffer, c->base + offset, count);
 }
 
-int ecosflash_protect_check(struct flash_bank_s *bank)
+static int ecosflash_protect_check(struct flash_bank_s *bank)
 {
        return ERROR_OK;
 }
 
-int ecosflash_info(struct flash_bank_s *bank, char *buf, int buf_size)
+static int ecosflash_info(struct flash_bank_s *bank, char *buf, int buf_size)
 {
-       ecosflash_flash_bank_t *info = bank->driver_priv;
+       struct ecosflash_flash_bank *info = bank->driver_priv;
        snprintf(buf, buf_size, "eCos flash driver: %s", info->driverPath);
        return ERROR_OK;
 }
 
-u32 ecosflash_get_flash_status(flash_bank_t *bank)
+#if 0
+static uint32_t ecosflash_get_flash_status(flash_bank_t *bank)
 {
        return ERROR_OK;
 }
 
-void ecosflash_set_flash_mode(flash_bank_t *bank,int mode)
+static void ecosflash_set_flash_mode(flash_bank_t *bank,int mode)
 {
 
 }
 
-u32 ecosflash_wait_status_busy(flash_bank_t *bank, u32 waitbits, int timeout)
+static uint32_t ecosflash_wait_status_busy(flash_bank_t *bank, uint32_t waitbits, int timeout)
 {
        return ERROR_OK;
 }
 
-int ecosflash_handle_gpnvm_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+static int ecosflash_handle_gpnvm_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
 {
        return ERROR_OK;
 }
+#endif
+
+struct flash_driver ecosflash_flash = {
+               .name = "ecosflash",
+               .register_commands = &ecosflash_register_commands,
+               .flash_bank_command = &ecosflash_flash_bank_command,
+               .erase = &ecosflash_erase,
+               .protect = &ecosflash_protect,
+               .write = &ecosflash_write,
+               .probe = &ecosflash_probe,
+               .auto_probe = &ecosflash_probe,
+               .erase_check = &default_flash_blank_check,
+               .protect_check = &ecosflash_protect_check,
+               .info = &ecosflash_info
+       };

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)