/* Known SAMD11 parts */
static const struct samd_part samd11_parts[] = {
- { 0x0, "SAMD11D14AMU", 16, 4 },
+ { 0x0, "SAMD11D14AM", 16, 4 },
{ 0x1, "SAMD11D13AMU", 8, 4 },
{ 0x2, "SAMD11D12AMU", 4, 4 },
- { 0x3, "SAMD11D14ASU", 16, 4 },
+ { 0x3, "SAMD11D14ASS", 16, 4 },
{ 0x4, "SAMD11D13ASU", 8, 4 },
{ 0x5, "SAMD11D12ASU", 4, 4 },
{ 0x6, "SAMD11C14A", 16, 4 },
{ 0x7, "SAMD11C13A", 8, 4 },
{ 0x8, "SAMD11C12A", 4, 4 },
+ { 0x9, "SAMD11D14AU", 16, 4 },
};
/* Known SAMD20 parts. See Table 12-8 in 42129F–SAM–10/2013 */
{ 0xE, "SAMD21E14A", 16, 2 },
/* SAMR21 parts have integrated SAMD21 with a radio */
+ { 0x18, "SAMR21G19A", 256, 32 }, /* with 512k of serial flash */
{ 0x19, "SAMR21G18A", 256, 32 },
{ 0x1A, "SAMR21G17A", 128, 32 },
- { 0x1B, "SAMR21G16A", 64, 32 },
+ { 0x1B, "SAMR21G16A", 64, 16 },
{ 0x1C, "SAMR21E18A", 256, 32 },
{ 0x1D, "SAMR21E17A", 128, 32 },
- { 0x1E, "SAMR21E16A", 64, 32 },
+ { 0x1E, "SAMR21E16A", 64, 16 },
/* SAMD21 B Variants (Table 3-7 from rev I of datasheet) */
{ 0x20, "SAMD21J16B", 64, 8 },
{ 0x24, "SAMD21G15B", 32, 4 },
{ 0x26, "SAMD21E16B", 64, 8 },
{ 0x27, "SAMD21E15B", 32, 4 },
+
+ /* Known SAMDA1 parts.
+ SAMD-A1 series uses the same series identifier like the SAMD21
+ taken from http://ww1.microchip.com/downloads/en/DeviceDoc/40001895A.pdf (pages 14-17) */
+ { 0x29, "SAMDA1J16A", 64, 8 },
+ { 0x2A, "SAMDA1J15A", 32, 4 },
+ { 0x2B, "SAMDA1J14A", 16, 4 },
+ { 0x2C, "SAMDA1G16A", 64, 8 },
+ { 0x2D, "SAMDA1G15A", 32, 4 },
+ { 0x2E, "SAMDA1G14A", 16, 4 },
+ { 0x2F, "SAMDA1E16A", 64, 8 },
+ { 0x30, "SAMDA1E15A", 32, 4 },
+ { 0x31, "SAMDA1E14A", 16, 4 },
+ { 0x64, "SAMDA1J16B", 64, 8 },
+ { 0x65, "SAMDA1J15B", 32, 4 },
+ { 0x66, "SAMDA1J14B", 16, 4 },
+ { 0x67, "SAMDA1G16B", 64, 8 },
+ { 0x68, "SAMDA1G15B", 32, 4 },
+ { 0x69, "SAMDA1G14B", 16, 4 },
+ { 0x6A, "SAMDA1E16B", 64, 8 },
+ { 0x6B, "SAMDA1E15B", 32, 4 },
+ { 0x6C, "SAMDA1E14B", 16, 4 },
};
/* Known SAML21 parts. */
/* SAMR30 parts have integrated SAML21 with a radio */
{ 0x1E, "SAMR30G18A", 256, 32 },
{ 0x1F, "SAMR30E18A", 256, 32 },
+
+ /* SAMR34/R35 parts have integrated SAML21 with a lora radio */
+ { 0x28, "SAMR34J18", 256, 32 },
};
/* Known SAML22 parts. */
{ 0x0B, "SAMC20E17A", 128, 16 },
{ 0x0C, "SAMC20E16A", 64, 8 },
{ 0x0D, "SAMC20E15A", 32, 4 },
+ { 0x20, "SAMC20N18A", 256, 32 },
+ { 0x21, "SAMC20N17A", 128, 16 },
};
/* Known SAMC21 parts. */
{ 0x0B, "SAMC21E17A", 128, 16 },
{ 0x0C, "SAMC21E16A", 64, 8 },
{ 0x0D, "SAMC21E15A", 32, 4 },
+ { 0x20, "SAMC21N18A", 256, 32 },
+ { 0x21, "SAMC21N17A", 128, 16 },
};
/* Each family of parts contains a parts table in the DEVSEL field of DID. The
bool probed;
struct target *target;
- struct samd_info *next;
};
-static struct samd_info *samd_chips;
/**
* Gives the family structure to specific device id.
FLASH_BANK_COMMAND_HANDLER(samd_flash_bank_command)
{
- struct samd_info *chip = samd_chips;
-
- while (chip) {
- if (chip->target == bank->target)
- break;
- chip = chip->next;
- }
-
- if (!chip) {
- /* Create a new chip */
- chip = calloc(1, sizeof(*chip));
- if (!chip)
- return ERROR_FAIL;
-
- chip->target = bank->target;
- chip->probed = false;
-
- bank->driver_priv = chip;
-
- /* Insert it into the chips list (at head) */
- chip->next = samd_chips;
- samd_chips = chip;
- }
-
if (bank->base != SAMD_FLASH) {
- LOG_ERROR("Address 0x%08" PRIx32 " invalid bank address (try 0x%08" PRIx32
+ LOG_ERROR("Address " TARGET_ADDR_FMT
+ " invalid bank address (try 0x%08" PRIx32
"[at91samd series] )",
bank->base, SAMD_FLASH);
return ERROR_FAIL;
}
+ struct samd_info *chip;
+ chip = calloc(1, sizeof(*chip));
+ if (!chip) {
+ LOG_ERROR("No memory for flash bank chip info");
+ return ERROR_FAIL;
+ }
+
+ chip->target = bank->target;
+ chip->probed = false;
+
+ bank->driver_priv = chip;
+
return ERROR_OK;
}
.auto_probe = samd_probe,
.erase_check = default_flash_blank_check,
.protect_check = samd_protect_check,
+ .free_driver_priv = default_flash_free_driver_priv,
};