working_area_t -> struct working_area
[fw/openocd] / src / flash / lpc2000.c
index 5dcf1bbaf96390e6f3cffa5d9cf6e7f3843105b6..4ad3e0e54615bc45f403fa0d672f646d16c42469 100644 (file)
  * - 176x (tested with LPC1768)
  */
 
-static int lpc2000_register_commands(struct command_context_s *cmd_ctx);
-static int lpc2000_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct flash_bank_s *bank);
-static int lpc2000_erase(struct flash_bank_s *bank, int first, int last);
-static int lpc2000_protect(struct flash_bank_s *bank, int set, int first, int last);
-static int lpc2000_write(struct flash_bank_s *bank, uint8_t *buffer, uint32_t offset, uint32_t count);
-static int lpc2000_probe(struct flash_bank_s *bank);
-static int lpc2000_erase_check(struct flash_bank_s *bank);
-static int lpc2000_protect_check(struct flash_bank_s *bank);
-static int lpc2000_info(struct flash_bank_s *bank, char *buf, int buf_size);
-
-static int lpc2000_handle_part_id_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-
-flash_driver_t lpc2000_flash =
-{
-       .name = "lpc2000",
-       .register_commands = lpc2000_register_commands,
-       .flash_bank_command = lpc2000_flash_bank_command,
-       .erase = lpc2000_erase,
-       .protect = lpc2000_protect,
-       .write = lpc2000_write,
-       .probe = lpc2000_probe,
-       .auto_probe = lpc2000_probe,
-       .erase_check = lpc2000_erase_check,
-       .protect_check = lpc2000_protect_check,
-       .info = lpc2000_info
-};
-
-static int lpc2000_register_commands(struct command_context_s *cmd_ctx)
-{
-       command_t *lpc2000_cmd = register_command(cmd_ctx, NULL, "lpc2000", NULL, COMMAND_ANY, NULL);
-
-       register_command(cmd_ctx, lpc2000_cmd, "part_id", lpc2000_handle_part_id_command, COMMAND_EXEC,
-                                        "print part id of lpc2000 flash bank <num>");
-
-       return ERROR_OK;
-}
-
 static int lpc2000_build_sector_list(struct flash_bank_s *bank)
 {
-       lpc2000_flash_bank_t *lpc2000_info = bank->driver_priv;
+       struct lpc2000_flash_bank *lpc2000_info = bank->driver_priv;
        int i;
        uint32_t offset = 0;
 
@@ -105,7 +68,7 @@ static int lpc2000_build_sector_list(struct flash_bank_s *bank)
                if (bank->size == 128 * 1024)
                {
                        bank->num_sectors = 16;
-                       bank->sectors = malloc(sizeof(flash_sector_t) * 16);
+                       bank->sectors = malloc(sizeof(struct flash_sector) * 16);
                        for (i = 0; i < 16; i++)
                        {
                                bank->sectors[i].offset = offset;
@@ -118,7 +81,7 @@ static int lpc2000_build_sector_list(struct flash_bank_s *bank)
                else if (bank->size == 256 * 1024)
                {
                        bank->num_sectors = 18;
-                       bank->sectors = malloc(sizeof(flash_sector_t) * 18);
+                       bank->sectors = malloc(sizeof(struct flash_sector) * 18);
 
                        for (i = 0; i < 8; i++)
                        {
@@ -189,7 +152,7 @@ static int lpc2000_build_sector_list(struct flash_bank_s *bank)
                                break;
                }
 
-               bank->sectors = malloc(sizeof(flash_sector_t) * bank->num_sectors);
+               bank->sectors = malloc(sizeof(struct flash_sector) * bank->num_sectors);
 
                for (i = 0; i < bank->num_sectors; i++)
                {
@@ -243,7 +206,7 @@ static int lpc2000_build_sector_list(struct flash_bank_s *bank)
                                exit(-1);
                }
 
-               bank->sectors = malloc(sizeof(flash_sector_t) * bank->num_sectors);
+               bank->sectors = malloc(sizeof(struct flash_sector) * bank->num_sectors);
 
                for(i = 0; i < bank->num_sectors; i++)
                {
@@ -274,12 +237,12 @@ static int lpc2000_build_sector_list(struct flash_bank_s *bank)
 static int lpc2000_iap_call(flash_bank_t *bank, int code, uint32_t param_table[5], uint32_t result_table[4])
 {
        int retval;
-       lpc2000_flash_bank_t *lpc2000_info = bank->driver_priv;
+       struct lpc2000_flash_bank *lpc2000_info = bank->driver_priv;
        target_t *target = bank->target;
-       mem_param_t mem_params[2];
-       reg_param_t reg_params[5];
-       armv4_5_algorithm_t armv4_5_info; /* for LPC2000 */
-       armv7m_algorithm_t armv7m_info;   /* for LPC1700 */
+       struct mem_param mem_params[2];
+       struct reg_param reg_params[5];
+       struct armv4_5_algorithm armv4_5_info; /* for LPC2000 */
+       struct armv7m_algorithm armv7m_info;   /* for LPC1700 */
        uint32_t status_code;
        uint32_t iap_entry_point = 0; /* to make compiler happier */
 
@@ -456,9 +419,9 @@ static int lpc2000_iap_blank_check(struct flash_bank_s *bank, int first, int las
 /*
  * flash bank lpc2000 <base> <size> 0 0 <target#> <lpc_variant> <cclk> [calc_checksum]
  */
-static int lpc2000_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct flash_bank_s *bank)
+FLASH_BANK_COMMAND_HANDLER(lpc2000_flash_bank_command)
 {
-       lpc2000_flash_bank_t *lpc2000_info;
+       struct lpc2000_flash_bank *lpc2000_info;
 
        if (argc < 8)
        {
@@ -466,7 +429,7 @@ static int lpc2000_flash_bank_command(struct command_context_s *cmd_ctx, char *c
                return ERROR_FLASH_BANK_INVALID;
        }
 
-       lpc2000_info = malloc(sizeof(lpc2000_flash_bank_t));
+       lpc2000_info = malloc(sizeof(struct lpc2000_flash_bank));
        bank->driver_priv = lpc2000_info;
 
        if (strcmp(args[6], "lpc2000_v1") == 0)
@@ -501,7 +464,7 @@ static int lpc2000_flash_bank_command(struct command_context_s *cmd_ctx, char *c
        }
 
        lpc2000_info->iap_working_area = NULL;
-       lpc2000_info->cclk = strtoul(args[7], NULL, 0);
+       COMMAND_PARSE_NUMBER(u32, args[7], lpc2000_info->cclk);
        lpc2000_info->calc_checksum = 0;
        lpc2000_build_sector_list(bank);
 
@@ -516,7 +479,7 @@ static int lpc2000_flash_bank_command(struct command_context_s *cmd_ctx, char *c
 
 static int lpc2000_erase(struct flash_bank_s *bank, int first, int last)
 {
-       lpc2000_flash_bank_t *lpc2000_info = bank->driver_priv;
+       struct lpc2000_flash_bank *lpc2000_info = bank->driver_priv;
        uint32_t param_table[5];
        uint32_t result_table[4];
        int status_code;
@@ -574,7 +537,7 @@ static int lpc2000_protect(struct flash_bank_s *bank, int set, int first, int la
 
 static int lpc2000_write(struct flash_bank_s *bank, uint8_t *buffer, uint32_t offset, uint32_t count)
 {
-       lpc2000_flash_bank_t *lpc2000_info = bank->driver_priv;
+       struct lpc2000_flash_bank *lpc2000_info = bank->driver_priv;
        target_t *target = bank->target;
        uint32_t dst_min_alignment;
        uint32_t bytes_remaining = count;
@@ -585,7 +548,7 @@ static int lpc2000_write(struct flash_bank_s *bank, uint8_t *buffer, uint32_t of
        uint32_t result_table[4];
        int status_code;
        int i;
-       working_area_t *download_area;
+       struct working_area *download_area;
        int retval = ERROR_OK;
 
        if (bank->target->state != TARGET_HALTED)
@@ -767,16 +730,15 @@ static int lpc2000_protect_check(struct flash_bank_s *bank)
 
 static int lpc2000_info(struct flash_bank_s *bank, char *buf, int buf_size)
 {
-       lpc2000_flash_bank_t *lpc2000_info = bank->driver_priv;
+       struct lpc2000_flash_bank *lpc2000_info = bank->driver_priv;
 
        snprintf(buf, buf_size, "lpc2000 flash driver variant: %i, clk: %" PRIi32 "kHz" , lpc2000_info->variant, lpc2000_info->cclk);
 
        return ERROR_OK;
 }
 
-static int lpc2000_handle_part_id_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+COMMAND_HANDLER(lpc2000_handle_part_id_command)
 {
-       flash_bank_t *bank;
        uint32_t param_table[5];
        uint32_t result_table[4];
        int status_code;
@@ -786,12 +748,10 @@ static int lpc2000_handle_part_id_command(struct command_context_s *cmd_ctx, cha
                return ERROR_COMMAND_SYNTAX_ERROR;
        }
 
-       bank = get_flash_bank_by_num(strtoul(args[0], NULL, 0));
-       if (!bank)
-       {
-               command_print(cmd_ctx, "flash bank '#%s' is out of bounds", args[0]);
-               return ERROR_OK;
-       }
+       flash_bank_t *bank;
+       int retval = flash_command_get_bank_by_num(cmd_ctx, args[0], &bank);
+       if (ERROR_OK != retval)
+               return retval;
 
        if (bank->target->state != TARGET_HALTED)
        {
@@ -815,3 +775,31 @@ static int lpc2000_handle_part_id_command(struct command_context_s *cmd_ctx, cha
 
        return ERROR_OK;
 }
+
+static int lpc2000_register_commands(struct command_context_s *cmd_ctx)
+{
+       command_t *lpc2000_cmd = register_command(cmd_ctx, NULL, "lpc2000",
+                       NULL, COMMAND_ANY, NULL);
+
+       register_command(cmd_ctx, lpc2000_cmd, "part_id",
+                       lpc2000_handle_part_id_command, COMMAND_EXEC,
+                       "print part id of lpc2000 flash bank <num>");
+
+       return ERROR_OK;
+}
+
+struct flash_driver lpc2000_flash = {
+               .name = "lpc2000",
+               .register_commands = &lpc2000_register_commands,
+               .flash_bank_command = &lpc2000_flash_bank_command,
+               .erase = &lpc2000_erase,
+               .protect = &lpc2000_protect,
+               .write = &lpc2000_write,
+               .probe = &lpc2000_probe,
+               .auto_probe = &lpc2000_probe,
+               .erase_check = &lpc2000_erase_check,
+               .protect_check = &lpc2000_protect_check,
+               .info = &lpc2000_info,
+       };
+
+