From: David B. <dbr...@us...> - 2009-12-16 23:17:54
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "Main OpenOCD repository". The branch, master has been updated via d265c219b90bfe9454991bed6b41f790f085d230 (commit) via 1cd7b3b49b33860a5652b9dd2829e9ed71ac6289 (commit) via 6f2b9ea9e158aa116937b234a9c069bfef1f4238 (commit) via f85dc92d2a2b336f9844c0eddcdf4df4c0dc9fbf (commit) via 47998a55e0f66d513b52f7851901bc79bc1f7213 (commit) from fcd3c52611009559b1954a43463e7015870d36c2 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit d265c219b90bfe9454991bed6b41f790f085d230 Author: David Brownell <dbr...@us...> Date: Wed Dec 16 14:17:31 2009 -0800 stellaris: comments Someday revisit various issues: Tempest parts support writing more than one word at a time; for some target firmware it might be necessary to save and restore flash IRQ configuration. (The safest policy is likely to always reset after flash updates.) Plus swap some undesirable TAB characters with SPACE. Signed-off-by: David Brownell <dbr...@us...> diff --git a/src/flash/nor/stellaris.c b/src/flash/nor/stellaris.c index 34649fc..4183cba 100644 --- a/src/flash/nor/stellaris.c +++ b/src/flash/nor/stellaris.c @@ -553,6 +553,11 @@ static int stellaris_read_part_info(struct flash_bank *bank) stellaris_info->pagesize = 1024; stellaris_info->pages_in_lockregion = 2; + /* REVISIT for at least Tempest parts, read NVMSTAT.FWB too. + * That exposes a 32-word Flash Write Buffer ... enabling + * writes of more than one word at a time. + */ + return ERROR_OK; } @@ -640,6 +645,10 @@ static int stellaris_erase(struct flash_bank *bank, int first, int last) target_write_u32(target, FLASH_CIM, 0); target_write_u32(target, FLASH_MISC, PMISC | AMISC); + /* REVISIT this clobbers state set by any halted firmware ... + * it might want to process those IRQs. + */ + for (banknr = first; banknr <= last; banknr++) { /* Address is first word in page */ @@ -726,6 +735,10 @@ static int stellaris_protect(struct flash_bank *bank, int set, int first, int la target_write_u32(target, FLASH_CIM, 0); target_write_u32(target, FLASH_MISC, PMISC | AMISC); + /* REVISIT this clobbers state set by any halted firmware ... + * it might want to process those IRQs. + */ + LOG_DEBUG("fmppe 0x%" PRIx32 "",fmppe); target_write_u32(target, SCB_BASE | FMPPE, fmppe); @@ -921,6 +934,10 @@ static int stellaris_write(struct flash_bank *bank, uint8_t *buffer, uint32_t of target_write_u32(target, FLASH_CIM, 0); target_write_u32(target, FLASH_MISC, PMISC | AMISC); + /* REVISIT this clobbers state set by any halted firmware ... + * it might want to process those IRQs. + */ + /* multiple words to be programmed? */ if (words_remaining > 0) { @@ -1068,6 +1085,10 @@ static int stellaris_mass_erase(struct flash_bank *bank) target_write_u32(target, FLASH_CIM, 0); target_write_u32(target, FLASH_MISC, PMISC | AMISC); + /* REVISIT this clobbers state set by any halted firmware ... + * it might want to process those IRQs. + */ + target_write_u32(target, FLASH_FMA, 0); target_write_u32(target, FLASH_FMC, FMC_WRKEY | FMC_MERASE); /* Wait until erase complete */ diff --git a/src/flash/nor/stellaris.h b/src/flash/nor/stellaris.h index 4de4f00..a469323 100644 --- a/src/flash/nor/stellaris.h +++ b/src/flash/nor/stellaris.h @@ -53,18 +53,19 @@ struct stellaris_flash_bank /* STELLARIS control registers */ #define SCB_BASE 0x400FE000 -#define DID0 0x000 -#define DID1 0x004 -#define DC0 0x008 -#define DC1 0x010 -#define DC2 0x014 -#define DC3 0x018 -#define DC4 0x01C - -#define RIS 0x050 -#define RCC 0x060 -#define PLLCFG 0x064 -#define RCC2 0x070 +#define DID0 0x000 +#define DID1 0x004 +#define DC0 0x008 +#define DC1 0x010 +#define DC2 0x014 +#define DC3 0x018 +#define DC4 0x01C + +#define RIS 0x050 +#define RCC 0x060 +#define PLLCFG 0x064 +#define RCC2 0x070 +#define NVMSTAT 0x1a0 /* "legacy" flash memory protection registers (64KB max) */ #define FMPRE 0x130 commit 1cd7b3b49b33860a5652b9dd2829e9ed71ac6289 Author: David Brownell <dbr...@us...> Date: Wed Dec 16 14:17:31 2009 -0800 stellaris: probe() cleanups Fix potential memory leak: make sure the per-bank data structures are only allocated in probe(), and that calling probe() multiple times is a NOP. Use it for auto_probe(). Require probe() to have done its thing: don't make access routines cope with it not having been called. Shrink a bunch of failure paths; and in some cases, correct them. Don't needlessly insist on a halted target for probe(). Signed-off-by: David Brownell <dbr...@us...> diff --git a/src/flash/nor/stellaris.c b/src/flash/nor/stellaris.c index 0ae65dc..34649fc 100644 --- a/src/flash/nor/stellaris.c +++ b/src/flash/nor/stellaris.c @@ -36,8 +36,7 @@ #define DID0_VER(did0) ((did0 >> 28)&0x07) -static int stellaris_read_part_info(struct flash_bank *bank); - +static void stellaris_read_clock_info(struct flash_bank *bank); static int stellaris_mass_erase(struct flash_bank *bank); static struct { @@ -261,15 +260,11 @@ static int stellaris_info(struct flash_bank *bank, char *buf, int buf_size) int printed, device_class; struct stellaris_flash_bank *stellaris_info = bank->driver_priv; - stellaris_read_part_info(bank); - if (stellaris_info->did1 == 0) - { - printed = snprintf(buf, buf_size, "Cannot identify target as a Stellaris\n"); - buf += printed; - buf_size -= printed; - return ERROR_FLASH_OPERATION_FAILED; - } + return ERROR_FLASH_BANK_NOT_PROBED; + + /* Read main and master clock freqency register */ + stellaris_read_clock_info(bank); if (DID0_VER(stellaris_info->did0) > 0) { @@ -495,7 +490,8 @@ static int stellaris_read_part_info(struct flash_bank *bank) fam = (did1 >> 24) & 0xF; if (((ver != 0) && (ver != 1)) || (fam != 0)) { - LOG_WARNING("Unknown did1 version/family, cannot positively identify target as a Stellaris"); + LOG_WARNING("Unknown did1 version/family."); + return ERROR_FLASH_OPERATION_FAILED; } /* For Sandstorm, Fury, DustDevil: current data sheets say IOSC @@ -535,9 +531,10 @@ static int stellaris_read_part_info(struct flash_bank *bank) default: LOG_WARNING("Unknown did0 class"); } - default: break; + default: LOG_WARNING("Unknown did0 version"); + break; } for (i = 0; StellarisParts[i].partno; i++) @@ -554,23 +551,8 @@ static int stellaris_read_part_info(struct flash_bank *bank) stellaris_info->num_lockbits = 1 + (stellaris_info->dc0 & 0xFFFF); stellaris_info->num_pages = 2 *(1 + (stellaris_info->dc0 & 0xFFFF)); stellaris_info->pagesize = 1024; - bank->size = 1024 * stellaris_info->num_pages; stellaris_info->pages_in_lockregion = 2; - /* provide this for the benefit of the higher flash driver layers */ - bank->num_sectors = stellaris_info->num_pages; - bank->sectors = malloc(sizeof(struct flash_sector) * bank->num_sectors); - for (i = 0; i < bank->num_sectors; i++) - { - bank->sectors[i].offset = i * stellaris_info->pagesize; - bank->sectors[i].size = stellaris_info->pagesize; - bank->sectors[i].is_erased = -1; - bank->sectors[i].is_protected = -1; - } - - /* Read main and master clock freqency register */ - stellaris_read_clock_info(bank); - return ERROR_OK; } @@ -586,11 +568,7 @@ static int stellaris_protect_check(struct flash_bank *bank) unsigned page; if (stellaris->did1 == 0) - { - status = stellaris_read_part_info(bank); - if (status < 0) - return status; - } + return ERROR_FLASH_BANK_NOT_PROBED; for (i = 0; i < (unsigned) bank->num_sectors; i++) bank->sectors[i].is_protected = -1; @@ -642,15 +620,7 @@ static int stellaris_erase(struct flash_bank *bank, int first, int last) } if (stellaris_info->did1 == 0) - { - stellaris_read_part_info(bank); - } - - if (stellaris_info->did1 == 0) - { - LOG_WARNING("Cannot identify target as Stellaris"); - return ERROR_FLASH_OPERATION_FAILED; - } + return ERROR_FLASH_BANK_NOT_PROBED; if ((first < 0) || (last < first) || (last >= (int)stellaris_info->num_pages)) { @@ -719,6 +689,9 @@ static int stellaris_protect(struct flash_bank *bank, int set, int first, int la return ERROR_INVALID_ARGUMENTS; } + if (stellaris_info->did1 == 0) + return ERROR_FLASH_BANK_NOT_PROBED; + /* lockregions are 2 pages ... must protect [even..odd] */ if ((first < 0) || (first & 1) || (last < first) || !(last & 1) @@ -728,17 +701,6 @@ static int stellaris_protect(struct flash_bank *bank, int set, int first, int la return ERROR_FLASH_SECTOR_INVALID; } - if (stellaris_info->did1 == 0) - { - stellaris_read_part_info(bank); - } - - if (stellaris_info->did1 == 0) - { - LOG_WARNING("Cannot identify target as an Stellaris MCU"); - return ERROR_FLASH_OPERATION_FAILED; - } - /* Refresh flash controller timing */ stellaris_read_clock_info(bank); stellaris_set_flash_timing(bank); @@ -940,15 +902,7 @@ static int stellaris_write(struct flash_bank *bank, uint8_t *buffer, uint32_t of bank, buffer, offset, count); if (stellaris_info->did1 == 0) - { - stellaris_read_part_info(bank); - } - - if (stellaris_info->did1 == 0) - { - LOG_WARNING("Cannot identify target as a Stellaris processor"); - return ERROR_FLASH_OPERATION_FAILED; - } + return ERROR_FLASH_BANK_NOT_PROBED; if (offset & 0x3) { @@ -1056,26 +1010,36 @@ static int stellaris_write(struct flash_bank *bank, uint8_t *buffer, uint32_t of static int stellaris_probe(struct flash_bank *bank) { - /* we can't probe on an stellaris - * if this is an stellaris, it has the configured flash + struct stellaris_flash_bank *stellaris_info = bank->driver_priv; + int retval; + + /* If this is a stellaris chip, it has flash; probe() is just + * to figure out how much is present. Only do it once. + */ + if (stellaris_info->did1 != 0) + return ERROR_OK; + + /* stellaris_read_part_info() already handled error checking and + * reporting. Note that it doesn't write, so we don't care about + * whether the target is halted or not. */ + retval = stellaris_read_part_info(bank); + if (retval != ERROR_OK) + return retval; - if (bank->target->state != TARGET_HALTED) + /* provide this for the benefit of the NOR flash framework */ + bank->size = 1024 * stellaris_info->num_pages; + bank->num_sectors = stellaris_info->num_pages; + bank->sectors = calloc(bank->num_sectors, sizeof(struct flash_sector)); + for (int i = 0; i < bank->num_sectors; i++) { - LOG_ERROR("Target not halted"); - return ERROR_TARGET_NOT_HALTED; + bank->sectors[i].offset = i * stellaris_info->pagesize; + bank->sectors[i].size = stellaris_info->pagesize; + bank->sectors[i].is_erased = -1; + bank->sectors[i].is_protected = -1; } - /* stellaris_read_part_info() already takes care about error checking and reporting */ - return stellaris_read_part_info(bank); -} - -static int stellaris_auto_probe(struct flash_bank *bank) -{ - struct stellaris_flash_bank *stellaris_info = bank->driver_priv; - if (stellaris_info->did1) - return ERROR_OK; - return stellaris_probe(bank); + return retval; } static int stellaris_mass_erase(struct flash_bank *bank) @@ -1094,15 +1058,7 @@ static int stellaris_mass_erase(struct flash_bank *bank) } if (stellaris_info->did1 == 0) - { - stellaris_read_part_info(bank); - } - - if (stellaris_info->did1 == 0) - { - LOG_WARNING("Cannot identify target as Stellaris"); - return ERROR_FLASH_OPERATION_FAILED; - } + return ERROR_FLASH_BANK_NOT_PROBED; /* Refresh flash controller timing */ stellaris_read_clock_info(bank); @@ -1198,7 +1154,7 @@ struct flash_driver stellaris_flash = { .protect = stellaris_protect, .write = stellaris_write, .probe = stellaris_probe, - .auto_probe = stellaris_auto_probe, + .auto_probe = stellaris_probe, .erase_check = default_flash_mem_blank_check, .protect_check = stellaris_protect_check, .info = stellaris_info, commit 6f2b9ea9e158aa116937b234a9c069bfef1f4238 Author: David Brownell <dbr...@us...> Date: Wed Dec 16 14:17:31 2009 -0800 stellaris: remove needless code No point in reading and discarding a status value when fetching part description data. Or having that needless "#if 0" code. Signed-off-by: David Brownell <dbr...@us...> diff --git a/src/flash/nor/stellaris.c b/src/flash/nor/stellaris.c index 8b0d9d3..0ae65dc 100644 --- a/src/flash/nor/stellaris.c +++ b/src/flash/nor/stellaris.c @@ -37,7 +37,6 @@ #define DID0_VER(did0) ((did0 >> 28)&0x07) static int stellaris_read_part_info(struct flash_bank *bank); -static uint32_t stellaris_get_flash_status(struct flash_bank *bank); static int stellaris_mass_erase(struct flash_bank *bank); @@ -335,16 +334,6 @@ static int stellaris_info(struct flash_bank *bank, char *buf, int buf_size) * chip identification and status * ***************************************************************************/ -static uint32_t stellaris_get_flash_status(struct flash_bank *bank) -{ - struct target *target = bank->target; - uint32_t fmc; - - target_read_u32(target, FLASH_CONTROL_BASE | FLASH_FMC, &fmc); - - return fmc; -} - /* Set the flash timimg register to match current clocking */ static void stellaris_set_flash_timing(struct flash_bank *bank) { @@ -473,48 +462,12 @@ static void stellaris_read_clock_info(struct flash_bank *bank) stellaris_info->mck_freq = mainfreq; } -#if 0 -static uint32_t stellaris_wait_status_busy(struct flash_bank *bank, uint32_t waitbits, int timeout) -{ - uint32_t status; - - /* Stellaris waits for cmdbit to clear */ - while (((status = stellaris_get_flash_status(bank)) & waitbits) && (timeout-- > 0)) - { - LOG_DEBUG("status: 0x%x", status); - alive_sleep(1); - } - - /* Flash errors are reflected in the FLASH_CRIS register */ - - return status; -} - -/* Send one command to the flash controller */ -static int stellaris_flash_command(struct flash_bank *bank,uint8_t cmd,uint16_t pagen) -{ - uint32_t fmc; - struct target *target = bank->target; - - fmc = FMC_WRKEY | cmd; - target_write_u32(target, FLASH_CONTROL_BASE | FLASH_FMC, fmc); - LOG_DEBUG("Flash command: 0x%x", fmc); - - if (stellaris_wait_status_busy(bank, cmd, 100)) - { - return ERROR_FLASH_OPERATION_FAILED; - } - - return ERROR_OK; -} -#endif - /* Read device id register, main clock frequency register and fill in driver info structure */ static int stellaris_read_part_info(struct flash_bank *bank) { struct stellaris_flash_bank *stellaris_info = bank->driver_priv; struct target *target = bank->target; - uint32_t did0, did1, ver, fam, status; + uint32_t did0, did1, ver, fam; int i; /* Read and parse chip identification register */ @@ -618,8 +571,6 @@ static int stellaris_read_part_info(struct flash_bank *bank) /* Read main and master clock freqency register */ stellaris_read_clock_info(bank); - status = stellaris_get_flash_status(bank); - return ERROR_OK; } commit f85dc92d2a2b336f9844c0eddcdf4df4c0dc9fbf Author: David Brownell <dbr...@us...> Date: Wed Dec 16 14:17:31 2009 -0800 stellaris: avoid chip writes Previously "reading" clock info (and part info) also, as a side effect, wrote the flash timing register. Instead, be more safe: "reading" should only read. Write paths still refresh timing, coping with changes the application code may have made. Also rename the routine which sets flash timing, indicating what it's really doing; it's got nothing to do with a "mode". Signed-off-by: David Brownell <dbr...@us...> diff --git a/src/flash/nor/stellaris.c b/src/flash/nor/stellaris.c index 103202d..8b0d9d3 100644 --- a/src/flash/nor/stellaris.c +++ b/src/flash/nor/stellaris.c @@ -345,8 +345,8 @@ static uint32_t stellaris_get_flash_status(struct flash_bank *bank) return fmc; } -/* Setup the timimg registers */ -static void stellaris_set_flash_mode(struct flash_bank *bank,int mode) +/* Set the flash timimg register to match current clocking */ +static void stellaris_set_flash_timing(struct flash_bank *bank) { struct stellaris_flash_bank *stellaris_info = bank->driver_priv; struct target *target = bank->target; @@ -471,9 +471,6 @@ static void stellaris_read_clock_info(struct flash_bank *bank) stellaris_info->mck_freq = mainfreq/(1 + sysdiv); else stellaris_info->mck_freq = mainfreq; - - /* Forget old flash timing */ - stellaris_set_flash_mode(bank, 0); } #if 0 @@ -714,9 +711,9 @@ static int stellaris_erase(struct flash_bank *bank, int first, int last) return stellaris_mass_erase(bank); } - /* Configure the flash controller timing */ + /* Refresh flash controller timing */ stellaris_read_clock_info(bank); - stellaris_set_flash_mode(bank,0); + stellaris_set_flash_timing(bank); /* Clear and disable flash programming interrupts */ target_write_u32(target, FLASH_CIM, 0); @@ -791,9 +788,9 @@ static int stellaris_protect(struct flash_bank *bank, int set, int first, int la return ERROR_FLASH_OPERATION_FAILED; } - /* Configure the flash controller timing */ + /* Refresh flash controller timing */ stellaris_read_clock_info(bank); - stellaris_set_flash_mode(bank, 0); + stellaris_set_flash_timing(bank); /* convert from pages to lockregions */ first /= 2; @@ -1011,9 +1008,9 @@ static int stellaris_write(struct flash_bank *bank, uint8_t *buffer, uint32_t of if (offset + count > bank->size) return ERROR_FLASH_DST_OUT_OF_BANK; - /* Configure the flash controller timing */ + /* Refresh flash controller timing */ stellaris_read_clock_info(bank); - stellaris_set_flash_mode(bank, 0); + stellaris_set_flash_timing(bank); /* Clear and disable flash programming interrupts */ target_write_u32(target, FLASH_CIM, 0); @@ -1156,9 +1153,9 @@ static int stellaris_mass_erase(struct flash_bank *bank) return ERROR_FLASH_OPERATION_FAILED; } - /* Configure the flash controller timing */ + /* Refresh flash controller timing */ stellaris_read_clock_info(bank); - stellaris_set_flash_mode(bank, 0); + stellaris_set_flash_timing(bank); /* Clear and disable flash programming interrupts */ target_write_u32(target, FLASH_CIM, 0); commit 47998a55e0f66d513b52f7851901bc79bc1f7213 Author: David Brownell <dbr...@us...> Date: Wed Dec 16 11:57:59 2009 -0800 NOR: bugfix "flash fill[bwh] ..." helptext These commands don't have a "bank" parameter. Signed-off-by: David Brownell <dbr...@us...> diff --git a/src/flash/nor/tcl.c b/src/flash/nor/tcl.c index 6ab710b..1e933b2 100644 --- a/src/flash/nor/tcl.c +++ b/src/flash/nor/tcl.c @@ -697,21 +697,21 @@ static const struct command_registration flash_exec_command_handlers[] = { .name = "fillw", .handler = &handle_flash_fill_command, .mode = COMMAND_EXEC, - .usage = "<bank> <address> <word_pattern> <count>", + .usage = "<address> <word_pattern> <count>", .help = "fill with pattern (no autoerase)", }, { .name = "fillh", .handler = &handle_flash_fill_command, .mode = COMMAND_EXEC, - .usage = "<bank> <address> <halfword_pattern> <count>", + .usage = "<address> <halfword_pattern> <count>", .help = "fill with pattern", }, { .name = "fillb", .handler = &handle_flash_fill_command, .mode = COMMAND_EXEC, - .usage = "<bank> <address> <byte_pattern> <count>", + .usage = "<address> <byte_pattern> <count>", .help = "fill with pattern", }, ----------------------------------------------------------------------- Summary of changes: src/flash/nor/stellaris.c | 221 +++++++++++++++------------------------------ src/flash/nor/stellaris.h | 23 +++--- src/flash/nor/tcl.c | 6 +- 3 files changed, 88 insertions(+), 162 deletions(-) hooks/post-receive -- Main OpenOCD repository |