Skip to content

Commit fda8e4f

Browse files
Added support for newer revisions of SAMD21G18A and centralized CPU architecture identification.
1 parent 3e35adb commit fda8e4f

File tree

3 files changed

+129
-54
lines changed

3 files changed

+129
-54
lines changed

src/FlashFactory.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,14 @@ FlashFactory::create(Samba& samba, uint32_t chipId)
5151
// SAMD21
5252
//
5353
case 0x10010000:
54-
case 0x10010100:
54+
case 0x10010100:
5555
flash = new NvmFlash(samba, "ATSAMD21J18A", 0x000000, 4096, 64, 1, 16, 0x20004000, 0x20008000, 0x41004000, true);
5656
// 0x41004000 == Base address for the NVMCTRL module
5757
break;
58-
58+
5959
case 0x10010005:
60+
case 0x10010105:
61+
case 0x10010205:
6062
flash = new NvmFlash(samba, "ATSAMD21G18A", 0x000000, 4096, 64, 1, 16, 0x20004000, 0x20008000, 0x41004000, true);
6163
break;
6264

src/Samba.cpp

Lines changed: 103 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -110,48 +110,8 @@ Samba::init()
110110
if (_debug)
111111
printf("chipId=%#08x\n", cid);
112112

113-
uint8_t eproc = (cid >> 5) & 0x7;
114-
uint8_t arch = (cid >> 20) & 0xff;
115-
116-
// Check for ARM7TDMI processor
117-
if (eproc == 2)
118-
{
119-
// Check for SAM7 architecture
120-
if (arch >= 0x70 && arch <= 0x76)
121-
return true;
122-
if (_debug)
123-
printf("Unsupported ARM7TDMI architecture\n");
124-
}
125-
// Check for Cortex-M3 processor
126-
else if (eproc == 3)
127-
{
128-
// Check for SAM3 architecture
129-
if (arch >= 0x80 && arch <= 0x8a)
130-
return true;
131-
if (arch >= 0x93 && arch <= 0x9a)
132-
return true;
133-
if (_debug)
134-
printf("Unsupported Cortex-M3 architecture\n");
135-
}
136-
// Check for ARM920T processor
137-
else if (eproc == 4)
138-
{
139-
// Check for SAM9XE architecture
140-
if (arch == 0x29)
141-
return true;
142-
if (_debug)
143-
printf("Unsupported ARM920T architecture\n");
144-
}
145-
// Check for supported M0+ processor
146-
else if (cid == 0x10010000 || cid == 0x10010100 || cid == 0x10010005)
147-
{
148-
return true;
149-
}
150-
else
151-
{
152-
if (_debug)
153-
printf("Unsupported processor\n");
154-
}
113+
if (getChipArchitecture(cid) != Unsupported)
114+
return true;
155115

