summaryrefslogtreecommitdiff
path: root/src/flash/stellaris.c
diff options
context:
space:
mode:
authormlu <mlu@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2007-06-14 17:33:20 +0000
committermlu <mlu@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2007-06-14 17:33:20 +0000
commit972ca49d3a5e285492e4c1680289f819f26eaec3 (patch)
tree1232e11df2fa7ac9756b5ae6b42af8fbaf15f8cb /src/flash/stellaris.c
parentbc08425e6df6a2dc799d4f5eb6ccc6fc26029477 (diff)
downloadopenocd+libswd-972ca49d3a5e285492e4c1680289f819f26eaec3.tar.gz
openocd+libswd-972ca49d3a5e285492e4c1680289f819f26eaec3.tar.bz2
openocd+libswd-972ca49d3a5e285492e4c1680289f819f26eaec3.tar.xz
openocd+libswd-972ca49d3a5e285492e4c1680289f819f26eaec3.zip
Added patch for Luminar Micors Fury class devices (Joe Kroesche)
Added support for NVGM bit 2 for AT91SAM7XC128/256 git-svn-id: svn://svn.berlios.de/openocd/trunk@172 b42882b7-edfa-0310-969c-e2dbd0fdcd60
Diffstat (limited to 'src/flash/stellaris.c')
-rw-r--r--src/flash/stellaris.c69
1 files changed, 61 insertions, 8 deletions
diff --git a/src/flash/stellaris.c b/src/flash/stellaris.c
index 68a5179d..ec5dc3a4 100644
--- a/src/flash/stellaris.c
+++ b/src/flash/stellaris.c
@@ -74,7 +74,7 @@ flash_driver_t stellaris_flash =
struct {
u32 partno;
- char partname[];
+ char *partname;
} StellarisParts[] =
{
{0x01,"LM3S101"},
@@ -96,6 +96,33 @@ struct {
{0x33,"LM3S812"},
{0x34,"LM3S815"},
{0x35,"LM3S828"},
+ {0x51,"LM3S2110"},
+ {0x84,"LM3S2139"},
+ {0xa2,"LM3S2410"},
+ {0x59,"LM3S2412"},
+ {0x56,"LM3S2432"},
+ {0x5a,"LM3S2533"},
+ {0x57,"LM3S2620"},
+ {0x85,"LM3S2637"},
+ {0x53,"LM3S2651"},
+ {0xa4,"LM3S2730"},
+ {0x52,"LM3S2739"},
+ {0x54,"LM3S2939"},
+ {0x8f,"LM3S2948"},
+ {0x58,"LM3S2950"},
+ {0x55,"LM3S2965"},
+ {0xa1,"LM3S6100"},
+ {0x74,"LM3S6110"},
+ {0xa5,"LM3S6420"},
+ {0x82,"LM3S6422"},
+ {0x75,"LM3S6432"},
+ {0x71,"LM3S6610"},
+ {0x83,"LM3S6633"},
+ {0x8b,"LM3S6637"},
+ {0xa3,"LM3S6730"},
+ {0x89,"LM3S6938"},
+ {0x78,"LM3S6952"},
+ {0x73,"LM3S6965"},
{0,"Unknown part"}
};
@@ -157,7 +184,9 @@ int stellaris_info(struct flash_bank_s *bank, char *buf, int buf_size)
return ERROR_FLASH_OPERATION_FAILED;
}
- printed = snprintf(buf, buf_size, "\nLMI Stellaris information: Chip is %s v%i.%02i\n",stellaris_info->target_name, (stellaris_info->did0>>8)&0xFF, (stellaris_info->did0)&0xFF);
+ printed = snprintf(buf, buf_size, "\nLMI Stellaris information: Chip is class %i %s v%c.%i\n",
+ (stellaris_info->did0>>16)&0xff, stellaris_info->target_name,
+ 'A' + (stellaris_info->did0>>8)&0xFF, (stellaris_info->did0)&0xFF);
buf += printed;
buf_size -= printed;
@@ -295,7 +324,7 @@ int stellaris_read_part_info(struct flash_bank_s *bank)
{
stellaris_flash_bank_t *stellaris_info = bank->driver_priv;
target_t *target = stellaris_info->target;
- u32 did0,did1, status;
+ u32 did0,did1, ver, fam, status;
int i;
/* Read and parse chip identification register */
@@ -305,16 +334,19 @@ int stellaris_read_part_info(struct flash_bank_s *bank)
target_read_u32(target, SCB_BASE|DC1, &stellaris_info->dc1);
DEBUG("did0 0x%x, did1 0x%x, dc0 0x%x, dc1 0x%x",did0, did1, stellaris_info->dc0,stellaris_info->dc1);
- if (((did0>>27)&0x7))
+ ver = did0 >> 28;
+ if((ver != 0) && (ver != 1))
{
- WARNING("Unkown did0 version, cannot identify target");
+ WARNING("Unknown did0 version, cannot identify target");
return ERROR_FLASH_OPERATION_FAILED;
}
- if (did1>>24)
+ ver = did1 >> 28;
+ fam = (did1 >> 24) & 0xF;
+ if(((ver != 0) && (ver != 1)) || (fam != 0))
{
- WARNING("Unkown did1 version/family, cannot positively identify target as a Stellaris");
+ WARNING("Unknown did1 version/family, cannot positively identify target as a Stellaris");
}
if (did1 == 0)
@@ -409,7 +441,7 @@ int stellaris_erase(struct flash_bank_s *bank, int first, int last)
if (stellaris_info->did1 == 0)
{
- WARNING("Cannot identify target as an AT91SAM");
+ WARNING("Cannot identify target as Stellaris");
return ERROR_FLASH_OPERATION_FAILED;
}
@@ -428,6 +460,7 @@ int stellaris_erase(struct flash_bank_s *bank, int first, int last)
if ((first == 0) && (last == (stellaris_info->num_pages-1)))
{
+ target_write_u32(target, FLASH_FMA, 0);
target_write_u32(target, FLASH_FMC, FMC_WRKEY | FMC_MERASE);
/* Wait until erase complete */
do
@@ -436,6 +469,19 @@ int stellaris_erase(struct flash_bank_s *bank, int first, int last)
}
while(flash_fmc & FMC_MERASE);
+ /* if device has > 128k, then second erase cycle is needed */
+ if(stellaris_info->num_pages * stellaris_info->pagesize > 0x20000)
+ {
+ target_write_u32(target, FLASH_FMA, 0x20000);
+ target_write_u32(target, FLASH_FMC, FMC_WRKEY | FMC_MERASE);
+ /* Wait until erase complete */
+ do
+ {
+ target_read_u32(target, FLASH_FMC, &flash_fmc);
+ }
+ while(flash_fmc & FMC_MERASE);
+ }
+
return ERROR_OK;
}
@@ -588,6 +634,8 @@ int stellaris_write_block(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32
armv7m_algorithm_t armv7m_info;
int retval;
+ DEBUG("(bank=%08X buffer=%08X offset=%08X wcount=%08X)",
+ bank, buffer, offset, wcount);
/* flash write code */
if (target_alloc_working_area(target, sizeof(stellaris_write_code), &write_algorithm) != ERROR_OK)
@@ -601,6 +649,8 @@ int stellaris_write_block(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32
/* memory buffer */
while (target_alloc_working_area(target, buffer_size, &source) != ERROR_OK)
{
+ DEBUG("called target_alloc_working_area(target=%08X buffer_size=%08X source=%08X)",
+ target, buffer_size, source);
buffer_size /= 2;
if (buffer_size <= 256)
{
@@ -677,6 +727,9 @@ int stellaris_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count
u32 fcr,flash_cris,flash_fmc;
u32 retval;
+ DEBUG("(bank=%08X buffer=%08X offset=%08X count=%08X)",
+ bank, buffer, offset, count);
+
if (stellaris_info->target->state != TARGET_HALTED)
{
return ERROR_TARGET_NOT_HALTED;