summaryrefslogtreecommitdiff
path: root/src/flash/stellaris.c
diff options
context:
space:
mode:
authormlu <mlu@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2007-09-10 17:43:08 +0000
committermlu <mlu@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2007-09-10 17:43:08 +0000
commited36a8d15dfd04e47d23d5f1e09078f105785fb1 (patch)
tree435398a5acb120632a03a190efb32da848c6b0b9 /src/flash/stellaris.c
parentb3c593da0f76fa0edb3177504c8d791c3d6eb784 (diff)
downloadopenocd+libswd-ed36a8d15dfd04e47d23d5f1e09078f105785fb1.tar.gz
openocd+libswd-ed36a8d15dfd04e47d23d5f1e09078f105785fb1.tar.bz2
openocd+libswd-ed36a8d15dfd04e47d23d5f1e09078f105785fb1.tar.xz
openocd+libswd-ed36a8d15dfd04e47d23d5f1e09078f105785fb1.zip
- Fixed display of sector sizes in flash.c
- Clean up, remove unused variables and code in armv7, cortex_m3 and stellaris code - Move restore_context from cortex_m3 to armv7m - Updated halt handling for cortex_m3 git-svn-id: svn://svn.berlios.de/openocd/trunk@206 b42882b7-edfa-0310-969c-e2dbd0fdcd60
Diffstat (limited to 'src/flash/stellaris.c')
-rw-r--r--src/flash/stellaris.c67
1 files changed, 41 insertions, 26 deletions
diff --git a/src/flash/stellaris.c b/src/flash/stellaris.c
index 490b02cc..970c1d69 100644
--- a/src/flash/stellaris.c
+++ b/src/flash/stellaris.c
@@ -43,6 +43,7 @@
#include <string.h>
#include <unistd.h>
+#define DID0_VER(did0) ((did0>>28)&0x07)
int stellaris_register_commands(struct command_context_s *cmd_ctx);
int stellaris_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct flash_bank_s *bank);
int stellaris_erase(struct flash_bank_s *bank, int first, int last);
@@ -53,6 +54,7 @@ int stellaris_erase_check(struct flash_bank_s *bank);
int stellaris_protect_check(struct flash_bank_s *bank);
int stellaris_info(struct flash_bank_s *bank, char *buf, int buf_size);
+int stellaris_read_part_info(struct flash_bank_s *bank);
u32 stellaris_get_flash_status(flash_bank_t *bank);
void stellaris_set_flash_mode(flash_bank_t *bank,int mode);
u32 stellaris_wait_status_busy(flash_bank_t *bank, u32 waitbits, int timeout);
@@ -128,6 +130,12 @@ struct {
{0,"Unknown part"}
};
+char * StellarisClassname[2] =
+{
+ "Sandstorm",
+ "Fury"
+};
+
/***************************************************************************
* openocd command interface *
***************************************************************************/
@@ -169,7 +177,7 @@ int stellaris_register_commands(struct command_context_s *cmd_ctx)
int stellaris_info(struct flash_bank_s *bank, char *buf, int buf_size)
{
- int printed;
+ int printed, device_class;
stellaris_flash_bank_t *stellaris_info = bank->driver_priv;
stellaris_read_part_info(bank);
@@ -182,8 +190,16 @@ 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 class %i %s v%c.%i\n",
- (stellaris_info->did0>>16)&0xff, stellaris_info->target_name,
+ if (DID0_VER(stellaris_info->did0)>0)
+ {
+ device_class = (stellaris_info->did0>>16)&0xFF;
+ }
+ else
+ {
+ device_class = 0;
+ }
+ printed = snprintf(buf, buf_size, "\nLMI Stellaris information: Chip is class %i(%s) %s v%c.%i\n",
+ device_class, StellarisClassname[device_class], stellaris_info->target_name,
'A' + (stellaris_info->did0>>8)&0xFF, (stellaris_info->did0)&0xFF);
buf += printed;
buf_size -= printed;
@@ -211,7 +227,6 @@ int stellaris_info(struct flash_bank_s *bank, char *buf, int buf_size)
u32 stellaris_get_flash_status(flash_bank_t *bank)
{
- stellaris_flash_bank_t *stellaris_info = bank->driver_priv;
target_t *target = bank->target;
u32 fmc;
@@ -227,7 +242,7 @@ void stellaris_read_clock_info(flash_bank_t *bank)
stellaris_flash_bank_t *stellaris_info = bank->driver_priv;
target_t *target = bank->target;
u32 rcc, pllcfg, sysdiv, usesysdiv, bypass, oscsrc;
- unsigned long tmp, mainfreq;
+ unsigned long mainfreq;
target_read_u32(target, SCB_BASE|RCC, &rcc);
DEBUG("Stellaris RCC %x",rcc);
@@ -302,7 +317,7 @@ u32 stellaris_wait_status_busy(flash_bank_t *bank, u32 waitbits, int timeout)
int stellaris_flash_command(struct flash_bank_s *bank,u8 cmd,u16 pagen)
{
u32 fmc;
- stellaris_flash_bank_t *stellaris_info = bank->driver_priv;
+// stellaris_flash_bank_t *stellaris_info = bank->driver_priv;
target_t *target = bank->target;
fmc = FMC_WRKEY | cmd;
@@ -336,8 +351,7 @@ int stellaris_read_part_info(struct flash_bank_s *bank)
if((ver != 0) && (ver != 1))
{
WARNING("Unknown did0 version, cannot identify target");
- return ERROR_FLASH_OPERATION_FAILED;
-
+ return ERROR_FLASH_OPERATION_FAILED;
}
ver = did1 >> 28;
@@ -363,7 +377,7 @@ int stellaris_read_part_info(struct flash_bank_s *bank)
stellaris_info->did0 = did0;
stellaris_info->did1 = did1;
-
+
stellaris_info->num_lockbits = 1+stellaris_info->dc0&0xFFFF;
stellaris_info->num_pages = 2*(1+stellaris_info->dc0&0xFFFF);
stellaris_info->pagesize = 1024;
@@ -376,8 +390,6 @@ int stellaris_read_part_info(struct flash_bank_s *bank)
status = stellaris_get_flash_status(bank);
- WARNING("stellaris flash only tested for LM3S811 series");
-
return ERROR_OK;
}
@@ -387,11 +399,13 @@ int stellaris_read_part_info(struct flash_bank_s *bank)
int stellaris_erase_check(struct flash_bank_s *bank)
{
+ /*
+
stellaris_flash_bank_t *stellaris_info = bank->driver_priv;
target_t *target = bank->target;
int i;
- /* */
+ */
return ERROR_OK;
}
@@ -401,7 +415,6 @@ int stellaris_protect_check(struct flash_bank_s *bank)
u32 status;
stellaris_flash_bank_t *stellaris_info = bank->driver_priv;
- target_t *target = bank->target;
if (stellaris_info->did1 == 0)
{
@@ -511,7 +524,7 @@ int stellaris_erase(struct flash_bank_s *bank, int first, int last)
int stellaris_protect(struct flash_bank_s *bank, int set, int first, int last)
{
- u32 cmd, fmppe, flash_fmc, flash_cris;
+ u32 fmppe, flash_fmc, flash_cris;
int lockregion;
stellaris_flash_bank_t *stellaris_info = bank->driver_priv;
@@ -586,15 +599,18 @@ int stellaris_protect(struct flash_bank_s *bank, int set, int first, int last)
u8 stellaris_write_code[] =
{
-/* Call with :
+/*
+ Call with :
r0 = buffer address
r1 = destination address
r2 = bytecount (in) - endaddr (work)
+
+ Used registers:
r3 = pFLASH_CTRL_BASE
r4 = FLASHWRITECMD
r5 = #1
- r6 = scratch
- r7
+ r6 = bytes written
+ r7 = temp reg
*/
0x07,0x4B, /* ldr r3,pFLASH_CTRL_BASE */
0x08,0x4C, /* ldr r4,FLASHWRITECMD */
@@ -622,7 +638,7 @@ u8 stellaris_write_code[] =
int stellaris_write_block(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 wcount)
{
- stellaris_flash_bank_t *stellaris_info = bank->driver_priv;
+// stellaris_flash_bank_t *stellaris_info = bank->driver_priv;
target_t *target = bank->target;
u32 buffer_size = 8192;
working_area_t *source;
@@ -632,8 +648,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);
+ DEBUG("(bank=%08X buffer=%08X offset=%08X wcount=%08X)",
+ (unsigned int)bank, (unsigned int)buffer, offset, wcount);
/* flash write code */
if (target_alloc_working_area(target, sizeof(stellaris_write_code), &write_algorithm) != ERROR_OK)
@@ -647,8 +663,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);
+ DEBUG("called target_alloc_working_area(target=%08X buffer_size=%08X source=%08X)",
+ (unsigned int)target, buffer_size, (unsigned int)source);
buffer_size /= 2;
if (buffer_size <= 256)
{
@@ -720,13 +736,12 @@ int stellaris_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count
{
stellaris_flash_bank_t *stellaris_info = bank->driver_priv;
target_t *target = bank->target;
- u32 dst_min_alignment, wcount, bytes_remaining = count;
u32 address = offset;
- u32 fcr,flash_cris,flash_fmc;
+ u32 flash_cris,flash_fmc;
u32 retval;
- DEBUG("(bank=%08X buffer=%08X offset=%08X count=%08X)",
- bank, buffer, offset, count);
+ DEBUG("(bank=%08X buffer=%08X offset=%08X count=%08X)",
+ (unsigned int)bank, (unsigned int)buffer, offset, count);
if (bank->target->state != TARGET_HALTED)
{