156116
return false;
157117
}
@@ -600,26 +560,34 @@ Samba::chipId()
600560
void
601561
Samba::reset(void)
602562
{
563+
uint32_t chipId;
564+
603565
printf("CPU reset.\n");
604566

605-
uint32_t chipId = Samba::chipId();
567+
// Read the chip ID
568+
try
569+
{
570+
chipId = Samba::chipId();
571+
}
572+
catch (SambaError)
573+
{
574+
printf("Reset failed.\n");
575+
return;
576+
}
606577

607-
switch (chipId)
578+
switch (getChipArchitecture(chipId))
608579
{
609-
// SAMD21G18 or SAMD21J18
610-
case 0x10010000:
611-
case 0x10010100:
612-
case 0x10010005:
580+
case SAMD20:
581+
case SAMD21:
613582
// http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0484c/index.html
614583
writeWord(0xE000ED0C, 0x05FA0004);
615584
break;
616585

617-
// SAM3X8E
618-
case 0x285e0a60:
586+
case SAM3X:
619587
writeWord(0x400E1A00, 0xA500000D);
620588
break;
621-
622-
default:
589+
590+
default:
623591
printf("Reset not supported for this CPU.\n");
624592
return;
625593
}
@@ -630,3 +598,86 @@ Samba::reset(void)
630598
// sort out things before closing the port.
631599
usleep(100000);
632600
}
601+
602+
603+
Samba::ChipArchitecture
604+
Samba::getChipArchitecture(uint32_t cid)
605+
{
606+
uint8_t eproc = (cid >> 5) & 0x7;
607+
uint8_t arch = (cid >> 20) & 0xff;
608+
609+
// Check for ARM7TDMI processor
610+
if (eproc == 2)
611+
{
612+
// Check for SAM7 architecture
613+
if (arch == 0x70)
614+
return SAM7S;
615+
else if (arch == 0x71)
616+
return SAM7XC;
617+
else if (arch == 0x72)
618+
return SAM7SE;
619+
else if (arch == 0x73)
620+
return SAM7L;
621+
else if (arch == 0x75)
622+
return SAM7X;
623+
else if (arch == 0x76)
624+
return SAM7SL;
625+
626+
if (_debug)
627+
printf("Unsupported ARM7TDMI architecture\n");
628+
}
629+
// Check for Cortex-M3 processor
630+
else if (eproc == 3)
631+
{
632+
// Check for SAM3 architecture
633+
if (arch >= 0x80 && arch <= 0x81)
634+
return SAM3U;
635+
else if (arch == 0x83)
636+
return SAM3A;
637+
else if (arch >= 0x84 && arch <= 0x86)
638+
return SAM3X;
639+
else if (arch >= 0x88 && arch <= 0x8A)
640+
return SAM3S;
641+
else if (arch >= 0x93 && arch <= 0x95)
642+
return SAM3N;
643+
else if (arch >= 0x98 && arch <= 0x9A)
644+
return SAM3SD;
645+
646+
if (_debug)
647+
printf("Unsupported Cortex-M3 architecture\n");
648+
}
649+
// Check for ARM920T processor
650+
else if (eproc == 4)
651+
{
652+
// Check for SAM9XE architecture
653+
if (arch == 0x29)
654+
return SAM9XE;
655+
656+
if (_debug)
657+
printf("Unsupported ARM920T architecture\n");
658+
}
659+
// Check for SAMD Cortex-M0+ processor
660+
else if ((cid & 0xff800000) == 0x10000000)
661+
{
662+
uint8_t series = (cid >> 16) & 0x3f;
663+
664+
if (series == 0x00)
665+
{
666+
return SAMD20;
667+
}
668+
else if (series == 0x01)
669+
{
670+
return SAMD21;
671+
}
672+
673+
if (_debug)
674+
printf("Unsupported Cortex-M0+ architecture\n");
675+
}
676+
else
677+
{
678+
if (_debug)
679+
printf("Unsupported processor\n");
680+
}
681+
682+
return Unsupported;
683+
}

src/Samba.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,26 @@ class Samba
7676
void reset(void);
7777

7878
private:
79+
enum ChipArchitecture
80+
{
81+
Unsupported = 0,
82+
SAM3U,
83+
SAM3A,
84+
SAM3X,
85+
SAM3S,
86+
SAM3SD,
87+
SAM3N,
88+
SAM7S,
89+
SAM7XC,
90+
SAM7SE,
91+
SAM7L,
92+
SAM7X,
93+
SAM7SL,
94+
SAM9XE,
95+
SAMD20,
96+
SAMD21
97+
};
98+
7999
bool _debug;
80100
bool _isUsb;
81101
SerialPort::Ptr _port;
@@ -91,6 +111,8 @@ class Samba
91111
void writeBinary(const uint8_t* buffer, int size);
92112
void readBinary(uint8_t* buffer, int size);
93113

114+
ChipArchitecture getChipArchitecture(uint32_t cid);
115+
94116
};
95117

96118

0 commit comments

Comments
 (0)