Skip to content

Commit

Permalink
Added support for more SAMD chips
Browse files Browse the repository at this point in the history
  • Loading branch information
mattairtech committed Jul 20, 2015
1 parent 63cdfbb commit fcf8a70
Show file tree
Hide file tree
Showing 8 changed files with 292 additions and 12 deletions.
2 changes: 1 addition & 1 deletion Makefile
Expand Up @@ -3,7 +3,7 @@
#
# Version
#
VERSION=1.5-arduino
VERSION=1.5-arduino-mattairtech-1
WXVERSION=3.0

#
Expand Down
34 changes: 34 additions & 0 deletions README.md
@@ -1,3 +1,37 @@

BOSSA 1.5-arduino-mattairtech-1
-------------------------------

This version of BOSSA is a fork of BOSSA 1.5-arduino.
It adds support for more SAMD chips:

* ATSAMD21E17A
* ATSAMD21E16A
* ATSAMD21E15A
* ATSAMD21G17A
* ATSAMD21G16A
* ATSAMD21G15A
* ATSAMD21J17A
* ATSAMD21J16A
* ATSAMD21J15A
* ATSAMD11D14AM
* ATSAMD11D14AS
* ATSAMD11C14A

This adds to the previously supported SAMD chips:

* ATSAMD21J18A
* ATSAMD21G18A
* ATSAMD21E18A
* ATSAMDR1E18A

Only the ATSAMD21E18A and ATSAMD21E17A have been tested with this fork.
The ATSAMD11D14AM will soon be tested.

All of the D21 chips must use an 8KB bootloader, while the DR1 and D11
must use a 4KB bootloader. See Devices.h for more information.


BOSSA 1.4 for Arduino

This version of BOSSA is a fork of the original project and contains some
Expand Down
6 changes: 4 additions & 2 deletions src/BossaForm.cpp
Expand Up @@ -342,7 +342,8 @@ InfoDialog::InfoDialog( wxWindow* parent, wxWindowID id, const wxString& title,
_flashBoxSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxT("Flash") ), wxVERTICAL );

wxFlexGridSizer* _flashGridSizer;
_flashGridSizer = new wxFlexGridSizer( 2, 2, 0, 0 );
// wxWidgets 3.0 requires GridSizer columns and rows to be exact, otherwise set the column or row to 0
_flashGridSizer = new wxFlexGridSizer( 4, 0, 0, 0 );
_flashGridSizer->SetFlexibleDirection( wxBOTH );
_flashGridSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );

Expand Down Expand Up @@ -382,7 +383,8 @@ InfoDialog::InfoDialog( wxWindow* parent, wxWindowID id, const wxString& title,
_optionsBoxSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxT("Options") ), wxVERTICAL );

wxFlexGridSizer* _gpnvGridSizer;
_gpnvGridSizer = new wxFlexGridSizer( 2, 2, 0, 0 );
// wxWidgets 3.0 requires GridSizer columns and rows to be exact, otherwise set the column or row to 0
_gpnvGridSizer = new wxFlexGridSizer( 3, 0, 0, 0 );
_gpnvGridSizer->SetFlexibleDirection( wxBOTH );
_gpnvGridSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );

Expand Down
3 changes: 2 additions & 1 deletion src/CmdOpts.cpp
Expand Up @@ -72,7 +72,8 @@ CmdOpts::usage(FILE* out)
start = _opts[optIdx].help;
while ((end = strchr(start, '\n')))
{
fwrite(start, end - start + 1, 1, out);
if (!fwrite(start, end - start + 1, 1, out))
return;
fprintf(out, "%24s", "");
start = end + 1;
}
Expand Down
138 changes: 136 additions & 2 deletions src/Devices.h
Expand Up @@ -30,11 +30,13 @@
#ifndef _DEVICES_H_
#define _DEVICES_H_

#define ATSAM_APPLET_MAX_SIZE (0x1000)
#define ATSAM_APPLET_MAX_SIZE (0x0400)

