X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fflash%2Fnor%2Fat91sam7.c;h=9de829327ac01cea07b4ae2f0016641d7b565079;hp=e46122ad8a2ae3265a99d82e0008755895631271;hb=eb8912ec38c0fd6867d2b5a88b40549f791ce7bb;hpb=9f0cba528a163645c8ecace413731c23310f2c26 diff --git a/src/flash/nor/at91sam7.c b/src/flash/nor/at91sam7.c index e46122ad8a..9de829327a 100644 --- a/src/flash/nor/at91sam7.c +++ b/src/flash/nor/at91sam7.c @@ -5,19 +5,17 @@ * Copyright (C) 2008 by Gheorghe Guran (atlas) * * * * 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 * + * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS for A PARTICULAR PURPOSE. See the * - * GNU General public License for more details. * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * * * - * You should have received a copy of the GNU General public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * ****************************************************************************/ /*************************************************************************** @@ -98,7 +96,7 @@ #define FLASH_SIZE_2048KB 14 static int at91sam7_protect_check(struct flash_bank *bank); -static int at91sam7_write(struct flash_bank *bank, uint8_t *buffer, uint32_t offset, +static int at91sam7_write(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset, uint32_t count); static uint32_t at91sam7_get_flash_status(struct target *target, int bank_number); @@ -106,11 +104,11 @@ static void at91sam7_set_flash_mode(struct flash_bank *bank, int mode); static uint32_t at91sam7_wait_status_busy(struct flash_bank *bank, uint32_t waitbits, int timeout); static int at91sam7_flash_command(struct flash_bank *bank, uint8_t cmd, uint16_t pagen); -static uint32_t MC_FMR[4] = { 0xFFFFFF60, 0xFFFFFF70, 0xFFFFFF80, 0xFFFFFF90 }; -static uint32_t MC_FCR[4] = { 0xFFFFFF64, 0xFFFFFF74, 0xFFFFFF84, 0xFFFFFF94 }; -static uint32_t MC_FSR[4] = { 0xFFFFFF68, 0xFFFFFF78, 0xFFFFFF88, 0xFFFFFF98 }; +static const uint32_t MC_FMR[4] = { 0xFFFFFF60, 0xFFFFFF70, 0xFFFFFF80, 0xFFFFFF90 }; +static const uint32_t MC_FCR[4] = { 0xFFFFFF64, 0xFFFFFF74, 0xFFFFFF84, 0xFFFFFF94 }; +static const uint32_t MC_FSR[4] = { 0xFFFFFF68, 0xFFFFFF78, 0xFFFFFF88, 0xFFFFFF98 }; -static char *EPROC[8] = { +static const char *EPROC[8] = { "Unknown", "ARM946-E", "ARM7TDMI", "Unknown", "ARM920T", "ARM926EJ-S", "Unknown", "Unknown" }; @@ -353,9 +351,8 @@ static int at91sam7_flash_command(struct flash_bank *bank, uint8_t cmd, uint16_t /* Read device id register, main clock frequency register and fill in driver info structure */ static int at91sam7_read_part_info(struct flash_bank *bank) { - struct flash_bank *t_bank = bank; struct at91sam7_flash_bank *at91sam7_info; - struct target *target = t_bank->target; + struct target *target = bank->target; uint16_t bnk, sec; uint16_t arch; @@ -370,14 +367,13 @@ static int at91sam7_read_part_info(struct flash_bank *bank) uint32_t base_address = 0; char *target_name_t = "Unknown"; - at91sam7_info = t_bank->driver_priv; + at91sam7_info = bank->driver_priv; if (at91sam7_info->cidr != 0) { /* flash already configured, update clock and check for protected sectors */ - struct flash_bank *fb = bank; - t_bank = fb; - - while (t_bank) { + for (struct flash_bank *t_bank = bank; t_bank; t_bank = t_bank->next) { + if (t_bank->target != target) + continue; /* re-calculate master clock frequency */ at91sam7_read_clock_info(t_bank); @@ -386,9 +382,6 @@ static int at91sam7_read_part_info(struct flash_bank *bank) /* check protect state */ at91sam7_protect_check(t_bank); - - t_bank = fb->next; - fb = t_bank; } return ERROR_OK; @@ -403,9 +396,10 @@ static int at91sam7_read_part_info(struct flash_bank *bank) if (at91sam7_info->flash_autodetection == 0) { /* banks and sectors are already created, based on data from input file */ - struct flash_bank *fb = bank; - t_bank = fb; - while (t_bank) { + for (struct flash_bank *t_bank = bank; t_bank; t_bank = t_bank->next) { + if (t_bank->target != target) + continue; + at91sam7_info = t_bank->driver_priv; at91sam7_info->cidr = cidr; @@ -426,9 +420,6 @@ static int at91sam7_read_part_info(struct flash_bank *bank) /* check protect state */ at91sam7_protect_check(t_bank); - - t_bank = fb->next; - fb = t_bank; } return ERROR_OK; @@ -576,6 +567,7 @@ static int at91sam7_read_part_info(struct flash_bank *bank) bank_size = sectors_num * pages_per_sector * page_size; for (bnk = 0; bnk < banks_num; bnk++) { + struct flash_bank *t_bank = bank; if (bnk > 0) { if (!t_bank->next) { /* create a new flash bank element */ @@ -647,14 +639,6 @@ static int at91sam7_read_part_info(struct flash_bank *bank) static int at91sam7_erase_check(struct flash_bank *bank) { - struct target *target = bank->target; - uint16_t retval; - uint32_t blank; - uint16_t fast_check; - uint8_t *buffer; - uint16_t nSector; - uint16_t nByte; - if (bank->target->state != TARGET_HALTED) { LOG_ERROR("Target not halted"); return ERROR_TARGET_NOT_HALTED; @@ -664,45 +648,7 @@ static int at91sam7_erase_check(struct flash_bank *bank) at91sam7_read_clock_info(bank); at91sam7_set_flash_mode(bank, FMR_TIMING_FLASH); - fast_check = 1; - for (nSector = 0; nSector < bank->num_sectors; nSector++) { - retval = target_blank_check_memory(target, - bank->base + bank->sectors[nSector].offset, - bank->sectors[nSector].size, - &blank); - if (retval != ERROR_OK) { - fast_check = 0; - break; - } - if (blank == 0xFF) - bank->sectors[nSector].is_erased = 1; - else - bank->sectors[nSector].is_erased = 0; - } - - if (fast_check) - return ERROR_OK; - - LOG_USER("Running slow fallback erase check - add working memory"); - - buffer = malloc(bank->sectors[0].size); - for (nSector = 0; nSector < bank->num_sectors; nSector++) { - bank->sectors[nSector].is_erased = 1; - retval = target_read_memory(target, bank->base + bank->sectors[nSector].offset, 4, - bank->sectors[nSector].size/4, buffer); - if (retval != ERROR_OK) - return retval; - - for (nByte = 0; nByte < bank->sectors[nSector].size; nByte++) { - if (buffer[nByte] != 0xFF) { - bank->sectors[nSector].is_erased = 0; - break; - } - } - } - free(buffer); - - return ERROR_OK; + return default_flash_blank_check(bank); } static int at91sam7_protect_check(struct flash_bank *bank) @@ -897,8 +843,10 @@ static int at91sam7_erase(struct flash_bank *bank, int first, int last) for (pos = 0; pos < nbytes; pos++) buffer[pos] = 0xFF; - if (at91sam7_write(bank, buffer, bank->sectors[first].offset, nbytes) != ERROR_OK) + if (at91sam7_write(bank, buffer, bank->sectors[first].offset, nbytes) != ERROR_OK) { + free(buffer); return ERROR_FLASH_OPERATION_FAILED; + } free(buffer); } @@ -952,7 +900,7 @@ static int at91sam7_protect(struct flash_bank *bank, int set, int first, int las return ERROR_OK; } -static int at91sam7_write(struct flash_bank *bank, uint8_t *buffer, uint32_t offset, uint32_t count) +static int at91sam7_write(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset, uint32_t count) { int retval; struct at91sam7_flash_bank *at91sam7_info = bank->driver_priv;