X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fflash%2Fstr9x.c;h=b3e8dffc7a3a36ac734a6fc5626b77b4b781e06f;hb=96b62996d2d81b09a48bf253bc9e60e637f687bd;hp=73c86da72b67508c2e2524951b3f708f13c9d86c;hpb=3813fda44adcea486b7308423a699f63d79273ee;p=fw%2Fopenocd
diff --git a/src/flash/str9x.c b/src/flash/str9x.c
index 73c86da72..b3e8dffc7 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 =
+static int str9x_build_block_list(struct flash_bank *bank)
{
- .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);
@@ -174,11 +136,11 @@ static int str9x_flash_bank_command(struct command_context_s *cmd_ctx,
return ERROR_OK;
}
-static int str9x_protect_check(struct flash_bank_s *bank)
+static int str9x_protect_check(struct flash_bank *bank)
{
int retval;
- str9x_flash_bank_t *str9x_info = bank->driver_priv;
- target_t *target = bank->target;
+ struct str9x_flash_bank *str9x_info = bank->driver_priv;
+ struct target *target = bank->target;
int i;
uint32_t adr;
@@ -198,11 +160,11 @@ static int str9x_protect_check(struct flash_bank_s *bank)
if (str9x_info->bank1)
{
adr = bank1start + 0x18;
- if ((retval=target_write_u16(target, adr, 0x90)) != ERROR_OK)
+ if ((retval = target_write_u16(target, adr, 0x90)) != ERROR_OK)
{
return retval;
}
- if ((retval=target_read_u16(target, adr, &hstatus)) != ERROR_OK)
+ if ((retval = target_read_u16(target, adr, &hstatus)) != ERROR_OK)
{
return retval;
}
@@ -211,11 +173,11 @@ static int str9x_protect_check(struct flash_bank_s *bank)
else
{
adr = bank1start + 0x14;
- if ((retval=target_write_u16(target, adr, 0x90)) != ERROR_OK)
+ if ((retval = target_write_u16(target, adr, 0x90)) != ERROR_OK)
{
return retval;
}
- if ((retval=target_read_u32(target, adr, &status)) != ERROR_OK)
+ if ((retval = target_read_u32(target, adr, &status)) != ERROR_OK)
{
return retval;
}
@@ -224,11 +186,11 @@ static int str9x_protect_check(struct flash_bank_s *bank)
else
{
adr = bank1start + 0x10;
- if ((retval=target_write_u16(target, adr, 0x90)) != ERROR_OK)
+ if ((retval = target_write_u16(target, adr, 0x90)) != ERROR_OK)
{
return retval;
}
- if ((retval=target_read_u16(target, adr, &hstatus)) != ERROR_OK)
+ if ((retval = target_read_u16(target, adr, &hstatus)) != ERROR_OK)
{
return retval;
}
@@ -236,7 +198,7 @@ static int str9x_protect_check(struct flash_bank_s *bank)
}
/* read array command */
- if ((retval=target_write_u16(target, adr, 0xFF)) != ERROR_OK)
+ if ((retval = target_write_u16(target, adr, 0xFF)) != ERROR_OK)
{
return retval;
}
@@ -252,9 +214,9 @@ static int str9x_protect_check(struct flash_bank_s *bank)
return ERROR_OK;
}
-static int str9x_erase(struct flash_bank_s *bank, int first, int last)
+static int str9x_erase(struct flash_bank *bank, int first, int last)
{
- target_t *target = bank->target;
+ struct target *target = bank->target;
int i;
uint32_t adr;
uint8_t status;
@@ -284,28 +246,28 @@ static int str9x_erase(struct flash_bank_s *bank, int first, int last)
adr = bank->base + bank->sectors[i].offset;
/* erase sectors */
- if ((retval=target_write_u16(target, adr, erase_cmd)) != ERROR_OK)
+ if ((retval = target_write_u16(target, adr, erase_cmd)) != ERROR_OK)
{
return retval;
}
- if ((retval=target_write_u16(target, adr, 0xD0)) != ERROR_OK)
+ if ((retval = target_write_u16(target, adr, 0xD0)) != ERROR_OK)
{
return retval;
}
/* get status */
- if ((retval=target_write_u16(target, adr, 0x70)) != ERROR_OK)
+ if ((retval = target_write_u16(target, adr, 0x70)) != ERROR_OK)
{
return retval;
}
int timeout;
- for (timeout=0; timeout<1000; timeout++) {
- if ((retval=target_read_u8(target, adr, &status)) != ERROR_OK)
+ 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);
}
@@ -316,18 +278,18 @@ static int str9x_erase(struct flash_bank_s *bank, int first, int last)
}
/* clear status, also clear read array */
- if ((retval=target_write_u16(target, adr, 0x50)) != ERROR_OK)
+ if ((retval = target_write_u16(target, adr, 0x50)) != ERROR_OK)
{
return retval;
}
/* read array command */
- if ((retval=target_write_u16(target, adr, 0xFF)) != ERROR_OK)
+ if ((retval = target_write_u16(target, adr, 0xFF)) != ERROR_OK)
{
return retval;
}
- if ( status & 0x22 )
+ if (status & 0x22)
{
LOG_ERROR("error erasing flash bank, status: 0x%x", status);
return ERROR_FLASH_OPERATION_FAILED;
@@ -344,10 +306,10 @@ static int str9x_erase(struct flash_bank_s *bank, int first, int last)
return ERROR_OK;
}
-static int str9x_protect(struct flash_bank_s *bank,
+static int str9x_protect(struct flash_bank *bank,
int set, int first, int last)
{
- target_t *target = bank->target;
+ struct target *target = bank->target;
int i;
uint32_t adr;
uint8_t status;
@@ -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);
@@ -383,16 +345,16 @@ static int str9x_protect(struct flash_bank_s *bank,
return ERROR_OK;
}
-static int str9x_write_block(struct flash_bank_s *bank,
+static int str9x_write_block(struct flash_bank *bank,
uint8_t *buffer, uint32_t offset, uint32_t count)
{
- str9x_flash_bank_t *str9x_info = bank->driver_priv;
- target_t *target = bank->target;
+ struct str9x_flash_bank *str9x_info = bank->driver_priv;
+ struct target *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[] = {
@@ -492,10 +454,10 @@ static int str9x_write_block(struct flash_bank_s *bank,
return retval;
}
-static int str9x_write(struct flash_bank_s *bank,
+static int str9x_write(struct flash_bank *bank,
uint8_t *buffer, uint32_t offset, uint32_t count)
{
- target_t *target = bank->target;
+ struct target *target = bank->target;
uint32_t words_remaining = (count / 2);
uint32_t bytes_remaining = (count & 0x00000001);
uint32_t address = bank->base + offset;
@@ -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);
}
@@ -650,43 +612,44 @@ static int str9x_write(struct flash_bank_s *bank,
return ERROR_OK;
}
-static int str9x_probe(struct flash_bank_s *bank)
+static int str9x_probe(struct flash_bank *bank)
{
return ERROR_OK;
}
#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;
}
#endif
-static int str9x_info(struct flash_bank_s *bank, char *buf, int buf_size)
+static int str9x_info(struct flash_bank *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;
- target_t *target = NULL;
+ struct str9x_flash_bank *str9x_info;
+ struct target *target = NULL;
if (argc < 5)
{
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;
- }
+ struct flash_bank *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,
+ };