File 0003-add-support-for-Atmel-Cortex-M7-chips-SAM-S70-E70-V7.patch of Package BOSSA

From 010e7ffdb0bb601b3e574f2b06bee1baff5c8528 Mon Sep 17 00:00:00 2001
From: Jeff Weisberg <jaw@tcp4me.com>
Date: Fri, 17 Jun 2016 18:38:26 -0400
Subject: [PATCH 3/7] add support for Atmel Cortex-M7 chips: SAM S70, E70, V70,
 V71

---
 src/Command.cpp      | 13 +++++++++++++
 src/EefcFlash.cpp    | 11 ++++++-----
 src/FlashFactory.cpp | 23 +++++++++++++++++++++++
 src/Samba.cpp        | 16 ++++++++++------
 src/Samba.h          |  4 +++-
 5 files changed, 55 insertions(+), 12 deletions(-)

diff --git a/src/Command.cpp b/src/Command.cpp
index 02cefa2fff54..6ca20482f3c2 100644
--- a/src/Command.cpp
+++ b/src/Command.cpp
@@ -882,6 +882,19 @@ CommandPio::invoke(char* argv[], int argc)
             }
         }
     }
+   // Check for Cortex-M7 SAM S70, E70, V70, V71
+   else if (eproc == 0 && arch >= 0x10 && arch <= 0x13)
+   {
+       switch (port)
+       {
+       case 'a': addr = 0x400e0e00; break;
+       case 'b': addr = 0x400e1000; break;
+       case 'c': addr = 0x400e1200; break;
+       case 'd': addr = 0x400e1400; break;
+       case 'e': addr = 0x400e1600; break;
+       }
+   }
+
     else
     {
         switch (port)
diff --git a/src/EefcFlash.cpp b/src/EefcFlash.cpp
index 6962904b39ac..c25e10839a7d 100644
--- a/src/EefcFlash.cpp
+++ b/src/EefcFlash.cpp
@@ -72,8 +72,8 @@ EefcFlash::EefcFlash(Samba& samba,
       _regs(regs), _canBrownout(canBrownout), _eraseAuto(true)
 {
     assert(planes == 1 || planes == 2);
-    assert(pages <= 2048);
-    assert(lockRegions <= 32);
+    assert(pages <= 4096);
+    assert(lockRegions <= 128);
 
     // SAM3 Errata (FWS must be 6)
     _samba.writeWord(EEFC0_FMR, 0x6 << 8);
@@ -290,7 +290,7 @@ EefcFlash::waitFSR()
     uint32_t fsr0;
     uint32_t fsr1 = 0x1;
 
-    while (++tries <= 500)
+    while (++tries <= 1000)
     {
         fsr0 = _samba.readWord(EEFC0_FSR);
         if (fsr0 & (1 << 2))
@@ -304,9 +304,10 @@ EefcFlash::waitFSR()
         }
         if (fsr0 & fsr1 & 0x1)
             break;
-        usleep(100);
+        // nb. the larger devices can take several seconds to erase
+        usleep(1000 * tries);
     }
-    if (tries > 500)
+    if (tries > 1000)
         throw FlashCmdError();
 }
 
diff --git a/src/FlashFactory.cpp b/src/FlashFactory.cpp
index 27af002b5951..ebac04407302 100644
--- a/src/FlashFactory.cpp
+++ b/src/FlashFactory.cpp
@@ -78,6 +78,29 @@ FlashFactory::create(Samba& samba, uint32_t chipId)
                               ATSAMR21E18A_BUFFER_ADDR, ATSAMR21E18A_STACK_ADDR, ATSAMR21E18A_NVMCTRL_BASE, /*canBrownout*/true ) ;
         break;
     //
+    // SAM E70, S70, V70, V71
+    //
+    case 0xA1020C00: // E70
+    case 0xA1120C00: // S70
+    case 0xA1220C00: // V71
+    case 0xA1320C00: // V70
+        flash = new EefcFlash(samba, "ATSAM(SEV)70x20", 0x400000, 2048, 512, 1,  64, 0x20401000, 0x20420000, 0x400e0c00, false);
+        break;
+
+    case 0xA1020E00: // E70
+    case 0xA1120E00: // S70
+    case 0xA1220E00: // V71
+    // NB. there is no V70x21
+        flash = new EefcFlash(samba, "ATSAM(SEV)70x21", 0x400000, 4096, 512, 1, 128, 0x20401000, 0x20420000, 0x400e0c00, false);
+        break;
+
+    case 0xA10D0A00: // E70
+    case 0xA11D0A00: // S70
+    case 0xA12D0A00: // V71
+    case 0xA13D0A00: // V70
+        flash = new EefcFlash(samba, "ATSAM(SEV)70x19", 0x400000, 1024, 512, 1,  32, 0x20401000, 0x20420000, 0x400e0c00, false);
+        break;
+    //
     // SAM7SE
     //
     case 0x272a0a40:
diff --git a/src/Samba.cpp b/src/Samba.cpp
index 52af30385f48..c06b2ff2a42f 100644
--- a/src/Samba.cpp
+++ b/src/Samba.cpp
@@ -621,10 +621,6 @@ Samba::reset(void)
 
     switch (getChipArchitecture(chipId))
     {
-      case ATSAMD21J18A_CHIPID:
-      case ATSAMD21G18A_CHIPID:
-      case ATSAMD21E18A_CHIPID:
-      case ATSAMR21E18A_CHIPID:
       case SAMD20:
       case SAMD21:
         // http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0484c/index.html
@@ -736,8 +732,16 @@ Samba::getChipArchitecture(uint32_t cid)
     uint8_t eproc = (cid >> 5) & 0x7;
     uint8_t arch = (cid >> 20) & 0xff;
 
+    // Check for Cortex-M7 processor
+    if (eproc == 0)
+    {
+        if( arch >= 0x10 && arch <= 0x13 )
+            return CORTEXM7;
+        if (_debug)
+            printf("Unsupported ARM Cortex-M7 architecture\n");
+    }
     // Check for ARM7TDMI processor
-    if (eproc == 2)
+    else if (eproc == 2)
     {
         // Check for SAM7 architecture
         if (arch == 0x70)
@@ -791,7 +795,7 @@ Samba::getChipArchitecture(uint32_t cid)
     {
         // Check for SAM4 architecture
         if (arch >= 0x88 && arch <= 0x8a)
-            return true;
+            return SAM4;
         if (_debug)
             printf("Unsupported Cortex-M4 architecture\n");
     }
diff --git a/src/Samba.h b/src/Samba.h
index f5c2bbe75ea0..bc8b1a760209 100644
--- a/src/Samba.h
+++ b/src/Samba.h
@@ -100,6 +100,7 @@ private:
         SAM3S,
         SAM3SD,
         SAM3N,
+        SAM4,
         SAM7S,
         SAM7XC,
         SAM7SE,
@@ -108,7 +109,8 @@ private:
         SAM7SL,
         SAM9XE,
         SAMD20,
-        SAMD21
+        SAMD21,
+        CORTEXM7
     };
 
     bool _debug;
-- 
2.9.2

openSUSE Build Service is sponsored by