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;
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;
offset += bank->sectors[i].size;
bank->sectors[num_sectors].is_erased = -1;
bank->sectors[num_sectors].is_protected = 1;
- str9x_info->sector_bits[num_sectors++] = (1<<i);
+ str9x_info->sector_bits[num_sectors++] = (1 << i);
}
for (i = 0; i < b1_sectors; i++)
bank->sectors[num_sectors].is_erased = -1;
bank->sectors[num_sectors].is_protected = 1;
if (str9x_info->variant)
- str9x_info->sector_bits[num_sectors++] = (1<<i);
+ 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;
/* flash bank str9x <base> <size> 0 0 <target#>
*/
-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)
{
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);
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;
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;
}
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;
}
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;
}
}
/* 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;
}
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;
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);
}
- if (timeout==1000)
+ if (timeout == 1000)
{
LOG_ERROR("erase timed out");
return ERROR_FAIL;
}
/* 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;
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;
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);
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[] = {
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;
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);
}
- if (timeout==1000)
+ if (timeout == 1000)
{
LOG_ERROR("write timed out");
return ERROR_FAIL;
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);
}
- if (timeout==1000)
+ if (timeout == 1000)
{
LOG_ERROR("write timed out");
return ERROR_FAIL;
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;
}
/* 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);
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,
+ };