#define ATSAMD_CHIPID_MASK (0xFFFF00FFul) // mask for DIE & REV bitfields removal in Samba::chipId()
#define ATSAMD_BOOTLOADER_SIZE (0x00002000ul) // 8192 bytes
#define ATSAMR_BOOTLOADER_SIZE (0x00001000ul) // 4096 bytes, USB-CDC only
#define ATSAMR_BOOTLOADER_SIZE (0x00001000ul) // 4096 bytes, USB-CDC only
#define BOOTLOADER_SIZE_8KB (0x00002000ul) // 8192 bytes, both interfaces
#define BOOTLOADER_SIZE_4KB (0x00001000ul) // 4096 bytes, USB-CDC or UART only
#define ATSAMD_FLASH_ROW_PAGES (4ul) // 4 pages per row

#define ATSAMD21J18A_NAME "ATSAMD21J18A"
Expand All @@ -48,6 +50,39 @@
#define ATSAMD21J18A_STACK_ADDR (0x20008000ul)
#define ATSAMD21J18A_NVMCTRL_BASE (0x41004000ul)

#define ATSAMD21J17A_NAME "ATSAMD21J17A"
#define ATSAMD21J17A_CHIPID (0x10010001ul) // DIE & REV bitfields masked in Samba::chipId()
#define ATSAMD21J17A_FLASH_BASE (0x00000000ul + ATSAMD_BOOTLOADER_SIZE)
#define ATSAMD21J17A_FLASH_PAGE_SIZE (64ul)
#define ATSAMD21J17A_FLASH_PAGES (2048ul)
#define ATSAMD21J17A_FLASH_PLANES (1ul)
#define ATSAMD21J17A_FLASH_LOCK_REGIONS (16ul)
#define ATSAMD21J17A_BUFFER_ADDR (0x20002000ul)
#define ATSAMD21J17A_STACK_ADDR (0x20004000ul)
#define ATSAMD21J17A_NVMCTRL_BASE (0x41004000ul)

#define ATSAMD21J16A_NAME "ATSAMD21J16A"
#define ATSAMD21J16A_CHIPID (0x10010002ul) // DIE & REV bitfields masked in Samba::chipId()
#define ATSAMD21J16A_FLASH_BASE (0x00000000ul + ATSAMD_BOOTLOADER_SIZE)
#define ATSAMD21J16A_FLASH_PAGE_SIZE (64ul)
#define ATSAMD21J16A_FLASH_PAGES (1024ul)
#define ATSAMD21J16A_FLASH_PLANES (1ul)
#define ATSAMD21J16A_FLASH_LOCK_REGIONS (16ul)
#define ATSAMD21J16A_BUFFER_ADDR (0x20001000ul)
#define ATSAMD21J16A_STACK_ADDR (0x20002000ul)
#define ATSAMD21J16A_NVMCTRL_BASE (0x41004000ul)

#define ATSAMD21J15A_NAME "ATSAMD21J15A"
#define ATSAMD21J15A_CHIPID (0x10010003ul) // DIE & REV bitfields masked in Samba::chipId()
#define ATSAMD21J15A_FLASH_BASE (0x00000000ul + ATSAMD_BOOTLOADER_SIZE)
#define ATSAMD21J15A_FLASH_PAGE_SIZE (64ul)
#define ATSAMD21J15A_FLASH_PAGES (512ul)
#define ATSAMD21J15A_FLASH_PLANES (1ul)
#define ATSAMD21J15A_FLASH_LOCK_REGIONS (16ul)
#define ATSAMD21J15A_BUFFER_ADDR (0x20000800ul)
#define ATSAMD21J15A_STACK_ADDR (0x20001000ul)
#define ATSAMD21J15A_NVMCTRL_BASE (0x41004000ul)

#define ATSAMD21G18A_NAME "ATSAMD21G18A"
#define ATSAMD21G18A_CHIPID (0x10010005ul) // DIE & REV bitfields masked in Samba::chipId()
#define ATSAMD21G18A_FLASH_BASE (0x00000000ul + ATSAMD_BOOTLOADER_SIZE)
Expand All @@ -59,6 +94,39 @@
#define ATSAMD21G18A_STACK_ADDR (0x20008000ul)
#define ATSAMD21G18A_NVMCTRL_BASE (0x41004000ul)

