**********************************************************************/
/* *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) {
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)
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
if (0 == strcmp("show", argv[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) {
.protect_check = sam3_protect_check,
.info = sam3_info
};
-
-
-
-/**
- * Local Variables: **
- * mode: c **
- * c-basic-offset: 4 **
- * tab-width: 4 **
- * End: **
- */