flash: at91samd: add SAML21 support, fix part ID issue
This adds support for the new Atmel SAML21 family of low-power Cortex M0+ devices. Their Flash controller is essentially the SAMDxx one so the change consists of adding the new part IDs. Unfortunately the device ID logic had a couple of mistakes in it that did not affect anything on SAMD2x devices (due to 0 values expected there) but that is a problem on L21, it's therefore addressed here and things should now match the datasheets. Tested on Amtel SAML21 Xplained Pro development kit against the included SAML21J18A there. Also tested for regressions on a SAMD20 and SAMD21 using their dev kits. Change-Id: I768f75e064b8656c15148730dacaa4c3acfc4101 Signed-off-by: Andrey Yurovsky <yurovsky@gmail.com> Reviewed-on: http://openocd.zylin.com/2690 Tested-by: jenkins Reviewed-by: Paul Fertser <fercerpav@gmail.com>__archive__
parent
4ed3a1efa2
commit
2cf48d2c79
|
@ -63,6 +63,7 @@
|
||||||
/* Known identifiers */
|
/* Known identifiers */
|
||||||
#define SAMD_PROCESSOR_M0 0x01
|
#define SAMD_PROCESSOR_M0 0x01
|
||||||
#define SAMD_FAMILY_D 0x00
|
#define SAMD_FAMILY_D 0x00
|
||||||
|
#define SAMD_FAMILY_L 0x01
|
||||||
#define SAMD_SERIES_20 0x00
|
#define SAMD_SERIES_20 0x00
|
||||||
#define SAMD_SERIES_21 0x01
|
#define SAMD_SERIES_21 0x01
|
||||||
#define SAMD_SERIES_10 0x02
|
#define SAMD_SERIES_10 0x02
|
||||||
|
@ -149,6 +150,19 @@ static const struct samd_part samr21_parts[] = {
|
||||||
{ 0x1E, "SAMR21E16A", 64, 32 },
|
{ 0x1E, "SAMR21E16A", 64, 32 },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Known SAML21 parts. */
|
||||||
|
static const struct samd_part saml21_parts[] = {
|
||||||
|
{ 0x00, "SAML21J18A", 256, 32 },
|
||||||
|
{ 0x01, "SAML21J17A", 128, 16 },
|
||||||
|
{ 0x02, "SAML21J16A", 64, 8 },
|
||||||
|
{ 0x05, "SAML21G18A", 256, 32 },
|
||||||
|
{ 0x06, "SAML21G17A", 128, 16 },
|
||||||
|
{ 0x07, "SAML21G16A", 64, 8 },
|
||||||
|
{ 0x0A, "SAML21E18A", 256, 32 },
|
||||||
|
{ 0x0B, "SAML21E17A", 128, 16 },
|
||||||
|
{ 0x0C, "SAML21E16A", 64, 8 },
|
||||||
|
{ 0x0D, "SAML21E15A", 32, 4 },
|
||||||
|
};
|
||||||
|
|
||||||
/* Each family of parts contains a parts table in the DEVSEL field of DID. The
|
/* Each family of parts contains a parts table in the DEVSEL field of DID. The
|
||||||
* processor ID, family ID, and series ID are used to determine which exact
|
* processor ID, family ID, and series ID are used to determine which exact
|
||||||
|
@ -173,6 +187,8 @@ static const struct samd_family samd_families[] = {
|
||||||
samd10_parts, ARRAY_SIZE(samd10_parts) },
|
samd10_parts, ARRAY_SIZE(samd10_parts) },
|
||||||
{ SAMD_PROCESSOR_M0, SAMD_FAMILY_D, SAMD_SERIES_11,
|
{ SAMD_PROCESSOR_M0, SAMD_FAMILY_D, SAMD_SERIES_11,
|
||||||
samd11_parts, ARRAY_SIZE(samd11_parts) },
|
samd11_parts, ARRAY_SIZE(samd11_parts) },
|
||||||
|
{ SAMD_PROCESSOR_M0, SAMD_FAMILY_L, SAMD_SERIES_21,
|
||||||
|
saml21_parts, ARRAY_SIZE(saml21_parts) },
|
||||||
};
|
};
|
||||||
|
|
||||||
struct samd_info {
|
struct samd_info {
|
||||||
|
@ -190,8 +206,8 @@ static struct samd_info *samd_chips;
|
||||||
static const struct samd_part *samd_find_part(uint32_t id)
|
static const struct samd_part *samd_find_part(uint32_t id)
|
||||||
{
|
{
|
||||||
uint8_t processor = (id >> 28);
|
uint8_t processor = (id >> 28);
|
||||||
uint8_t family = (id >> 24) & 0x0F;
|
uint8_t family = (id >> 23) & 0x1F;
|
||||||
uint8_t series = (id >> 16) & 0xFF;
|
uint8_t series = (id >> 16) & 0x3F;
|
||||||
uint8_t devsel = id & 0xFF;
|
uint8_t devsel = id & 0xFF;
|
||||||
|
|
||||||
for (unsigned i = 0; i < ARRAY_SIZE(samd_families); i++) {
|
for (unsigned i = 0; i < ARRAY_SIZE(samd_families); i++) {
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
#
|
||||||
|
# Atmel SAML21 Xplained Pro evaluation kit.
|
||||||
|
#
|
||||||
|
|
||||||
|
source [find interface/cmsis-dap.cfg]
|
||||||
|
|
||||||
|
# chip name
|
||||||
|
set CHIPNAME at91saml21j18
|
||||||
|
|
||||||
|
source [find target/at91samdXX.cfg]
|
Loading…
Reference in New Issue