#define ATSAMD21G17A_NAME "ATSAMD21G17A"
#define ATSAMD21G17A_CHIPID (0x10010006ul) // DIE & REV bitfields masked in Samba::chipId()
#define ATSAMD21G17A_FLASH_BASE (0x00000000ul + ATSAMD_BOOTLOADER_SIZE)
#define ATSAMD21G17A_FLASH_PAGE_SIZE (64ul)
#define ATSAMD21G17A_FLASH_PAGES (2048ul)
#define ATSAMD21G17A_FLASH_PLANES (1ul)
#define ATSAMD21G17A_FLASH_LOCK_REGIONS (16ul)
#define ATSAMD21G17A_BUFFER_ADDR (0x20002000ul)
#define ATSAMD21G17A_STACK_ADDR (0x20004000ul)
#define ATSAMD21G17A_NVMCTRL_BASE (0x41004000ul)

#define ATSAMD21G16A_NAME "ATSAMD21G16A"
#define ATSAMD21G16A_CHIPID (0x10010007ul) // DIE & REV bitfields masked in Samba::chipId()
#define ATSAMD21G16A_FLASH_BASE (0x00000000ul + ATSAMD_BOOTLOADER_SIZE)
#define ATSAMD21G16A_FLASH_PAGE_SIZE (64ul)
#define ATSAMD21G16A_FLASH_PAGES (1024ul)
#define ATSAMD21G16A_FLASH_PLANES (1ul)
#define ATSAMD21G16A_FLASH_LOCK_REGIONS (16ul)
#define ATSAMD21G16A_BUFFER_ADDR (0x20001000ul)
#define ATSAMD21G16A_STACK_ADDR (0x20002000ul)
#define ATSAMD21G16A_NVMCTRL_BASE (0x41004000ul)

#define ATSAMD21G15A_NAME "ATSAMD21G15A"
#define ATSAMD21G15A_CHIPID (0x10010008ul) // DIE & REV bitfields masked in Samba::chipId()
#define ATSAMD21G15A_FLASH_BASE (0x00000000ul + ATSAMD_BOOTLOADER_SIZE)
#define ATSAMD21G15A_FLASH_PAGE_SIZE (64ul)
#define ATSAMD21G15A_FLASH_PAGES (512ul)
#define ATSAMD21G15A_FLASH_PLANES (1ul)
#define ATSAMD21G15A_FLASH_LOCK_REGIONS (16ul)
#define ATSAMD21G15A_BUFFER_ADDR (0x20000800ul)
#define ATSAMD21G15A_STACK_ADDR (0x20001000ul)
#define ATSAMD21G15A_NVMCTRL_BASE (0x41004000ul)

#define ATSAMD21E18A_NAME "ATSAMD21E18A"
#define ATSAMD21E18A_CHIPID (0x1001000aul) // DIE & REV bitfields masked in Samba::chipId()
#define ATSAMD21E18A_FLASH_BASE (0x00000000ul + ATSAMD_BOOTLOADER_SIZE)
Expand All @@ -70,6 +138,72 @@
#define ATSAMD21E18A_STACK_ADDR (0x20008000ul)
#define ATSAMD21E18A_NVMCTRL_BASE (0x41004000ul)

#define ATSAMD21E17A_NAME "ATSAMD21E17A"
#define ATSAMD21E17A_CHIPID (0x1001000bul) // DIE & REV bitfields masked in Samba::chipId()
#define ATSAMD21E17A_FLASH_BASE (0x00000000ul + ATSAMD_BOOTLOADER_SIZE)
#define ATSAMD21E17A_FLASH_PAGE_SIZE (64ul)
#define ATSAMD21E17A_FLASH_PAGES (2048ul)
#define ATSAMD21E17A_FLASH_PLANES (1ul)
#define ATSAMD21E17A_FLASH_LOCK_REGIONS (16ul)
#define ATSAMD21E17A_BUFFER_ADDR (0x20002000ul)
#define ATSAMD21E17A_STACK_ADDR (0x20004000ul)
#define ATSAMD21E17A_NVMCTRL_BASE (0x41004000ul)

