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__
Andrey Yurovsky 2015-03-30 12:50:13 -07:00 committed by Paul Fertser
parent 4ed3a1efa2
commit 2cf48d2c79
2 changed files with 28 additions and 2 deletions

View File

@ -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++) {

View File

@ -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]