X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Fflash%2Fstr7x.c;h=1d9396beb65e85263f4ceecf9ee081890496f4f2;hb=66add57aa5bae147b7996840a2287f3547b4b8ea;hp=c7a486e2846ade8615a40b815615f1b567154c91;hpb=d47e1b8f362379d8a2307f49e2b42115a3f40524;p=openocd.git diff --git a/src/flash/str7x.c b/src/flash/str7x.c index c7a486e284..1d9396beb6 100644 --- a/src/flash/str7x.c +++ b/src/flash/str7x.c @@ -2,6 +2,9 @@ * Copyright (C) 2005 by Dominic Rath * * Dominic.Rath@gmx.de * * * + * Copyright (C) 2008 by Spencer Oliver * + * spen@spen-soft.co.uk * + * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * @@ -35,7 +38,7 @@ #include #include -str7x_mem_layout_t mem_layout[] = { +str7x_mem_layout_t mem_layout_str7bank0[] = { {0x00000000, 0x02000, 0x01}, {0x00002000, 0x02000, 0x02}, {0x00004000, 0x02000, 0x04}, @@ -43,23 +46,25 @@ str7x_mem_layout_t mem_layout[] = { {0x00008000, 0x08000, 0x10}, {0x00010000, 0x10000, 0x20}, {0x00020000, 0x10000, 0x40}, - {0x00030000, 0x10000, 0x80}, - {0x000C0000, 0x02000, 0x10000}, - {0x000C2000, 0x02000, 0x20000}, + {0x00030000, 0x10000, 0x80} +}; + +str7x_mem_layout_t mem_layout_str7bank1[] = { + {0x00000000, 0x02000, 0x10000}, + {0x00002000, 0x02000, 0x20000} }; -int str7x_register_commands(struct command_context_s *cmd_ctx); -int str7x_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct flash_bank_s *bank); -int str7x_erase(struct flash_bank_s *bank, int first, int last); -int str7x_protect(struct flash_bank_s *bank, int set, int first, int last); -int str7x_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count); -int str7x_probe(struct flash_bank_s *bank); -int str7x_handle_part_id_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -int str7x_protect_check(struct flash_bank_s *bank); -int str7x_erase_check(struct flash_bank_s *bank); -int str7x_info(struct flash_bank_s *bank, char *buf, int buf_size); +static int str7x_register_commands(struct command_context_s *cmd_ctx); +static int str7x_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct flash_bank_s *bank); +static int str7x_erase(struct flash_bank_s *bank, int first, int last); +static int str7x_protect(struct flash_bank_s *bank, int set, int first, int last); +static int str7x_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count); +static int str7x_probe(struct flash_bank_s *bank); +//static int str7x_handle_part_id_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); +static int str7x_protect_check(struct flash_bank_s *bank); +static int str7x_info(struct flash_bank_s *bank, char *buf, int buf_size); -int str7x_handle_disable_jtag_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); +static int str7x_handle_disable_jtag_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); flash_driver_t str7x_flash = { @@ -71,12 +76,12 @@ flash_driver_t str7x_flash = .write = str7x_write, .probe = str7x_probe, .auto_probe = str7x_probe, - .erase_check = str7x_erase_check, + .erase_check = default_flash_blank_check, .protect_check = str7x_protect_check, .info = str7x_info }; -int str7x_register_commands(struct command_context_s *cmd_ctx) +static int str7x_register_commands(struct command_context_s *cmd_ctx) { command_t *str7x_cmd = register_command(cmd_ctx, NULL, "str7x", NULL, COMMAND_ANY, NULL); @@ -86,22 +91,24 @@ int str7x_register_commands(struct command_context_s *cmd_ctx) return ERROR_OK; } -int str7x_get_flash_adr(struct flash_bank_s *bank, u32 reg) +static int str7x_get_flash_adr(struct flash_bank_s *bank, u32 reg) { - return (bank->base | reg); + str7x_flash_bank_t *str7x_info = bank->driver_priv; + return (str7x_info->register_base | reg); } -int str7x_build_block_list(struct flash_bank_s *bank) +static int str7x_build_block_list(struct flash_bank_s *bank) { str7x_flash_bank_t *str7x_info = bank->driver_priv; int i; - int num_sectors = 0, b0_sectors = 0, b1_sectors = 0; + int num_sectors; + int b0_sectors = 0, b1_sectors = 0; switch (bank->size) { case 16 * 1024: - b0_sectors = 2; + b1_sectors = 2; break; case 64 * 1024: b0_sectors = 5; @@ -116,42 +123,31 @@ int str7x_build_block_list(struct flash_bank_s *bank) LOG_ERROR("BUG: unknown bank->size encountered"); exit(-1); } - - if( str7x_info->bank1 == 1 ) - { - b1_sectors += 2; - } - + num_sectors = b0_sectors + b1_sectors; bank->num_sectors = num_sectors; bank->sectors = malloc(sizeof(flash_sector_t) * num_sectors); str7x_info->sector_bits = malloc(sizeof(u32) * num_sectors); - str7x_info->sector_bank = malloc(sizeof(u32) * num_sectors); num_sectors = 0; for (i = 0; i < b0_sectors; i++) { - bank->sectors[num_sectors].offset = mem_layout[i].sector_start; - bank->sectors[num_sectors].size = mem_layout[i].sector_size; + bank->sectors[num_sectors].offset = mem_layout_str7bank0[i].sector_start; + bank->sectors[num_sectors].size = mem_layout_str7bank0[i].sector_size; bank->sectors[num_sectors].is_erased = -1; bank->sectors[num_sectors].is_protected = 1; - str7x_info->sector_bank[num_sectors] = 0; - str7x_info->sector_bits[num_sectors++] = mem_layout[i].sector_bit; + str7x_info->sector_bits[num_sectors++] = mem_layout_str7bank0[i].sector_bit; } - if (b1_sectors) + for (i = 0; i < b1_sectors; i++) { - for (i = 8; i < 10; i++) - { - bank->sectors[num_sectors].offset = mem_layout[i].sector_start; - bank->sectors[num_sectors].size = mem_layout[i].sector_size; - bank->sectors[num_sectors].is_erased = -1; - bank->sectors[num_sectors].is_protected = 1; - str7x_info->sector_bank[num_sectors] = 1; - str7x_info->sector_bits[num_sectors++] = mem_layout[i].sector_bit; - } + bank->sectors[num_sectors].offset = mem_layout_str7bank1[i].sector_start; + bank->sectors[num_sectors].size = mem_layout_str7bank1[i].sector_size; + bank->sectors[num_sectors].is_erased = -1; + bank->sectors[num_sectors].is_protected = 1; + str7x_info->sector_bits[num_sectors++] = mem_layout_str7bank1[i].sector_bit; } return ERROR_OK; @@ -159,7 +155,7 @@ int str7x_build_block_list(struct flash_bank_s *bank) /* flash bank str7x 0 0 */ -int str7x_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct flash_bank_s *bank) +static int str7x_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct flash_bank_s *bank) { str7x_flash_bank_t *str7x_info; @@ -173,38 +169,22 @@ int str7x_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char bank->driver_priv = str7x_info; /* set default bits for str71x flash */ - str7x_info->bank1 = 1; str7x_info->busy_bits = (FLASH_LOCK|FLASH_BSYA1|FLASH_BSYA0); str7x_info->disable_bit = (1<<1); if (strcmp(args[6], "STR71x") == 0) { - if (bank->base != 0x40000000) - { - LOG_WARNING("overriding flash base address for STR71x device with 0x40000000"); - bank->base = 0x40000000; - } + str7x_info->register_base = 0x40100000; } else if (strcmp(args[6], "STR73x") == 0) { - str7x_info->bank1 = 0; + str7x_info->register_base = 0x80100000; str7x_info->busy_bits = (FLASH_LOCK|FLASH_BSYA0); - - if (bank->base != 0x80000000) - { - LOG_WARNING("overriding flash base address for STR73x device with 0x80000000"); - bank->base = 0x80000000; - } } else if (strcmp(args[6], "STR75x") == 0) { + str7x_info->register_base = 0x20100000; str7x_info->disable_bit = (1<<0); - - if (bank->base != 0x20000000) - { - LOG_WARNING("overriding flash base address for STR75x device with 0x20000000"); - bank->base = 0x20000000; - } } else { @@ -220,7 +200,7 @@ int str7x_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char return ERROR_OK; } -u32 str7x_status(struct flash_bank_s *bank) +static u32 str7x_status(struct flash_bank_s *bank) { target_t *target = bank->target; u32 retval; @@ -230,7 +210,7 @@ u32 str7x_status(struct flash_bank_s *bank) return retval; } -u32 str7x_result(struct flash_bank_s *bank) +static u32 str7x_result(struct flash_bank_s *bank) { target_t *target = bank->target; u32 retval; @@ -240,45 +220,7 @@ u32 str7x_result(struct flash_bank_s *bank) return retval; } -int str7x_blank_check(struct flash_bank_s *bank, int first, int last) -{ - target_t *target = bank->target; - u8 *buffer; - int i; - int nBytes; - - if ((first < 0) || (last > bank->num_sectors)) - return ERROR_FLASH_SECTOR_INVALID; - - if (bank->target->state != TARGET_HALTED) - { - return ERROR_TARGET_NOT_HALTED; - } - - buffer = malloc(256); - - for (i = first; i <= last; i++) - { - bank->sectors[i].is_erased = 1; - - target->type->read_memory(target, bank->base + bank->sectors[i].offset, 4, 256/4, buffer); - - for (nBytes = 0; nBytes < 256; nBytes++) - { - if (buffer[nBytes] != 0xFF) - { - bank->sectors[i].is_erased = 0; - break; - } - } - } - - free(buffer); - - return ERROR_OK; -} - -int str7x_protect_check(struct flash_bank_s *bank) +static int str7x_protect_check(struct flash_bank_s *bank) { str7x_flash_bank_t *str7x_info = bank->driver_priv; target_t *target = bank->target; @@ -288,6 +230,7 @@ int str7x_protect_check(struct flash_bank_s *bank) if (bank->target->state != TARGET_HALTED) { + LOG_ERROR("Target not halted"); return ERROR_TARGET_NOT_HALTED; } @@ -304,7 +247,7 @@ int str7x_protect_check(struct flash_bank_s *bank) return ERROR_OK; } -int str7x_erase(struct flash_bank_s *bank, int first, int last) +static int str7x_erase(struct flash_bank_s *bank, int first, int last) { str7x_flash_bank_t *str7x_info = bank->driver_priv; target_t *target = bank->target; @@ -312,79 +255,43 @@ int str7x_erase(struct flash_bank_s *bank, int first, int last) int i; u32 cmd; u32 retval; - u32 b0_sectors = 0, b1_sectors = 0; + u32 sectors = 0; if (bank->target->state != TARGET_HALTED) { + LOG_ERROR("Target not halted"); return ERROR_TARGET_NOT_HALTED; } for (i = first; i <= last; i++) { - if (str7x_info->sector_bank[i] == 0) - b0_sectors |= str7x_info->sector_bits[i]; - else if (str7x_info->sector_bank[i] == 1) - b1_sectors |= str7x_info->sector_bits[i]; - else - LOG_ERROR("BUG: str7x_info->sector_bank[i] neither 0 nor 1 (%i)", str7x_info->sector_bank[i]); + sectors |= str7x_info->sector_bits[i]; } - if (b0_sectors) - { - LOG_DEBUG("b0_sectors: 0x%x", b0_sectors); - - /* clear FLASH_ER register */ - target_write_u32(target, str7x_get_flash_adr(bank, FLASH_ER), 0x0); - - cmd = FLASH_SER; - target_write_u32(target, str7x_get_flash_adr(bank, FLASH_CR0), cmd); - - cmd = b0_sectors; - target_write_u32(target, str7x_get_flash_adr(bank, FLASH_CR1), cmd); - - cmd = FLASH_SER|FLASH_WMS; - target_write_u32(target, str7x_get_flash_adr(bank, FLASH_CR0), cmd); - - while (((retval = str7x_status(bank)) & str7x_info->busy_bits)){ - usleep(1000); - } - - retval = str7x_result(bank); - - if (retval) - { - LOG_ERROR("error erasing flash bank, FLASH_ER: 0x%x", retval); - return ERROR_FLASH_OPERATION_FAILED; - } + LOG_DEBUG("sectors: 0x%x", sectors); + + /* clear FLASH_ER register */ + target_write_u32(target, str7x_get_flash_adr(bank, FLASH_ER), 0x0); + + cmd = FLASH_SER; + target_write_u32(target, str7x_get_flash_adr(bank, FLASH_CR0), cmd); + + cmd = sectors; + target_write_u32(target, str7x_get_flash_adr(bank, FLASH_CR1), cmd); + + cmd = FLASH_SER|FLASH_WMS; + target_write_u32(target, str7x_get_flash_adr(bank, FLASH_CR0), cmd); + + while (((retval = str7x_status(bank)) & str7x_info->busy_bits)){ + alive_sleep(1); } - if (b1_sectors) + retval = str7x_result(bank); + + if (retval) { - LOG_DEBUG("b1_sectors: 0x%x", b1_sectors); - - /* clear FLASH_ER register */ - target_write_u32(target, str7x_get_flash_adr(bank, FLASH_ER), 0x0); - - cmd = FLASH_SER; - target_write_u32(target, str7x_get_flash_adr(bank, FLASH_CR0), cmd); - - cmd = b1_sectors; - target_write_u32(target, str7x_get_flash_adr(bank, FLASH_CR1), cmd); - - cmd = FLASH_SER|FLASH_WMS; - target_write_u32(target, str7x_get_flash_adr(bank, FLASH_CR0), cmd); - - while (((retval = str7x_status(bank)) & str7x_info->busy_bits)){ - usleep(1000); - } - - retval = str7x_result(bank); - - if (retval) - { - LOG_ERROR("error erasing flash bank, FLASH_ER: 0x%x", retval); - return ERROR_FLASH_OPERATION_FAILED; - } + LOG_ERROR("error erasing flash bank, FLASH_ER: 0x%x", retval); + return ERROR_FLASH_OPERATION_FAILED; } for (i = first; i <= last; i++) @@ -393,7 +300,7 @@ int str7x_erase(struct flash_bank_s *bank, int first, int last) return ERROR_OK; } -int str7x_protect(struct flash_bank_s *bank, int set, int first, int last) +static int str7x_protect(struct flash_bank_s *bank, int set, int first, int last) { str7x_flash_bank_t *str7x_info = bank->driver_priv; target_t *target = bank->target; @@ -404,6 +311,7 @@ int str7x_protect(struct flash_bank_s *bank, int set, int first, int last) if (bank->target->state != TARGET_HALTED) { + LOG_ERROR("Target not halted"); return ERROR_TARGET_NOT_HALTED; } @@ -431,7 +339,7 @@ int str7x_protect(struct flash_bank_s *bank, int set, int first, int last) target_write_u32(target, str7x_get_flash_adr(bank, FLASH_CR0), cmd); while (((retval = str7x_status(bank)) & str7x_info->busy_bits)){ - usleep(1000); + alive_sleep(1); } retval = str7x_result(bank); @@ -446,7 +354,7 @@ int str7x_protect(struct flash_bank_s *bank, int set, int first, int last) return ERROR_OK; } -int str7x_write_block(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count) +static int str7x_write_block(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count) { str7x_flash_bank_t *str7x_info = bank->driver_priv; target_t *target = bank->target; @@ -533,6 +441,7 @@ int str7x_write_block(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 cou if ((retval = target->type->run_algorithm(target, 0, NULL, 6, reg_params, str7x_info->write_algorithm->address, str7x_info->write_algorithm->address + (19 * 4), 10000, &armv4_5_info)) != ERROR_OK) { LOG_ERROR("error executing str7x flash write algorithm"); + retval = ERROR_FLASH_OPERATION_FAILED; break; } @@ -560,7 +469,7 @@ int str7x_write_block(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 cou return retval; } -int str7x_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count) +static int str7x_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count) { target_t *target = bank->target; str7x_flash_bank_t *str7x_info = bank->driver_priv; @@ -569,12 +478,13 @@ int str7x_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count) u32 address = bank->base + offset; u32 bytes_written = 0; u32 cmd; - u32 retval; + int retval; u32 check_address = offset; int i; if (bank->target->state != TARGET_HALTED) { + LOG_ERROR("Target not halted"); return ERROR_TARGET_NOT_HALTED; } @@ -658,7 +568,7 @@ int str7x_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count) while (((retval = str7x_status(bank)) & str7x_info->busy_bits)) { - usleep(1000); + alive_sleep(1); } retval = str7x_result(bank); @@ -705,7 +615,7 @@ int str7x_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count) while (((retval = str7x_status(bank)) & str7x_info->busy_bits)) { - usleep(1000); + alive_sleep(1); } retval = str7x_result(bank); @@ -719,28 +629,25 @@ int str7x_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count) return ERROR_OK; } -int str7x_probe(struct flash_bank_s *bank) +static int str7x_probe(struct flash_bank_s *bank) { return ERROR_OK; } -int str7x_handle_part_id_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +#if 0 +static int str7x_handle_part_id_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { return ERROR_OK; } +#endif -int str7x_erase_check(struct flash_bank_s *bank) -{ - return str7x_blank_check(bank, 0, bank->num_sectors - 1); -} - -int str7x_info(struct flash_bank_s *bank, char *buf, int buf_size) +static int str7x_info(struct flash_bank_s *bank, char *buf, int buf_size) { snprintf(buf, buf_size, "str7x flash driver info" ); return ERROR_OK; } -int str7x_handle_disable_jtag_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +static int str7x_handle_disable_jtag_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { flash_bank_t *bank; target_t *target = NULL; @@ -770,6 +677,7 @@ int str7x_handle_disable_jtag_command(struct command_context_s *cmd_ctx, char *c if (target->state != TARGET_HALTED) { + LOG_ERROR("Target not halted"); return ERROR_TARGET_NOT_HALTED; } @@ -811,4 +719,3 @@ int str7x_handle_disable_jtag_command(struct command_context_s *cmd_ctx, char *c return ERROR_OK; } -