#define ATSAMD21E16A_NAME "ATSAMD21E16A"
#define ATSAMD21E16A_CHIPID (0x1001000cul) // DIE & REV bitfields masked in Samba::chipId()
#define ATSAMD21E16A_FLASH_BASE (0x00000000ul + ATSAMD_BOOTLOADER_SIZE)
#define ATSAMD21E16A_FLASH_PAGE_SIZE (64ul)
#define ATSAMD21E16A_FLASH_PAGES (1024ul)
#define ATSAMD21E16A_FLASH_PLANES (1ul)
#define ATSAMD21E16A_FLASH_LOCK_REGIONS (16ul)
#define ATSAMD21E16A_BUFFER_ADDR (0x20001000ul)
#define ATSAMD21E16A_STACK_ADDR (0x20002000ul)
#define ATSAMD21E16A_NVMCTRL_BASE (0x41004000ul)

#define ATSAMD21E15A_NAME "ATSAMD21E15A"
#define ATSAMD21E15A_CHIPID (0x1001000dul) // DIE & REV bitfields masked in Samba::chipId()
#define ATSAMD21E15A_FLASH_BASE (0x00000000ul + ATSAMD_BOOTLOADER_SIZE)
#define ATSAMD21E15A_FLASH_PAGE_SIZE (64ul)
#define ATSAMD21E15A_FLASH_PAGES (512ul)
#define ATSAMD21E15A_FLASH_PLANES (1ul)
#define ATSAMD21E15A_FLASH_LOCK_REGIONS (16ul)
#define ATSAMD21E15A_BUFFER_ADDR (0x20000800ul)
#define ATSAMD21E15A_STACK_ADDR (0x20001000ul)
#define ATSAMD21E15A_NVMCTRL_BASE (0x41004000ul)

#define ATSAMD11D14AM_NAME "ATSAMD11D14AM" // 24-pin QFN
#define ATSAMD11D14AM_CHIPID (0x10030000ul) // DIE & REV bitfields masked in Samba::chipId()
#define ATSAMD11D14AM_FLASH_BASE (0x00000000ul + BOOTLOADER_SIZE_4KB)
#define ATSAMD11D14AM_FLASH_PAGE_SIZE (64ul)
#define ATSAMD11D14AM_FLASH_PAGES (256ul)
#define ATSAMD11D14AM_FLASH_PLANES (1ul)
#define ATSAMD11D14AM_FLASH_LOCK_REGIONS (16ul)
#define ATSAMD11D14AM_BUFFER_ADDR (0x20000800ul)
#define ATSAMD11D14AM_STACK_ADDR (0x20001000ul)
#define ATSAMD11D14AM_NVMCTRL_BASE (0x41004000ul)

#define ATSAMD11D14AS_NAME "ATSAMD11D14AS" // 20-pin SOIC
#define ATSAMD11D14AS_CHIPID (0x10030003ul) // DIE & REV bitfields masked in Samba::chipId()
#define ATSAMD11D14AS_FLASH_BASE (0x00000000ul + BOOTLOADER_SIZE_4KB)
#define ATSAMD11D14AS_FLASH_PAGE_SIZE (64ul)
#define ATSAMD11D14AS_FLASH_PAGES (256ul)
#define ATSAMD11D14AS_FLASH_PLANES (1ul)
#define ATSAMD11D14AS_FLASH_LOCK_REGIONS (16ul)
#define ATSAMD11D14AS_BUFFER_ADDR (0x20000800ul)
#define ATSAMD11D14AS_STACK_ADDR (0x20001000ul)
#define ATSAMD11D14AS_NVMCTRL_BASE (0x41004000ul)

