X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Fflash%2Fnor%2Fat91sam3.c;h=c8c4afe1fb6650b1195f7a80da2bd1477d4fb9e0;hb=e2315ccffd31757785130c3bf549a87d9be1689a;hp=fdae96457d44ef51ff1c2e2431ba00eaa3926bc8;hpb=f132fcf636361009b4125827351ef01556d49b31;p=openocd.git
diff --git a/src/flash/nor/at91sam3.c b/src/flash/nor/at91sam3.c
index fdae96457d..c8c4afe1fb 100644
--- a/src/flash/nor/at91sam3.c
+++ b/src/flash/nor/at91sam3.c
@@ -8,19 +8,17 @@
* Copyright (C) 2011 by Olivier Schonken (at91sam3x* support) * *
* and Jim Norris *
* This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General public License as published by *
+ * it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS for A PARTICULAR PURPOSE. See the *
- * GNU General public License for more details. *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
* *
- * You should have received a copy of the GNU General public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program. If not, see . *
****************************************************************************/
/* Some of the the lower level code was based on code supplied by
@@ -111,7 +109,7 @@
#define offset_EFC_FSR 8
#define offset_EFC_FRR 12
-extern struct flash_driver at91sam3_flash;
+extern const struct flash_driver at91sam3_flash;
static float _tomhz(uint32_t freq_hz)
{
@@ -189,7 +187,7 @@ struct sam3_cfg {
*/
struct sam3_bank_private {
- int probed;
+ bool probed;
/* DANGER: THERE ARE DRAGONS HERE.. */
/* NOTE: If you add more 'ghost' pointers */
/* be aware that you must *manually* update */
@@ -235,7 +233,7 @@ struct sam3_chip_details {
struct sam3_chip {
struct sam3_chip *next;
- int probed;
+ bool probed;
/* this is "initialized" from the global const structure */
struct sam3_chip_details details;
@@ -251,14 +249,14 @@ struct sam3_reg_list {
static struct sam3_chip *all_sam3_chips;
-static struct sam3_chip *get_current_sam3(struct command_context *cmd_ctx)
+static struct sam3_chip *get_current_sam3(struct command_invocation *cmd)
{
struct target *t;
static struct sam3_chip *p;
- t = get_current_target(cmd_ctx);
+ t = get_current_target(cmd->ctx);
if (!t) {
- command_print(cmd_ctx, "No current target?");
+ command_print(cmd, "No current target?");
return NULL;
}
@@ -266,7 +264,7 @@ static struct sam3_chip *get_current_sam3(struct command_context *cmd_ctx)
if (!p) {
/* this should not happen */
/* the command is not registered until the chip is created? */
- command_print(cmd_ctx, "No SAM3 chips exist?");
+ command_print(cmd, "No SAM3 chips exist?");
return NULL;
}
@@ -275,7 +273,7 @@ static struct sam3_chip *get_current_sam3(struct command_context *cmd_ctx)
return p;
p = p->next;
}
- command_print(cmd_ctx, "Cannot find SAM3 chip?");
+ command_print(cmd, "Cannot find SAM3 chip?");
return NULL;
}
@@ -308,7 +306,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
/* .bank[0] = { */
{
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 0,
@@ -324,7 +322,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
/* .bank[1] = { */
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 1,
@@ -359,7 +357,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
/* .bank[0] = { */
{
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 0,
@@ -375,7 +373,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
/* .bank[1] = { */
{
.present = 0,
- .probed = 0,
+ .probed = false,
.bank_number = 1,
},
},
@@ -401,7 +399,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
/* .bank[0] = { */
{
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 0,
@@ -418,7 +416,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
/* .bank[1] = { */
{
.present = 0,
- .probed = 0,
+ .probed = false,
.bank_number = 1,
},
},
@@ -450,7 +448,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
{
{
/* .bank[0] = { */
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 0,
@@ -465,7 +463,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
},
/* .bank[1] = { */
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 1,
@@ -500,7 +498,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
{
/* .bank[0] = { */
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 0,
@@ -516,7 +514,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
/* .bank[1] = { */
{
.present = 0,
- .probed = 0,
+ .probed = false,
.bank_number = 1,
},
},
@@ -542,7 +540,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
{
/* .bank[0] = { */
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 0,
@@ -558,7 +556,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
/* .bank[1] = { */
{
.present = 0,
- .probed = 0,
+ .probed = false,
.bank_number = 1,
},
@@ -580,7 +578,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
{
/* .bank[0] = { */
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 0,
@@ -596,7 +594,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
/* .bank[1] = { */
{
.present = 0,
- .probed = 0,
+ .probed = false,
.bank_number = 1,
},
@@ -613,7 +611,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
{
/* .bank[0] = { */
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 0,
@@ -629,7 +627,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
/* .bank[1] = { */
{
.present = 0,
- .probed = 0,
+ .probed = false,
.bank_number = 1,
},
@@ -645,7 +643,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
{
/* .bank[0] = { */
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 0,
@@ -661,7 +659,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
/* .bank[1] = { */
{
.present = 0,
- .probed = 0,
+ .probed = false,
.bank_number = 1,
},
@@ -677,7 +675,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
{
/* .bank[0] = { */
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 0,
@@ -693,7 +691,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
/* .bank[1] = { */
{
.present = 0,
- .probed = 0,
+ .probed = false,
.bank_number = 1,
},
@@ -709,7 +707,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
{
/* .bank[0] = { */
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 0,
@@ -725,7 +723,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
/* .bank[1] = { */
{
.present = 0,
- .probed = 0,
+ .probed = false,
.bank_number = 1,
},
@@ -741,7 +739,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
{
/* .bank[0] = { */
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 0,
@@ -756,7 +754,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
},
/* .bank[1] = { */
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 1,
@@ -781,7 +779,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
{
/* .bank[0] = { */
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 0,
@@ -796,7 +794,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
},
/* .bank[1] = { */
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 1,
@@ -821,7 +819,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
{
/* .bank[0] = { */
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 0,
@@ -836,7 +834,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
},
/* .bank[1] = { */
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 1,
@@ -861,7 +859,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
{
/* .bank[0] = { */
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 0,
@@ -877,7 +875,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
/* .bank[1] = { */
{
.present = 0,
- .probed = 0,
+ .probed = false,
.bank_number = 1,
},
@@ -893,7 +891,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
{
/* .bank[0] = { */
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 0,
@@ -909,7 +907,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
/* .bank[1] = { */
{
.present = 0,
- .probed = 0,
+ .probed = false,
.bank_number = 1,
},
@@ -925,7 +923,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
{
/* .bank[0] = { */
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 0,
@@ -941,7 +939,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
/* .bank[1] = { */
{
.present = 0,
- .probed = 0,
+ .probed = false,
.bank_number = 1,
},
@@ -957,7 +955,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
{
/* .bank[0] = { */
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 0,
@@ -973,7 +971,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
/* .bank[1] = { */
{
.present = 0,
- .probed = 0,
+ .probed = false,
.bank_number = 1,
},
@@ -989,7 +987,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
{
/* .bank[0] = { */
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 0,
@@ -1005,7 +1003,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
/* .bank[1] = { */
{
.present = 0,
- .probed = 0,
+ .probed = false,
.bank_number = 1,
},
@@ -1021,7 +1019,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
{
/* .bank[0] = { */
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 0,
@@ -1037,7 +1035,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
/* .bank[1] = { */
{
.present = 0,
- .probed = 0,
+ .probed = false,
.bank_number = 1,
},
@@ -1053,7 +1051,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
{
/* .bank[0] = { */
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 0,
@@ -1069,7 +1067,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
/* .bank[1] = { */
{
.present = 0,
- .probed = 0,
+ .probed = false,
.bank_number = 1,
},
@@ -1103,7 +1101,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
/* .bank[0] = { */
{
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 0,
@@ -1120,7 +1118,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
/* .bank[1] = { */
{
.present = 0,
- .probed = 0,
+ .probed = false,
.bank_number = 1,
},
},
@@ -1152,7 +1150,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
/* .bank[0] = { */
{
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 0,
@@ -1169,7 +1167,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
/* .bank[1] = { */
{
.present = 0,
- .probed = 0,
+ .probed = false,
.bank_number = 1,
},
},
@@ -1201,7 +1199,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
/* .bank[0] = { */
{
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 0,
@@ -1218,7 +1216,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
/* .bank[1] = { */
{
.present = 0,
- .probed = 0,
+ .probed = false,
.bank_number = 1,
},
},
@@ -1250,7 +1248,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
/* .bank[0] = { */
{
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 0,
@@ -1267,7 +1265,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
/* .bank[1] = { */
{
.present = 0,
- .probed = 0,
+ .probed = false,
.bank_number = 1,
},
},
@@ -1299,7 +1297,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
/* .bank[0] = { */
{
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 0,
@@ -1316,7 +1314,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
/* .bank[1] = { */
{
.present = 0,
- .probed = 0,
+ .probed = false,
.bank_number = 1,
},
},
@@ -1348,7 +1346,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
/* .bank[0] = { */
{
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 0,
@@ -1365,7 +1363,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
/* .bank[1] = { */
{
.present = 0,
- .probed = 0,
+ .probed = false,
.bank_number = 1,
},
},
@@ -1397,7 +1395,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
/* .bank[0] = { */
{
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 0,
@@ -1414,7 +1412,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
/* .bank[1] = { */
{
.present = 0,
- .probed = 0,
+ .probed = false,
.bank_number = 1,
},
},
@@ -1446,7 +1444,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
/* .bank[0] = { */
{
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 0,
@@ -1463,7 +1461,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
/* .bank[1] = { */
{
.present = 0,
- .probed = 0,
+ .probed = false,
.bank_number = 1,
},
},
@@ -1495,7 +1493,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
/* .bank[0] = { */
{
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 0,
@@ -1512,12 +1510,149 @@ static const struct sam3_chip_details all_sam3_details[] = {
/* .bank[1] = { */
{
.present = 0,
- .probed = 0,
+ .probed = false,
.bank_number = 1,
},
},
},
+ {
+ .chipid_cidr = 0x29480360,
+ .name = "at91sam3n0b",
+ .total_flash_size = 32 * 1024,
+ .total_sram_size = 8 * 1024,
+ .n_gpnvms = 3,
+ .n_banks = 1,
+
+/* .bank[0] = { */
+ {
+ {
+ .probed = false,
+ .pChip = NULL,
+ .pBank = NULL,
+ .bank_number = 0,
+ .base_address = FLASH_BANK_BASE_N,
+ .controller_address = 0x400e0A00,
+ .flash_wait_states = 6, /* workaround silicon bug */
+ .present = 1,
+ .size_bytes = 32 * 1024,
+ .nsectors = 2,
+ .sector_size = 16384,
+ .page_size = 256,
+ },
+
+/* .bank[1] = { */
+ {
+ .present = 0,
+ .probed = false,
+ .bank_number = 1,
+ },
+ },
+ },
+
+ {
+ .chipid_cidr = 0x29380360,
+ .name = "at91sam3n0a",
+ .total_flash_size = 32 * 1024,
+ .total_sram_size = 8 * 1024,
+ .n_gpnvms = 3,
+ .n_banks = 1,
+
+/* .bank[0] = { */
+ {
+ {
+ .probed = false,
+ .pChip = NULL,
+ .pBank = NULL,
+ .bank_number = 0,
+ .base_address = FLASH_BANK_BASE_N,
+ .controller_address = 0x400e0A00,
+ .flash_wait_states = 6, /* workaround silicon bug */
+ .present = 1,
+ .size_bytes = 32 * 1024,
+ .nsectors = 2,
+ .sector_size = 16384,
+ .page_size = 256,
+ },
+
+/* .bank[1] = { */
+ {
+ .present = 0,
+ .probed = false,
+ .bank_number = 1,
+ },
+ },
+ },
+
+ {
+ .chipid_cidr = 0x29450260,
+ .name = "at91sam3n00b",
+ .total_flash_size = 16 * 1024,
+ .total_sram_size = 4 * 1024,
+ .n_gpnvms = 3,
+ .n_banks = 1,
+
+/* .bank[0] = { */
+ {
+ {
+ .probed = false,
+ .pChip = NULL,
+ .pBank = NULL,
+ .bank_number = 0,
+ .base_address = FLASH_BANK_BASE_N,
+ .controller_address = 0x400e0A00,
+ .flash_wait_states = 6, /* workaround silicon bug */
+ .present = 1,
+ .size_bytes = 16 * 1024,
+ .nsectors = 1,
+ .sector_size = 16384,
+ .page_size = 256,
+ },
+
+/* .bank[1] = { */
+ {
+ .present = 0,
+ .probed = false,
+ .bank_number = 1,
+ },
+ },
+ },
+
+ {
+ .chipid_cidr = 0x29350260,
+ .name = "at91sam3n00a",
+ .total_flash_size = 16 * 1024,
+ .total_sram_size = 4 * 1024,
+ .n_gpnvms = 3,
+ .n_banks = 1,
+
+/* .bank[0] = { */
+ {
+ {
+ .probed = false,
+ .pChip = NULL,
+ .pBank = NULL,
+ .bank_number = 0,
+ .base_address = FLASH_BANK_BASE_N,
+ .controller_address = 0x400e0A00,
+ .flash_wait_states = 6, /* workaround silicon bug */
+ .present = 1,
+ .size_bytes = 16 * 1024,
+ .nsectors = 1,
+ .sector_size = 16384,
+ .page_size = 256,
+ },
+
+/* .bank[1] = { */
+ {
+ .present = 0,
+ .probed = false,
+ .bank_number = 1,
+ },
+ },
+ },
+
+
/* Start at91sam3a series*/
/* System boots at address 0x0 */
/* gpnvm[1] = selects boot code */
@@ -1545,7 +1680,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
{
/* .bank[0] = { */
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 0,
@@ -1560,7 +1695,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
},
/* .bank[1] = { */
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 1,
@@ -1586,7 +1721,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
{
/* .bank[0] = { */
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 0,
@@ -1601,7 +1736,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
},
/* .bank[1] = { */
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 1,
@@ -1645,7 +1780,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
{
/* .bank[0] = { */
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 0,
@@ -1660,7 +1795,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
},
/* .bank[1] = { */
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 1,
@@ -1687,7 +1822,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
{
/* .bank[0] = { */
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 0,
@@ -1702,7 +1837,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
},
/* .bank[1] = { */
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 1,
@@ -1728,7 +1863,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
{
/* .bank[0] = { */
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 0,
@@ -1743,7 +1878,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
},
/* .bank[1] = { */
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 1,
@@ -1769,7 +1904,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
{
/* .bank[0] = { */
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 0,
@@ -1784,11 +1919,11 @@ static const struct sam3_chip_details all_sam3_details[] = {
},
/* .bank[1] = { */
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 1,
- .base_address = FLASH_BANK1_BASE_512K_AX ,
+ .base_address = FLASH_BANK1_BASE_512K_AX,
.controller_address = 0x400e0c00,
.flash_wait_states = 6, /* workaround silicon bug */
.present = 1,
@@ -1810,7 +1945,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
{
/* .bank[0] = { */
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 0,
@@ -1825,7 +1960,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
},
/* .bank[1] = { */
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 1,
@@ -1851,7 +1986,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
{
/* .bank[0] = { */
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 0,
@@ -1866,7 +2001,7 @@ static const struct sam3_chip_details all_sam3_details[] = {
},
/* .bank[1] = { */
{
- .probed = 0,
+ .probed = false,
.pChip = NULL,
.pBank = NULL,
.bank_number = 1,
@@ -2040,7 +2175,7 @@ static int EFC_PerformCommand(struct sam3_bank_private *pPrivate,
int r;
uint32_t v;
- long long ms_now, ms_end;
+ int64_t ms_now, ms_end;
/* default */
if (status)
@@ -2345,7 +2480,7 @@ static const char *const eproc_names[] = {
_unknown, /* 0 */
"arm946es", /* 1 */
"arm7tdmi", /* 2 */
- "cortex-m3", /* 3 */
+ "Cortex-M3", /* 3 */
"arm920t", /* 4 */
"arm926ejs", /* 5 */
_unknown, /* 6 */
@@ -2731,7 +2866,7 @@ static const struct sam3_reg_list sam3_all_regs[] = {
static struct sam3_bank_private *get_sam3_bank_private(struct flash_bank *bank)
{
- return (struct sam3_bank_private *)(bank->driver_priv);
+ return bank->driver_priv;
}
/**
@@ -2856,28 +2991,6 @@ static int sam3_GetInfo(struct sam3_chip *pChip)
return ERROR_OK;
}
-static int sam3_erase_check(struct flash_bank *bank)
-{
- int x;
-
- LOG_DEBUG("Here");
- if (bank->target->state != TARGET_HALTED) {
- LOG_ERROR("Target not halted");
- return ERROR_TARGET_NOT_HALTED;
- }
- if (0 == bank->num_sectors) {
- LOG_ERROR("Target: not supported/not probed");
- return ERROR_FAIL;
- }
-
- LOG_INFO("sam3 - supports auto-erase, erase_check ignored");
- for (x = 0; x < bank->num_sectors; x++)
- bank->sectors[x].is_erased = 1;
-
- LOG_DEBUG("Done");
- return ERROR_OK;
-}
-
static int sam3_protect_check(struct flash_bank *bank)
{
int r;
@@ -2938,7 +3051,7 @@ FLASH_BANK_COMMAND_HANDLER(sam3_flash_bank_command)
pChip->target = bank->target;
/* assumption is this runs at 32khz */
pChip->cfg.slow_freq = 32768;
- pChip->probed = 0;
+ pChip->probed = false;
}
switch (bank->base) {
@@ -2955,7 +3068,6 @@ FLASH_BANK_COMMAND_HANDLER(sam3_flash_bank_command)
((unsigned int)(FLASH_BANK1_BASE_256K_AX)),
((unsigned int)(FLASH_BANK1_BASE_512K_AX)));
return ERROR_FAIL;
- break;
/* at91sam3s and at91sam3n series only has bank 0*/
/* at91sam3u and at91sam3ax series has the same address for bank 0*/
@@ -2982,6 +3094,22 @@ FLASH_BANK_COMMAND_HANDLER(sam3_flash_bank_command)
return ERROR_OK;
}
+/**
+ * Remove all chips from the internal list without distingushing which one
+ * is owned by this bank. This simplification works only for one shot
+ * deallocation like current flash_free_all_banks()
+ */
+void sam3_free_driver_priv(struct flash_bank *bank)
+{
+ struct sam3_chip *chip = all_sam3_chips;
+ while (chip) {
+ struct sam3_chip *next = chip->next;
+ free(chip);
+ chip = next;
+ }
+ all_sam3_chips = NULL;
+}
+
static int sam3_GetDetails(struct sam3_bank_private *pPrivate)
{
const struct sam3_chip_details *pDetails;
@@ -2993,7 +3121,7 @@ static int sam3_GetDetails(struct sam3_bank_private *pPrivate)
pDetails = all_sam3_details;
while (pDetails->name) {
/* Compare cidr without version bits */
- if (pDetails->chipid_cidr == (pPrivate->pChip->cfg.CHIPID_CIDR & 0xFFFFFFE0))
+ if (((pDetails->chipid_cidr ^ pPrivate->pChip->cfg.CHIPID_CIDR) & 0xFFFFFFE0) == 0)
break;
else
pDetails++;
@@ -3043,12 +3171,11 @@ static int sam3_GetDetails(struct sam3_bank_private *pPrivate)
static int _sam3_probe(struct flash_bank *bank, int noise)
{
- unsigned x;
int r;
struct sam3_bank_private *pPrivate;
- LOG_DEBUG("Begin: Bank: %d, Noise: %d", bank->bank_number, noise);
+ LOG_DEBUG("Begin: Bank: %u, Noise: %d", bank->bank_number, noise);
if (bank->target->state != TARGET_HALTED) {
LOG_ERROR("Target not halted");
return ERROR_TARGET_NOT_HALTED;
@@ -3073,7 +3200,7 @@ static int _sam3_probe(struct flash_bank *bank, int noise)
return r;
/* update the flash bank size */
- for (x = 0; x < SAM3_MAX_FLASH_BANKS; x++) {
+ for (unsigned int x = 0; x < SAM3_MAX_FLASH_BANKS; x++) {
if (bank->base == pPrivate->pChip->details.bank[x].base_address) {
bank->size = pPrivate->pChip->details.bank[x].size_bytes;
break;
@@ -3088,7 +3215,7 @@ static int _sam3_probe(struct flash_bank *bank, int noise)
}
bank->num_sectors = pPrivate->nsectors;
- for (x = 0; ((int)(x)) < bank->num_sectors; x++) {
+ for (unsigned int x = 0; x < bank->num_sectors; x++) {
bank->sectors[x].size = pPrivate->sector_size;
bank->sectors[x].offset = x * (pPrivate->sector_size);
/* mark as unknown */
@@ -3097,7 +3224,7 @@ static int _sam3_probe(struct flash_bank *bank, int noise)
}
}
- pPrivate->probed = 1;
+ pPrivate->probed = true;
r = sam3_protect_check(bank);
if (r != ERROR_OK)
@@ -3124,7 +3251,8 @@ static int sam3_auto_probe(struct flash_bank *bank)
return _sam3_probe(bank, 0);
}
-static int sam3_erase(struct flash_bank *bank, int first, int last)
+static int sam3_erase(struct flash_bank *bank, unsigned int first,
+ unsigned int last)
{
struct sam3_bank_private *pPrivate;
int r;
@@ -3145,7 +3273,7 @@ static int sam3_erase(struct flash_bank *bank, int first, int last)
if (!(pPrivate->probed))
return ERROR_FLASH_BANK_NOT_PROBED;
- if ((first == 0) && ((last + 1) == ((int)(pPrivate->nsectors)))) {
+ if ((first == 0) && ((last + 1) == pPrivate->nsectors)) {
/* whole chip */
LOG_DEBUG("Here");
return FLASHD_EraseEntireBank(pPrivate);
@@ -3154,7 +3282,8 @@ static int sam3_erase(struct flash_bank *bank, int first, int last)
return ERROR_OK;
}
-static int sam3_protect(struct flash_bank *bank, int set, int first, int last)
+static int sam3_protect(struct flash_bank *bank, int set, unsigned int first,
+ unsigned int last)
{
struct sam3_bank_private *pPrivate;
int r;
@@ -3170,9 +3299,9 @@ static int sam3_protect(struct flash_bank *bank, int set, int first, int last)
return ERROR_FLASH_BANK_NOT_PROBED;
if (set)
- r = FLASHD_Lock(pPrivate, (unsigned)(first), (unsigned)(last));
+ r = FLASHD_Lock(pPrivate, first, last);
else
- r = FLASHD_Unlock(pPrivate, (unsigned)(first), (unsigned)(last));
+ r = FLASHD_Unlock(pPrivate, first, last);
LOG_DEBUG("End: r=%d", r);
return r;
@@ -3198,94 +3327,7 @@ static int sam3_page_read(struct sam3_bank_private *pPrivate, unsigned pagenum,
return r;
}
-/* The code below is basically this: */
-/* compiled with */
-/* arm-none-eabi-gcc -mthumb -mcpu = cortex-m3 -O9 -S ./foobar.c -o foobar.s */
-/* */
-/* Only the *CPU* can write to the flash buffer. */
-/* the DAP cannot... so - we download this 28byte thing */
-/* Run the algorithm - (below) */
-/* to program the device */
-/* */
-/* ======================================== */
-/* #include */
-/* */
-/* struct foo { */
-/* uint32_t *dst; */
-/* const uint32_t *src; */
-/* int n; */
-/* volatile uint32_t *base; */
-/* uint32_t cmd; */
-/* }; */
-/* */
-/* */
-/* uint32_t sam3_function(struct foo *p) */
-/* { */
-/* volatile uint32_t *v; */
-/* uint32_t *d; */
-/* const uint32_t *s; */
-/* int n; */
-/* uint32_t r; */
-/* */
-/* d = p->dst; */
-/* s = p->src; */
-/* n = p->n; */
-/* */
-/* do { */
-/* *d++ = *s++; */
-/* } while (--n) */
-/* ; */
-/* */
-/* v = p->base; */
-/* */
-/* v[ 1 ] = p->cmd; */
-/* do { */
-/* r = v[8/4]; */
-/* } while (!(r&1)) */
-/* ; */
-/* return r; */
-/* } */
-/* ======================================== */
-
-static const uint8_t
- sam3_page_write_opcodes[] = {
- /* 24 0000 0446 mov r4, r0 */
- 0x04, 0x46,
- /* 25 0002 6168 ldr r1, [r4, #4] */
- 0x61, 0x68,
- /* 26 0004 0068 ldr r0, [r0, #0] */
- 0x00, 0x68,
- /* 27 0006 A268 ldr r2, [r4, #8] */
- 0xa2, 0x68,
- /* 28 @ lr needed for prologue */
- /* 29 .L2: */
- /* 30 0008 51F8043B ldr r3, [r1], #4 */
- 0x51, 0xf8, 0x04, 0x3b,
- /* 31 000c 12F1FF32 adds r2, r2, #-1 */
- 0x12, 0xf1, 0xff, 0x32,
- /* 32 0010 40F8043B str r3, [r0], #4 */
- 0x40, 0xf8, 0x04, 0x3b,
- /* 33 0014 F8D1 bne .L2 */
- 0xf8, 0xd1,
- /* 34 0016 E268 ldr r2, [r4, #12] */
- 0xe2, 0x68,
- /* 35 0018 2369 ldr r3, [r4, #16] */
- 0x23, 0x69,
- /* 36 001a 5360 str r3, [r2, #4] */
- 0x53, 0x60,
- /* 37 001c 0832 adds r2, r2, #8 */
- 0x08, 0x32,
- /* 38 .L4: */
- /* 39 001e 1068 ldr r0, [r2, #0] */
- 0x10, 0x68,
- /* 40 0020 10F0010F tst r0, #1 */
- 0x10, 0xf0, 0x01, 0x0f,
- /* 41 0024 FBD0 beq .L4 */
- 0xfb, 0xd0,
- 0x00, 0xBE /* bkpt #0 */
-};
-
-static int sam3_page_write(struct sam3_bank_private *pPrivate, unsigned pagenum, uint8_t *buf)
+static int sam3_page_write(struct sam3_bank_private *pPrivate, unsigned pagenum, const uint8_t *buf)
{
uint32_t adr;
uint32_t status;
@@ -3344,7 +3386,7 @@ static int sam3_page_write(struct sam3_bank_private *pPrivate, unsigned pagenum,
}
static int sam3_write(struct flash_bank *bank,
- uint8_t *buffer,
+ const uint8_t *buffer,
uint32_t offset,
uint32_t count)
{
@@ -3496,7 +3538,7 @@ done:
COMMAND_HANDLER(sam3_handle_info_command)
{
struct sam3_chip *pChip;
- pChip = get_current_sam3(CMD_CTX);
+ pChip = get_current_sam3(CMD);
if (!pChip)
return ERROR_OK;
@@ -3507,7 +3549,7 @@ COMMAND_HANDLER(sam3_handle_info_command)
if (pChip->details.bank[0].pBank == NULL) {
x = 0;
need_define:
- command_print(CMD_CTX,
+ command_print(CMD,
"Please define bank %d via command: flash bank %s ... ",
x,
at91sam3_flash.name);
@@ -3556,7 +3598,7 @@ COMMAND_HANDLER(sam3_handle_gpnvm_command)
int r, who;
struct sam3_chip *pChip;
- pChip = get_current_sam3(CMD_CTX);
+ pChip = get_current_sam3(CMD);
if (!pChip)
return ERROR_OK;
@@ -3566,7 +3608,7 @@ COMMAND_HANDLER(sam3_handle_gpnvm_command)
}
if (pChip->details.bank[0].pBank == NULL) {
- command_print(CMD_CTX, "Bank0 must be defined first via: flash bank %s ...",
+ command_print(CMD, "Bank0 must be defined first via: flash bank %s ...",
at91sam3_flash.name);
return ERROR_FAIL;
}
@@ -3579,10 +3621,8 @@ COMMAND_HANDLER(sam3_handle_gpnvm_command)
switch (CMD_ARGC) {
default:
return ERROR_COMMAND_SYNTAX_ERROR;
- break;
case 0:
goto showall;
- break;
case 1:
who = -1;
break;
@@ -3605,22 +3645,23 @@ showall:
r = FLASHD_GetGPNVM(&(pChip->details.bank[0]), x, &v);
if (r != ERROR_OK)
break;
- command_print(CMD_CTX, "sam3-gpnvm%u: %u", x, v);
+ command_print(CMD, "sam3-gpnvm%u: %u", x, v);
}
return r;
}
if ((who >= 0) && (((unsigned)(who)) < pChip->details.n_gpnvms)) {
r = FLASHD_GetGPNVM(&(pChip->details.bank[0]), who, &v);
- command_print(CMD_CTX, "sam3-gpnvm%u: %u", who, v);
+ if (r == ERROR_OK)
+ command_print(CMD, "sam3-gpnvm%u: %u", who, v);
return r;
} else {
- command_print(CMD_CTX, "sam3-gpnvm invalid GPNVM: %u", who);
+ command_print(CMD, "sam3-gpnvm invalid GPNVM: %u", who);
return ERROR_COMMAND_SYNTAX_ERROR;
}
}
if (who == -1) {
- command_print(CMD_CTX, "Missing GPNVM number");
+ command_print(CMD, "Missing GPNVM number");
return ERROR_COMMAND_SYNTAX_ERROR;
}
@@ -3630,7 +3671,7 @@ showall:
(0 == strcmp("clear", CMD_ARGV[0]))) /* quietly accept both */
r = FLASHD_ClrGPNVM(&(pChip->details.bank[0]), who);
else {
- command_print(CMD_CTX, "Unknown command: %s", CMD_ARGV[0]);
+ command_print(CMD, "Unknown command: %s", CMD_ARGV[0]);
r = ERROR_COMMAND_SYNTAX_ERROR;
}
return r;
@@ -3640,7 +3681,7 @@ COMMAND_HANDLER(sam3_handle_slowclk_command)
{
struct sam3_chip *pChip;
- pChip = get_current_sam3(CMD_CTX);
+ pChip = get_current_sam3(CMD);
if (!pChip)
return ERROR_OK;
@@ -3655,7 +3696,7 @@ COMMAND_HANDLER(sam3_handle_slowclk_command)
COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], v);
if (v > 200000) {
/* absurd slow clock of 200Khz? */
- command_print(CMD_CTX, "Absurd/illegal slow clock freq: %d\n", (int)(v));
+ command_print(CMD, "Absurd/illegal slow clock freq: %d\n", (int)(v));
return ERROR_COMMAND_SYNTAX_ERROR;
}
pChip->cfg.slow_freq = v;
@@ -3663,11 +3704,10 @@ COMMAND_HANDLER(sam3_handle_slowclk_command)
}
default:
/* error */
- command_print(CMD_CTX, "Too many parameters");
+ command_print(CMD, "Too many parameters");
return ERROR_COMMAND_SYNTAX_ERROR;
- break;
}
- command_print(CMD_CTX, "Slowclk freq: %d.%03dkhz",
+ command_print(CMD, "Slowclk freq: %d.%03dkhz",
(int)(pChip->cfg.slow_freq / 1000),
(int)(pChip->cfg.slow_freq % 1000));
return ERROR_OK;
@@ -3687,8 +3727,9 @@ static const struct command_registration at91sam3_exec_command_handlers[] = {
.name = "info",
.handler = sam3_handle_info_command,
.mode = COMMAND_EXEC,
- .help = "Print information about the current at91sam3 chip"
+ .help = "Print information about the current at91sam3 chip "
"and its flash configuration.",
+ .usage = "",
},
{
.name = "slowclk",
@@ -3711,7 +3752,7 @@ static const struct command_registration at91sam3_command_handlers[] = {
COMMAND_REGISTRATION_DONE
};
-struct flash_driver at91sam3_flash = {
+const struct flash_driver at91sam3_flash = {
.name = "at91sam3",
.commands = at91sam3_command_handlers,
.flash_bank_command = sam3_flash_bank_command,
@@ -3721,6 +3762,7 @@ struct flash_driver at91sam3_flash = {
.read = default_flash_read,
.probe = sam3_probe,
.auto_probe = sam3_auto_probe,
- .erase_check = sam3_erase_check,
+ .erase_check = default_flash_blank_check,
.protect_check = sam3_protect_check,
+ .free_driver_priv = sam3_free_driver_priv,
};