X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fflash%2Fstr9x.c;h=09e5a08fe345ea4f595ef6d389b03c7ae1df9611;hp=880dac4da58a67c8defee238bcf764aa44637a55;hb=46fc1d57ac9462fd788277609707a379c7a406cb;hpb=84df52f9ea78e2d71bde648a16b69d80404c6421
diff --git a/src/flash/str9x.c b/src/flash/str9x.c
index 880dac4da5..09e5a08fe3 100644
--- a/src/flash/str9x.c
+++ b/src/flash/str9x.c
@@ -33,46 +33,9 @@
static uint32_t bank1start = 0x00080000;
-static int str9x_register_commands(struct command_context_s *cmd_ctx);
-static int str9x_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct flash_bank_s *bank);
-static int str9x_erase(struct flash_bank_s *bank, int first, int last);
-static int str9x_protect(struct flash_bank_s *bank, int set, int first, int last);
-static int str9x_write(struct flash_bank_s *bank, uint8_t *buffer, uint32_t offset, uint32_t count);
-static int str9x_probe(struct flash_bank_s *bank);
-//static int str9x_handle_part_id_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-static int str9x_protect_check(struct flash_bank_s *bank);
-static int str9x_info(struct flash_bank_s *bank, char *buf, int buf_size);
-
-static int str9x_handle_flash_config_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-
-flash_driver_t str9x_flash =
-{
- .name = "str9x",
- .register_commands = str9x_register_commands,
- .flash_bank_command = str9x_flash_bank_command,
- .erase = str9x_erase,
- .protect = str9x_protect,
- .write = str9x_write,
- .probe = str9x_probe,
- .auto_probe = str9x_probe,
- .erase_check = default_flash_blank_check,
- .protect_check = str9x_protect_check,
- .info = str9x_info
-};
-
-static int str9x_register_commands(struct command_context_s *cmd_ctx)
-{
- command_t *str9x_cmd = register_command(cmd_ctx, NULL, "str9x", NULL, COMMAND_ANY, NULL);
-
- register_command(cmd_ctx, str9x_cmd, "flash_config", str9x_handle_flash_config_command, COMMAND_EXEC,
- "configure str9 flash controller");
-
- return ERROR_OK;
-}
-
static int str9x_build_block_list(struct flash_bank_s *bank)
{
- str9x_flash_bank_t *str9x_info = bank->driver_priv;
+ struct str9x_flash_bank *str9x_info = bank->driver_priv;
int i;
int num_sectors;
@@ -120,7 +83,7 @@ static int str9x_build_block_list(struct flash_bank_s *bank)
num_sectors = b0_sectors + b1_sectors;
bank->num_sectors = num_sectors;
- bank->sectors = malloc(sizeof(flash_sector_t) * num_sectors);
+ bank->sectors = malloc(sizeof(struct flash_sector) * num_sectors);
str9x_info->sector_bits = malloc(sizeof(uint32_t) * num_sectors);
num_sectors = 0;
@@ -145,7 +108,7 @@ static int str9x_build_block_list(struct flash_bank_s *bank)
if (str9x_info->variant)
str9x_info->sector_bits[num_sectors++] = (1 << i);
else
- str9x_info->sector_bits[num_sectors++] = (1 << (i+8));
+ str9x_info->sector_bits[num_sectors++] = (1 << (i + 8));
}
return ERROR_OK;
@@ -153,10 +116,9 @@ static int str9x_build_block_list(struct flash_bank_s *bank)
/* flash bank str9x 0 0
*/
-static int str9x_flash_bank_command(struct command_context_s *cmd_ctx,
- char *cmd, char **args, int argc, struct flash_bank_s *bank)
+FLASH_BANK_COMMAND_HANDLER(str9x_flash_bank_command)
{
- str9x_flash_bank_t *str9x_info;
+ struct str9x_flash_bank *str9x_info;
if (argc < 6)
{
@@ -164,7 +126,7 @@ static int str9x_flash_bank_command(struct command_context_s *cmd_ctx,
return ERROR_FLASH_BANK_INVALID;
}
- str9x_info = malloc(sizeof(str9x_flash_bank_t));
+ str9x_info = malloc(sizeof(struct str9x_flash_bank));
bank->driver_priv = str9x_info;
str9x_build_block_list(bank);
@@ -177,7 +139,7 @@ static int str9x_flash_bank_command(struct command_context_s *cmd_ctx,
static int str9x_protect_check(struct flash_bank_s *bank)
{
int retval;
- str9x_flash_bank_t *str9x_info = bank->driver_priv;
+ struct str9x_flash_bank *str9x_info = bank->driver_priv;
target_t *target = bank->target;
int i;
@@ -300,12 +262,12 @@ static int str9x_erase(struct flash_bank_s *bank, int first, int last)
}
int timeout;
- for (timeout = 0; timeout<1000; timeout++) {
+ for (timeout = 0; timeout < 1000; timeout++) {
if ((retval = target_read_u8(target, adr, &status)) != ERROR_OK)
{
return retval;
}
- if ( status & 0x80 )
+ if (status & 0x80)
break;
alive_sleep(1);
}
@@ -327,7 +289,7 @@ static int str9x_erase(struct flash_bank_s *bank, int first, int last)
return retval;
}
- if ( status & 0x22 )
+ if (status & 0x22)
{
LOG_ERROR("error erasing flash bank, status: 0x%x", status);
return ERROR_FLASH_OPERATION_FAILED;
@@ -365,7 +327,7 @@ static int str9x_protect(struct flash_bank_s *bank,
adr = bank->base + bank->sectors[i].offset;
target_write_u16(target, adr, 0x60);
- if ( set )
+ if (set)
target_write_u16(target, adr, 0x01);
else
target_write_u16(target, adr, 0xD0);
@@ -386,13 +348,13 @@ static int str9x_protect(struct flash_bank_s *bank,
static int str9x_write_block(struct flash_bank_s *bank,
uint8_t *buffer, uint32_t offset, uint32_t count)
{
- str9x_flash_bank_t *str9x_info = bank->driver_priv;
+ struct str9x_flash_bank *str9x_info = bank->driver_priv;
target_t *target = bank->target;
uint32_t buffer_size = 8192;
- working_area_t *source;
+ struct working_area *source;
uint32_t address = bank->base + offset;
- reg_param_t reg_params[4];
- armv4_5_algorithm_t armv4_5_info;
+ struct reg_param reg_params[4];
+ struct armv4_5_algorithm armv4_5_info;
int retval = ERROR_OK;
uint32_t str9x_flash_write_code[] = {
@@ -575,10 +537,10 @@ static int str9x_write(struct flash_bank_s *bank,
target_write_u16(target, bank_adr, 0x70);
int timeout;
- for (timeout = 0; timeout<1000; timeout++)
+ for (timeout = 0; timeout < 1000; timeout++)
{
target_read_u8(target, bank_adr, &status);
- if ( status & 0x80 )
+ if (status & 0x80)
break;
alive_sleep(1);
}
@@ -624,10 +586,10 @@ static int str9x_write(struct flash_bank_s *bank,
target_write_u16(target, bank_adr, 0x70);
int timeout;
- for (timeout = 0; timeout<1000; timeout++)
+ for (timeout = 0; timeout < 1000; timeout++)
{
target_read_u8(target, bank_adr, &status);
- if ( status & 0x80 )
+ if (status & 0x80)
break;
alive_sleep(1);
}
@@ -656,8 +618,7 @@ static int str9x_probe(struct flash_bank_s *bank)
}
#if 0
-static int str9x_handle_part_id_command(struct command_context_s *cmd_ctx,
- char *cmd, char **args, int argc)
+COMMAND_HANDLER(str9x_handle_part_id_command)
{
return ERROR_OK;
}
@@ -665,15 +626,13 @@ static int str9x_handle_part_id_command(struct command_context_s *cmd_ctx,
static int str9x_info(struct flash_bank_s *bank, char *buf, int buf_size)
{
- snprintf(buf, buf_size, "str9x flash driver info" );
+ snprintf(buf, buf_size, "str9x flash driver info");
return ERROR_OK;
}
-static int str9x_handle_flash_config_command(struct command_context_s *cmd_ctx,
- char *cmd, char **args, int argc)
+COMMAND_HANDLER(str9x_handle_flash_config_command)
{
- str9x_flash_bank_t *str9x_info;
- flash_bank_t *bank;
+ struct str9x_flash_bank *str9x_info;
target_t *target = NULL;
if (argc < 5)
@@ -681,12 +640,16 @@ static int str9x_handle_flash_config_command(struct command_context_s *cmd_ctx,
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;
+
+ uint32_t bbsr, nbbsr, bbadr, nbbadr;
+ COMMAND_PARSE_NUMBER(u32, args[1], bbsr);
+ COMMAND_PARSE_NUMBER(u32, args[2], nbbsr);
+ COMMAND_PARSE_NUMBER(u32, args[3], bbadr);
+ COMMAND_PARSE_NUMBER(u32, args[4], nbbadr);
str9x_info = bank->driver_priv;
@@ -699,10 +662,10 @@ static int str9x_handle_flash_config_command(struct command_context_s *cmd_ctx,
}
/* config flash controller */
- target_write_u32(target, FLASH_BBSR, strtoul(args[1], NULL, 0));
- target_write_u32(target, FLASH_NBBSR, strtoul(args[2], NULL, 0));
- target_write_u32(target, FLASH_BBADR, (strtoul(args[3], NULL, 0) >> 2));
- target_write_u32(target, FLASH_NBBADR, (strtoul(args[4], NULL, 0) >> 2));
+ target_write_u32(target, FLASH_BBSR, bbsr);
+ target_write_u32(target, FLASH_NBBSR, nbbsr);
+ target_write_u32(target, FLASH_BBADR, bbadr >> 2);
+ target_write_u32(target, FLASH_NBBADR, nbbadr >> 2);
/* set bit 18 instruction TCM order as per flash programming manual */
arm966e_write_cp15(target, 62, 0x40000);
@@ -711,3 +674,29 @@ static int str9x_handle_flash_config_command(struct command_context_s *cmd_ctx,
target_write_u32(target, FLASH_CR, 0x18);
return ERROR_OK;
}
+
+static int str9x_register_commands(struct command_context_s *cmd_ctx)
+{
+ command_t *str9x_cmd = register_command(cmd_ctx, NULL, "str9x",
+ NULL, COMMAND_ANY, "str9x flash commands");
+
+ register_command(cmd_ctx, str9x_cmd, "flash_config",
+ str9x_handle_flash_config_command, COMMAND_EXEC,
+ "configure str9 flash controller");
+
+ return ERROR_OK;
+}
+
+struct flash_driver str9x_flash = {
+ .name = "str9x",
+ .register_commands = &str9x_register_commands,
+ .flash_bank_command = &str9x_flash_bank_command,
+ .erase = &str9x_erase,
+ .protect = &str9x_protect,
+ .write = &str9x_write,
+ .probe = &str9x_probe,
+ .auto_probe = &str9x_probe,
+ .erase_check = &default_flash_blank_check,
+ .protect_check = &str9x_protect_check,
+ .info = &str9x_info,
+ };