#define ATSAMD11C14A_NAME "ATSAMD11C14A" // 14-pin SOIC
#define ATSAMD11C14A_CHIPID (0x10030006ul) // DIE & REV bitfields masked in Samba::chipId()
#define ATSAMD11C14A_FLASH_BASE (0x00000000ul + BOOTLOADER_SIZE_4KB)
#define ATSAMD11C14A_FLASH_PAGE_SIZE (64ul)
#define ATSAMD11C14A_FLASH_PAGES (256ul)
#define ATSAMD11C14A_FLASH_PLANES (1ul)
#define ATSAMD11C14A_FLASH_LOCK_REGIONS (16ul)
#define ATSAMD11C14A_BUFFER_ADDR (0x20000800ul)
#define ATSAMD11C14A_STACK_ADDR (0x20001000ul)
#define ATSAMD11C14A_NVMCTRL_BASE (0x41004000ul)

#define ATSAMR21E18A_NAME "ATSAMDR1E18A"
#define ATSAMR21E18A_CHIPID (0x1001001cul) // DIE & REV bitfields masked in Samba::chipId()
#define ATSAMR21E18A_FLASH_BASE (0x00000000ul + ATSAMR_BOOTLOADER_SIZE)
Expand Down
75 changes: 74 additions & 1 deletion src/FlashFactory.cpp
Expand Up @@ -57,23 +57,96 @@ FlashFactory::create(Samba& samba, uint32_t chipId)
ATSAMD21J18A_BUFFER_ADDR, ATSAMD21J18A_STACK_ADDR, ATSAMD21J18A_NVMCTRL_BASE, /*canBrownout*/true ) ;
break ;

case ATSAMD21J17A_CHIPID:
flash = new NvmFlash( samba, ATSAMD21J17A_NAME, ATSAMD21J17A_FLASH_BASE, ATSAMD21J17A_FLASH_PAGES, ATSAMD21J17A_FLASH_PAGE_SIZE,
ATSAMD21J17A_FLASH_PLANES, ATSAMD21J17A_FLASH_LOCK_REGIONS,
ATSAMD21J17A_BUFFER_ADDR, ATSAMD21J17A_STACK_ADDR, ATSAMD21J17A_NVMCTRL_BASE, /*canBrownout*/true ) ;
break ;

case ATSAMD21J16A_CHIPID:
flash = new NvmFlash( samba, ATSAMD21J16A_NAME, ATSAMD21J16A_FLASH_BASE, ATSAMD21J16A_FLASH_PAGES, ATSAMD21J16A_FLASH_PAGE_SIZE,
ATSAMD21J16A_FLASH_PLANES, ATSAMD21J16A_FLASH_LOCK_REGIONS,
ATSAMD21J16A_BUFFER_ADDR, ATSAMD21J16A_STACK_ADDR, ATSAMD21J16A_NVMCTRL_BASE, /*canBrownout*/true ) ;
break ;

case ATSAMD21J15A_CHIPID:
flash = new NvmFlash( samba, ATSAMD21J15A_NAME, ATSAMD21J15A_FLASH_BASE, ATSAMD21J15A_FLASH_PAGES, ATSAMD21J15A_FLASH_PAGE_SIZE,
ATSAMD21J15A_FLASH_PLANES, ATSAMD21J15A_FLASH_LOCK_REGIONS,
ATSAMD21J15A_BUFFER_ADDR, ATSAMD21J15A_STACK_ADDR, ATSAMD21J15A_NVMCTRL_BASE, /*canBrownout*/true ) ;
break ;

case ATSAMD21G18A_CHIPID:
flash = new NvmFlash( samba, ATSAMD21G18A_NAME, ATSAMD21G18A_FLASH_BASE, ATSAMD21G18A_FLASH_PAGES, ATSAMD21G18A_FLASH_PAGE_SIZE,
ATSAMD21G18A_FLASH_PLANES, ATSAMD21G18A_FLASH_LOCK_REGIONS,
ATSAMD21G18A_BUFFER_ADDR, ATSAMD21G18A_STACK_ADDR, ATSAMD21G18A_NVMCTRL_BASE, /*canBrownout*/true ) ;
break ;

