// this is "initialized" from the global const structure
struct sam3_chip_details details;
- target_t *target;
+ struct target *target;
struct sam3_cfg cfg;
struct membuf *mbuf;
static struct sam3_chip *
get_current_sam3(struct command_context_s *cmd_ctx)
{
- target_t *t;
+ struct target *t;
static struct sam3_chip *p;
t = get_current_target(cmd_ctx);
// else
// Bank1 is the boot rom
// endif
- .bank[0] = {
+// .bank[0] = {
+ {
+ {
.probed = 0,
.pChip = NULL,
.pBank = NULL,
.nsectors = 16,
.sector_size = 8192,
.page_size = 256,
- },
+ },
- .bank[1] = {
+// .bank[1] = {
+ {
.probed = 0,
.pChip = NULL,
.pBank = NULL,
.nsectors = 16,
.sector_size = 8192,
.page_size = 256,
+ },
},
},
// boot is via FLASH
// Selection is via gpnvm[2]
// endif
- .bank[0] = {
+// .bank[0] = {
+ {
+ {
.probed = 0,
.pChip = NULL,
.pBank = NULL,
.nsectors = 16,
.sector_size = 8192,
.page_size = 256,
- },
-
- .bank[1] = {
+ },
+// .bank[1] = {
+ {
.present = 0,
.probed = 0,
.bank_number = 1,
+ },
},
},
{
// endif
//
- .bank[0] = {
+// .bank[0] = {
+ {
+ {
.probed = 0,
.pChip = NULL,
.pBank = NULL,
.nsectors = 8,
.sector_size = 8192,
.page_size = 256,
- },
+ },
- .bank[1] = {
+// .bank[1] = {
+ {
.present = 0,
.probed = 0,
.bank_number = 1,
+ },
},
},
// else
// Bank1 is the boot rom
// endif
- .bank[0] = {
+ {
+ {
+// .bank[0] = {
.probed = 0,
.pChip = NULL,
.pBank = NULL,
.nsectors = 16,
.sector_size = 8192,
.page_size = 256,
- },
-
- .bank[1] = {
+ },
+// .bank[1] = {
+ {
.probed = 0,
.pChip = NULL,
.pBank = NULL,
.nsectors = 16,
.sector_size = 8192,
.page_size = 256,
+ },
},
},
// boot is via FLASH
// Selection is via gpnvm[2]
// endif
- .bank[0] = {
+ {
+// .bank[0] = {
+ {
.probed = 0,
.pChip = NULL,
.pBank = NULL,
.nsectors = 16,
.sector_size = 8192,
.page_size = 256,
- },
-
- .bank[1] = {
+ },
+// .bank[1] = {
+ {
.present = 0,
.probed = 0,
.bank_number = 1,
+ },
},
},
{
// endif
//
- .bank[0] = {
+ {
+// .bank[0] = {
+ {
.probed = 0,
.pChip = NULL,
.pBank = NULL,
.nsectors = 8,
.sector_size = 8192,
.page_size = 256,
- },
-
- .bank[1] = {
+ },
+// .bank[1] = {
+ {
.present = 0,
.probed = 0,
.bank_number = 1,
+
+ },
},
},
**********************************************************************/
/* *ATMEL* style code - from the SAM3 driver code */
-/** Get the current status of the EEFC
- *
+/**
+ * Get the current status of the EEFC and
* the value of some status bits (LOCKE, PROGE).
* @param pPrivate - info about the bank
* @param v - result goes here
return r;
}
-/** Get the result of the last executed command.
+/**
+ * Get the result of the last executed command.
* @param pPrivate - info about the bank
* @param v - result goes here
*/
return r;
}
-/** Performs the given command and wait until its completion (or an error).
- *
+/**
+ * Performs the given command and wait until its completion (or an error).
* @param pPrivate - info about the bank
* @param command - Command to perform.
* @param argument - Optional command argument.
-/** Read the unique ID.
- *
- * \param pPrivate - info about the bank
- *
+/**
+ * Read the unique ID.
+ * @param pPrivate - info about the bank
* The unique ID is stored in the 'pPrivate' structure.
*/
-
static int
FLASHD_ReadUniqueID (struct sam3_bank_private *pPrivate)
{
}
-/** Erases the entire flash.
+/**
+ * Erases the entire flash.
* @param pPrivate - the info about the bank.
*/
static int
-/** Gets current GPNVM state.
+/**
+ * Gets current GPNVM state.
* @param pPrivate - info about the bank.
* @param gpnvm - GPNVM bit index.
* @param puthere - result stored here.
- *
*/
//------------------------------------------------------------------------------
static int
-/** Clears the selected GPNVM bit.
- * @param gpnvm GPNVM index.
- *
- * Returns 0 if successful; otherwise returns an error code.
+/**
+ * Clears the selected GPNVM bit.
+ * @param pPrivate info about the bank
+ * @param gpnvm GPNVM index.
+ * @returns 0 if successful; otherwise returns an error code.
*/
static int
FLASHD_ClrGPNVM(struct sam3_bank_private *pPrivate, unsigned gpnvm)
-/** Sets the selected GPNVM bit.
- * @param gpnvm GPNVM index.
- *
+/**
+ * Sets the selected GPNVM bit.
+ * @param pPrivate info about the bank
+ * @param gpnvm GPNVM index.
*/
static int
FLASHD_SetGPNVM(struct sam3_bank_private *pPrivate, unsigned gpnvm)
}
-/** Returns a bit field (at most 64) of locked regions within a page.
- * @param pPrivate - info about the bank
- * @param v - where to store locked bits
- * \param end End address of range.
+/**
+ * Returns a bit field (at most 64) of locked regions within a page.
+ * @param pPrivate info about the bank
+ * @param v where to store locked bits
*/
-
static int
FLASHD_GetLockBits(struct sam3_bank_private *pPrivate, uint32_t *v)
{
}
-/**Unlocks all the regions in the given address range.
- *
- * \param start_sector - first sector to unlock
- * \param end_sector - last (inclusive) to unlock
+/**
+ * Unlocks all the regions in the given address range.
+ * @param pPrivate info about the bank
+ * @param start_sector first sector to unlock
+ * @param end_sector last (inclusive) to unlock
*/
static int
}
-/** Locks regions
- *
+/**
+ * Locks regions
+ * @param pPrivate - info about the bank
* @param start_sector - first sector to lock
* @param end_sector - last sector (inclusive) to lock
*/
-
-
static int
FLASHD_Lock(struct sam3_bank_private *pPrivate,
unsigned start_sector,
static void
sam3_explain_mckr(struct sam3_chip *pChip)
{
- uint32_t css, pres,fin;
- int pdiv;
- const char *cp;
+ uint32_t css, pres, fin = 0;
+ int pdiv = 0;
+ const char *cp = NULL;
css = sam3_reg_fieldname(pChip, "CSS", pChip->cfg.PMC_MCKR, 0, 2);
switch (css & 3) {
cp = "upll (*ERROR* UPLL is disabled)";
}
break;
+ default:
+ assert(0);
+ break;
}
sam3_sprintf(pChip, "%s (%3.03f Mhz)\n",
pdiv = 6;
cp = "clock/6";
break;
+ default:
+ assert(0);
+ break;
}
sam3_sprintf(pChip, "(%s)\n", cp);
fin = fin / pdiv;
#if 0
static struct sam3_chip *
-target2sam3(target_t *pTarget)
+target2sam3(struct target *pTarget)
{
struct sam3_chip *pChip;
return (struct sam3_bank_private *)(bank->driver_priv);
}
-/*
- * Given a pointer to where it goes in the structure..
- * Determine the register name, address from the all registers table.
+/**
+ * Given a pointer to where it goes in the structure,
+ * determine the register name, address from the all registers table.
*/
static const struct sam3_reg_list *
sam3_GetReg(struct sam3_chip *pChip, uint32_t *goes_here)
sam3_protect_check(struct flash_bank_s *bank)
{
int r;
- uint32_t v;
+ uint32_t v=0;
unsigned x;
struct sam3_bank_private *pPrivate;
return ERROR_OK;
}
-static int
-sam3_flash_bank_command(struct command_context_s *cmd_ctx,
- char *cmd,
- char **args,
- int argc,
- struct flash_bank_s *bank)
+FLASH_BANK_COMMAND_HANDLER(sam3_flash_bank_command)
{
struct sam3_chip *pChip;
struct sam3_bank_private *pPrivate;
uint8_t *pagebuffer;
+ // incase we bail further below, set this to null
+ pagebuffer = NULL;
+
// ignore dumb requests
if (count == 0) {
- return ERROR_OK;
+ r = ERROR_OK;
+ goto done;
}
if (bank->target->state != TARGET_HALTED) {
LOG_ERROR("Target not halted");
- return ERROR_TARGET_NOT_HALTED;
+ r = ERROR_TARGET_NOT_HALTED;
+ goto done;
}
pPrivate = get_sam3_bank_private(bank);
if (!(pPrivate->probed)) {
- return ERROR_FLASH_BANK_NOT_PROBED;
+ r = ERROR_FLASH_BANK_NOT_PROBED;
+ goto done;
}
(unsigned int)(offset),
(unsigned int)(count),
(unsigned int)(pPrivate->size_bytes));
- return ERROR_FAIL;
+ r = ERROR_FAIL;
+ goto done;
}
- pagebuffer = alloca(pPrivate->page_size);
+ pagebuffer = malloc(pPrivate->page_size);
+ if( !pagebuffer ){
+ LOG_ERROR("No memory for %d Byte page buffer", (int)(pPrivate->page_size));
+ r = ERROR_FAIL;
+ goto done;
+ }
// what page do we start & end in?
page_cur = offset / pPrivate->page_size;
LOG_DEBUG("Special case, all in one page");
r = sam3_page_read(pPrivate, page_cur, pagebuffer);
if (r != ERROR_OK) {
- return r;
+ goto done;
}
page_offset = (offset & (pPrivate->page_size-1));
r = sam3_page_write(pPrivate, page_cur, pagebuffer);
if (r != ERROR_OK) {
- return r;
+ goto done;
}
- return ERROR_OK;
+ r = ERROR_OK;
+ goto done;
}
// non-aligned start
// read the partial
r = sam3_page_read(pPrivate, page_cur, pagebuffer);
if (r != ERROR_OK) {
- return r;
+ goto done;
}
// over-write with new data
r = sam3_page_write(pPrivate, page_cur, pagebuffer);
if (r != ERROR_OK) {
- return r;
+ goto done;
}
count -= n;
(count >= pPrivate->page_size)) {
r = sam3_page_write(pPrivate, page_cur, buffer);
if (r != ERROR_OK) {
- return r;
+ goto done;
}
count -= pPrivate->page_size;
buffer += pPrivate->page_size;
// we have a partial page
r = sam3_page_read(pPrivate, page_cur, pagebuffer);
if (r != ERROR_OK) {
- return r;
+ goto done;
}
// data goes at start
memcpy(pagebuffer, buffer, count);
r = sam3_page_write(pPrivate, page_cur, pagebuffer);
if (r != ERROR_OK) {
- return r;
+ goto done;
}
buffer += count;
count -= count;
}
LOG_DEBUG("Done!");
- return ERROR_OK;
+ r = ERROR_OK;
+ done:
+ if( pagebuffer ){
+ free(pagebuffer);
+ }
+ return r;
}
-static int
-sam3_handle_info_command(struct command_context_s *cmd_ctx, char *cmd, char **argv, int argc)
+COMMAND_HANDLER(sam3_handle_info_command)
{
struct sam3_chip *pChip;
void *vp;
return ERROR_OK;
}
-static int
-sam3_handle_gpnvm_command(struct command_context_s *cmd_ctx, char *cmd, char **argv, int argc)
+COMMAND_HANDLER(sam3_handle_gpnvm_command)
{
unsigned x,v;
- uint32_t v32;
int r,who;
struct sam3_chip *pChip;
who = -1;
break;
case 2:
- if ((0 == strcmp(argv[0], "show")) && (0 == strcmp(argv[1], "all"))) {
+ if ((0 == strcmp(args[0], "show")) && (0 == strcmp(args[1], "all"))) {
who = -1;
} else {
- r = parse_u32(argv[1], &v32);
- if (r != ERROR_OK) {
- command_print(cmd_ctx, "Not a number: %s", argv[1]);
- return r;
- }
+ uint32_t v32;
+ COMMAND_PARSE_NUMBER(u32, args[1], v32);
who = v32;
}
break;
}
- if (0 == strcmp("show", argv[0])) {
+ if (0 == strcmp("show", args[0])) {
if (who == -1) {
showall:
+ r = ERROR_OK;
for (x = 0 ; x < pChip->details.n_gpnvms ; x++) {
r = FLASHD_GetGPNVM(&(pChip->details.bank[0]), x, &v);
if (r != ERROR_OK) {
return ERROR_COMMAND_SYNTAX_ERROR;
}
- if (0 == strcmp("set", argv[0])) {
+ if (0 == strcmp("set", args[0])) {
r = FLASHD_SetGPNVM(&(pChip->details.bank[0]), who);
- } else if ((0 == strcmp("clr", argv[0])) ||
- (0 == strcmp("clear", argv[0]))) { // quietly accept both
+ } else if ((0 == strcmp("clr", args[0])) ||
+ (0 == strcmp("clear", args[0]))) { // quietly accept both
r = FLASHD_ClrGPNVM(&(pChip->details.bank[0]), who);
} else {
- command_print(cmd_ctx, "Unkown command: %s", argv[0]);
+ command_print(cmd_ctx, "Unkown command: %s", args[0]);
r = ERROR_COMMAND_SYNTAX_ERROR;
}
return r;
}
-static int
-sam3_handle_slowclk_command(struct command_context_s *cmd_ctx, char *cmd, char **argv, int argc)
+COMMAND_HANDLER(sam3_handle_slowclk_command)
{
- uint32_t v;
- int r;
-
struct sam3_chip *pChip;
pChip = get_current_sam3(cmd_ctx);
// show
break;
case 1:
+ {
// set
- r = parse_u32(argv[0], &v);
+ uint32_t v;
+ COMMAND_PARSE_NUMBER(u32, args[0], v);
if (v > 200000) {
// absurd slow clock of 200Khz?
command_print(cmd_ctx,"Absurd/illegal slow clock freq: %d\n", (int)(v));
}
pChip->cfg.slow_freq = v;
break;
-
+ }
default:
// error
command_print(cmd_ctx,"Too many parameters");
return ERROR_OK;
}
-
-flash_driver_t at91sam3_flash =
-{
- .name = "at91sam3",
- .register_commands = sam3_register_commands,
-
- .flash_bank_command = sam3_flash_bank_command,
- .erase = sam3_erase,
- .protect = sam3_protect,
- .write = sam3_write,
- .probe = sam3_probe,
- .auto_probe = sam3_auto_probe,
- .erase_check = sam3_erase_check,
- .protect_check = sam3_protect_check,
- .info = sam3_info
-};
-
-
-
-/**
- * Local Variables: **
- * mode: c **
- * c-basic-offset: 4 **
- * tab-width: 4 **
- * End: **
- */
+struct flash_driver at91sam3_flash = {
+ .name = "at91sam3",
+ .register_commands = &sam3_register_commands,
+ .flash_bank_command = &sam3_flash_bank_command,
+ .erase = &sam3_erase,
+ .protect = &sam3_protect,
+ .write = &sam3_write,
+ .probe = &sam3_probe,
+ .auto_probe = &sam3_auto_probe,
+ .erase_check = &sam3_erase_check,
+ .protect_check = &sam3_protect_check,
+ .info = &sam3_info,
+ };