case ATSAMD21G17A_CHIPID:
flash = new NvmFlash( samba, ATSAMD21G17A_NAME, ATSAMD21G17A_FLASH_BASE, ATSAMD21G17A_FLASH_PAGES, ATSAMD21G17A_FLASH_PAGE_SIZE,
ATSAMD21G17A_FLASH_PLANES, ATSAMD21G17A_FLASH_LOCK_REGIONS,
ATSAMD21G17A_BUFFER_ADDR, ATSAMD21G17A_STACK_ADDR, ATSAMD21G17A_NVMCTRL_BASE, /*canBrownout*/true ) ;
break ;

case ATSAMD21G16A_CHIPID:
flash = new NvmFlash( samba, ATSAMD21G16A_NAME, ATSAMD21G16A_FLASH_BASE, ATSAMD21G16A_FLASH_PAGES, ATSAMD21G16A_FLASH_PAGE_SIZE,
ATSAMD21G16A_FLASH_PLANES, ATSAMD21G16A_FLASH_LOCK_REGIONS,
ATSAMD21G16A_BUFFER_ADDR, ATSAMD21G16A_STACK_ADDR, ATSAMD21G16A_NVMCTRL_BASE, /*canBrownout*/true ) ;
break ;

case ATSAMD21G15A_CHIPID:
flash = new NvmFlash( samba, ATSAMD21G15A_NAME, ATSAMD21G15A_FLASH_BASE, ATSAMD21G15A_FLASH_PAGES, ATSAMD21G15A_FLASH_PAGE_SIZE,
ATSAMD21G15A_FLASH_PLANES, ATSAMD21G15A_FLASH_LOCK_REGIONS,
ATSAMD21G15A_BUFFER_ADDR, ATSAMD21G15A_STACK_ADDR, ATSAMD21G15A_NVMCTRL_BASE, /*canBrownout*/true ) ;
break ;

case ATSAMD21E18A_CHIPID:
flash = new NvmFlash( samba, ATSAMD21E18A_NAME, ATSAMD21E18A_FLASH_BASE, ATSAMD21E18A_FLASH_PAGES, ATSAMD21E18A_FLASH_PAGE_SIZE,
ATSAMD21E18A_FLASH_PLANES, ATSAMD21E18A_FLASH_LOCK_REGIONS,
ATSAMD21E18A_BUFFER_ADDR, ATSAMD21E18A_STACK_ADDR, ATSAMD21E18A_NVMCTRL_BASE, /*canBrownout*/true ) ;
break ;

case ATSAMD21E17A_CHIPID:
flash = new NvmFlash( samba, ATSAMD21E17A_NAME, ATSAMD21E17A_FLASH_BASE, ATSAMD21E17A_FLASH_PAGES, ATSAMD21E17A_FLASH_PAGE_SIZE,
ATSAMD21E17A_FLASH_PLANES, ATSAMD21E17A_FLASH_LOCK_REGIONS,
ATSAMD21E17A_BUFFER_ADDR, ATSAMD21E17A_STACK_ADDR, ATSAMD21E17A_NVMCTRL_BASE, /*canBrownout*/true ) ;
break ;

case ATSAMD21E16A_CHIPID:
flash = new NvmFlash( samba, ATSAMD21E16A_NAME, ATSAMD21E16A_FLASH_BASE, ATSAMD21E16A_FLASH_PAGES, ATSAMD21E16A_FLASH_PAGE_SIZE,
ATSAMD21E16A_FLASH_PLANES, ATSAMD21E16A_FLASH_LOCK_REGIONS,
ATSAMD21E16A_BUFFER_ADDR, ATSAMD21E16A_STACK_ADDR, ATSAMD21E16A_NVMCTRL_BASE, /*canBrownout*/true ) ;
break ;

case ATSAMD21E15A_CHIPID:
flash = new NvmFlash( samba, ATSAMD21E15A_NAME, ATSAMD21E15A_FLASH_BASE, ATSAMD21E15A_FLASH_PAGES, ATSAMD21E15A_FLASH_PAGE_SIZE,
ATSAMD21E15A_FLASH_PLANES, ATSAMD21E15A_FLASH_LOCK_REGIONS,
ATSAMD21E15A_BUFFER_ADDR, ATSAMD21E15A_STACK_ADDR, ATSAMD21E15A_NVMCTRL_BASE, /*canBrownout*/true ) ;
break ;

case ATSAMD11D14AM_CHIPID:
flash = new NvmFlash( samba, ATSAMD11D14AM_NAME, ATSAMD11D14AM_FLASH_BASE, ATSAMD11D14AM_FLASH_PAGES, ATSAMD11D14AM_FLASH_PAGE_SIZE,
ATSAMD11D14AM_FLASH_PLANES, ATSAMD11D14AM_FLASH_LOCK_REGIONS,
ATSAMD11D14AM_BUFFER_ADDR, ATSAMD11D14AM_STACK_ADDR, ATSAMD11D14AM_NVMCTRL_BASE, /*canBrownout*/true ) ;
break ;

case ATSAMD11D14AS_CHIPID:
flash = new NvmFlash( samba, ATSAMD11D14AS_NAME, ATSAMD11D14AS_FLASH_BASE, ATSAMD11D14AS_FLASH_PAGES, ATSAMD11D14AS_FLASH_PAGE_SIZE,
ATSAMD11D14AS_FLASH_PLANES, ATSAMD11D14AS_FLASH_LOCK_REGIONS,
ATSAMD11D14AS_BUFFER_ADDR, ATSAMD11D14AS_STACK_ADDR, ATSAMD11D14AS_NVMCTRL_BASE, /*canBrownout*/true ) ;
break ;

case ATSAMD11C14A_CHIPID:
flash = new NvmFlash( samba, ATSAMD11C14A_NAME, ATSAMD11C14A_FLASH_BASE, ATSAMD11C14A_FLASH_PAGES, ATSAMD11C14A_FLASH_PAGE_SIZE,
ATSAMD11C14A_FLASH_PLANES, ATSAMD11C14A_FLASH_LOCK_REGIONS,
ATSAMD11C14A_BUFFER_ADDR, ATSAMD11C14A_STACK_ADDR, ATSAMD11C14A_NVMCTRL_BASE, /*canBrownout*/true ) ;
break ;

case ATSAMR21E18A_CHIPID:
flash = new NvmFlash( samba, ATSAMR21E18A_NAME, ATSAMR21E18A_FLASH_BASE, ATSAMR21E18A_FLASH_PAGES, ATSAMR21E18A_FLASH_PAGE_SIZE,
ATSAMR21E18A_FLASH_PLANES, ATSAMR21E18A_FLASH_LOCK_REGIONS,
ATSAMR21E18A_BUFFER_ADDR, ATSAMR21E18A_STACK_ADDR, ATSAMR21E18A_NVMCTRL_BASE, /*canBrownout*/true ) ;
break;
break ;

//
// SAM7SE
//
Expand Down
4 changes: 2 additions & 2 deletions src/NvmFlash.cpp
Expand Up @@ -101,7 +101,7 @@ NvmFlash::~NvmFlash()
void
NvmFlash::eraseAll()
{
// Leave the first 8KB, where bootloader resides, erase the rest.
// Leave the first 8KB or 4KB, where bootloader resides, erase the rest.
// Row is a concept used for convinence. When writing you have to write
// page(s). When erasing you have to erase row(s).

Expand All @@ -116,7 +116,7 @@ NvmFlash::eraseAll()
// ...otherwise go with the legacy slow erase...

// Calculate the number of rows that samba occupies (should be 32 for 8KB/0x2000bytes).
uint32_t starting_row = ATSAMD_BOOTLOADER_SIZE / _size / ATSAMD_FLASH_ROW_PAGES;
uint32_t starting_row = _addr / _size / ATSAMD_FLASH_ROW_PAGES;
uint32_t total_rows = _pages / ATSAMD_FLASH_ROW_PAGES;

for (uint32_t row=starting_row; row<total_rows; row++)
Expand Down

0 comments on commit fcf8a70

Please sign in to comment.