From 8989353fabf82ac809d5d4db72b23324ec3b7669 Mon Sep 17 00:00:00 2001 From: Ryan V1 <55478432+V1EngineeringInc@users.noreply.github.com> Date: Sun, 4 Oct 2020 15:41:41 -0700 Subject: [PATCH] Fix Archim1 stepper timing (with new variant) (#19596) --- buildroot/share/PlatformIO/boards/archim.json | 59 ++ .../PlatformIO/variants/archim/.gitignore | 2 + .../variants/archim/build_gcc/Makefile | 42 ++ .../variants/archim/build_gcc/debug.mk | 25 + .../variants/archim/build_gcc/gcc.mk | 82 +++ .../build_gcc/libvariant_arduino_due_x.mk | 184 ++++++ .../variants/archim/build_gcc/release.mk | 25 + .../debug_scripts/gcc/arduino_due_x_flash.gdb | 37 ++ .../debug_scripts/gcc/arduino_due_x_sram.gdb | 37 ++ .../debug_scripts/iar/arduino_due_flash.mac | 44 ++ .../debug_scripts/iar/arduino_due_sram.mac | 44 ++ .../variants/archim/libsam_sam3x8e_gcc_rel.a | Bin 0 -> 117430 bytes .../archim/libsam_sam3x8e_gcc_rel.a.txt | 576 ++++++++++++++++++ .../archim/linker_scripts/gcc/flash.ld | 146 +++++ .../archim/linker_scripts/gcc/sram.ld | 145 +++++ .../archim/linker_scripts/iar/flash.icf | 49 ++ .../archim/linker_scripts/iar/sram.icf | 33 + .../PlatformIO/variants/archim/pins_arduino.h | 21 + .../PlatformIO/variants/archim/variant.cpp | 485 +++++++++++++++ .../PlatformIO/variants/archim/variant.h | 284 +++++++++ platformio.ini | 2 + 21 files changed, 2322 insertions(+) create mode 100644 buildroot/share/PlatformIO/boards/archim.json create mode 100644 buildroot/share/PlatformIO/variants/archim/.gitignore create mode 100644 buildroot/share/PlatformIO/variants/archim/build_gcc/Makefile create mode 100644 buildroot/share/PlatformIO/variants/archim/build_gcc/debug.mk create mode 100644 buildroot/share/PlatformIO/variants/archim/build_gcc/gcc.mk create mode 100644 buildroot/share/PlatformIO/variants/archim/build_gcc/libvariant_arduino_due_x.mk create mode 100644 buildroot/share/PlatformIO/variants/archim/build_gcc/release.mk create mode 100644 buildroot/share/PlatformIO/variants/archim/debug_scripts/gcc/arduino_due_x_flash.gdb create mode 100644 buildroot/share/PlatformIO/variants/archim/debug_scripts/gcc/arduino_due_x_sram.gdb create mode 100644 buildroot/share/PlatformIO/variants/archim/debug_scripts/iar/arduino_due_flash.mac create mode 100644 buildroot/share/PlatformIO/variants/archim/debug_scripts/iar/arduino_due_sram.mac create mode 100644 buildroot/share/PlatformIO/variants/archim/libsam_sam3x8e_gcc_rel.a create mode 100644 buildroot/share/PlatformIO/variants/archim/libsam_sam3x8e_gcc_rel.a.txt create mode 100644 buildroot/share/PlatformIO/variants/archim/linker_scripts/gcc/flash.ld create mode 100644 buildroot/share/PlatformIO/variants/archim/linker_scripts/gcc/sram.ld create mode 100644 buildroot/share/PlatformIO/variants/archim/linker_scripts/iar/flash.icf create mode 100644 buildroot/share/PlatformIO/variants/archim/linker_scripts/iar/sram.icf create mode 100644 buildroot/share/PlatformIO/variants/archim/pins_arduino.h create mode 100644 buildroot/share/PlatformIO/variants/archim/variant.cpp create mode 100644 buildroot/share/PlatformIO/variants/archim/variant.h diff --git a/buildroot/share/PlatformIO/boards/archim.json b/buildroot/share/PlatformIO/boards/archim.json new file mode 100644 index 000000000..60035197f --- /dev/null +++ b/buildroot/share/PlatformIO/boards/archim.json @@ -0,0 +1,59 @@ +{ + "build": { + "core": "arduino", + "cpu": "cortex-m3", + "extra_flags": "-D__SAM3X8E__ -DARDUINO_ARCH_SAM -DARDUINO_SAM_DUE", + "f_cpu": "84000000L", + "hwids": [ + [ + "0x27B1", + "0x0001" + ], + [ + "0x2341", + "0x003E" + ], + [ + "0x2341", + "0x003D" + ] + ], + "ldscript": "linker_scripts/gcc/flash.ld", + "mcu": "at91sam3x8e", + "usb_product": "Archim", + "variant": "archim" + }, + "connectivity": [ + "can" + ], + "debug": { + "jlink_device": "ATSAM3X8E", + "openocd_chipname": "at91sam3X8E", + "openocd_target": "at91sam3XXX", + "svd_path": "ATSAM3X8E.svd" + }, + "frameworks": [ + "arduino", + "simba" + ], + "name": "Archim", + "upload": { + "disable_flushing": true, + "maximum_ram_size": 98304, + "maximum_size": 524288, + "native_usb": true, + "protocol": "sam-ba", + "protocols": [ + "sam-ba", + "jlink", + "blackmagic", + "atmel-ice", + "stlink" + ], + "require_upload_port": true, + "use_1200bps_touch": true, + "wait_for_upload_port": true + }, + "url": "https://ultimachine.com", + "vendor": "UltiMachine" +} diff --git a/buildroot/share/PlatformIO/variants/archim/.gitignore b/buildroot/share/PlatformIO/variants/archim/.gitignore new file mode 100644 index 000000000..2827c7d4f --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/.gitignore @@ -0,0 +1,2 @@ +# Exception for libsam +!libsam_sam3x8e_gcc_rel.a diff --git a/buildroot/share/PlatformIO/variants/archim/build_gcc/Makefile b/buildroot/share/PlatformIO/variants/archim/build_gcc/Makefile new file mode 100644 index 000000000..4332f3608 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/build_gcc/Makefile @@ -0,0 +1,42 @@ +# +# Copyright (c) 2011 Arduino. All right reserved. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# + +SUBMAKE_OPTIONS=--no-builtin-rules --no-builtin-variables --no-print-directory + +#------------------------------------------------------------------------------- +# Rules +#------------------------------------------------------------------------------- + +all: arduino_due_x + +.PHONY: arduino_due_x +arduino_due_x: + @echo ------------------------------------------------------------------------------------ + @echo --- Making variant arduino_due_x + @$(MAKE) DEBUG=1 $(SUBMAKE_OPTIONS) -f libvariant_arduino_due_x.mk +# @$(MAKE) $(SUBMAKE_OPTIONS) -f libvariant_arduino_due_x.mk + @echo ------------------------------------------------------------------------------------ + +.PHONY: clean +clean: + @echo ------------------------------------------------------------------------------------ + @echo --- Cleaning variant arduino_due_x + @$(MAKE) DEBUG=1 $(SUBMAKE_OPTIONS) -f libvariant_arduino_due_x.mk $@ +# @$(MAKE) $(SUBMAKE_OPTIONS) -f libvariant_arduino_due_x.mk $@ + @echo ------------------------------------------------------------------------------------ + diff --git a/buildroot/share/PlatformIO/variants/archim/build_gcc/debug.mk b/buildroot/share/PlatformIO/variants/archim/build_gcc/debug.mk new file mode 100644 index 000000000..d0716744a --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/build_gcc/debug.mk @@ -0,0 +1,25 @@ +# +# Copyright (c) 2011 Arduino. All right reserved. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# + +# Optimization level +# -O1 Optimize +# -O2 Optimize even more +# -O3 Optimize yet more +# -O0 Reduce compilation time and make debugging produce the expected results +# -Os Optimize for size +OPTIMIZATION = -g -O0 -DDEBUG diff --git a/buildroot/share/PlatformIO/variants/archim/build_gcc/gcc.mk b/buildroot/share/PlatformIO/variants/archim/build_gcc/gcc.mk new file mode 100644 index 000000000..32f35d264 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/build_gcc/gcc.mk @@ -0,0 +1,82 @@ +# +# Copyright (c) 2011 Arduino. All right reserved. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# + +# Tool suffix when cross-compiling +CROSS_COMPILE = $(ARM_GCC_TOOLCHAIN)/arm-none-eabi- + +# Compilation tools +AR = $(CROSS_COMPILE)ar +CC = $(CROSS_COMPILE)gcc +CXX = $(CROSS_COMPILE)g++ +AS = $(CROSS_COMPILE)as +NM = $(CROSS_COMPILE)nm +ifeq ($(OS),Windows_NT) +RM=cs-rm -Rf +else +RM=rm -Rf +endif + +SEP=\\ + +# --------------------------------------------------------------------------------------- +# C Flags + +CFLAGS += -Wall -Wchar-subscripts -Wcomment -Wformat=2 -Wimplicit-int +CFLAGS += -Werror-implicit-function-declaration -Wmain -Wparentheses +CFLAGS += -Wsequence-point -Wreturn-type -Wswitch -Wtrigraphs -Wunused +CFLAGS += -Wuninitialized -Wunknown-pragmas -Wfloat-equal -Wundef +CFLAGS += -Wshadow -Wpointer-arith -Wbad-function-cast -Wwrite-strings +CFLAGS += -Wsign-compare -Waggregate-return -Wstrict-prototypes +CFLAGS += -Wmissing-prototypes -Wmissing-declarations +CFLAGS += -Wformat -Wmissing-format-attribute -Wno-deprecated-declarations +CFLAGS += -Wpacked -Wredundant-decls -Wnested-externs -Winline -Wlong-long +CFLAGS += -Wunreachable-code +CFLAGS += -Wcast-align +#CFLAGS += -Wmissing-noreturn +#CFLAGS += -Wconversion + +CFLAGS += --param max-inline-insns-single=500 -mcpu=cortex-m3 -mthumb -mlong-calls -ffunction-sections -fdata-sections -nostdlib -std=c99 +CFLAGS += $(OPTIMIZATION) $(INCLUDES) -D$(CHIP) -D$(VARIANT) + +# To reduce application size use only integer printf function. +CFLAGS += -Dprintf=iprintf + +# --------------------------------------------------------------------------------------- +# CPP Flags + +CPPFLAGS += -Wall -Wchar-subscripts -Wcomment -Wformat=2 +CPPFLAGS += -Wmain -Wparentheses -Wcast-align -Wunreachable-code +CPPFLAGS += -Wsequence-point -Wreturn-type -Wswitch -Wtrigraphs -Wunused +CPPFLAGS += -Wuninitialized -Wunknown-pragmas -Wfloat-equal -Wundef +CPPFLAGS += -Wshadow -Wpointer-arith -Wwrite-strings +CPPFLAGS += -Wsign-compare -Waggregate-return -Wmissing-declarations +CPPFLAGS += -Wformat -Wmissing-format-attribute -Wno-deprecated-declarations +CPPFLAGS += -Wpacked -Wredundant-decls -Winline -Wlong-long +#CPPFLAGS += -Wmissing-noreturn +#CPPFLAGS += -Wconversion + +CPPFLAGS += --param max-inline-insns-single=500 -mcpu=cortex-m3 -mthumb -mlong-calls -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions -std=c++98 +CPPFLAGS += $(OPTIMIZATION) $(INCLUDES) -D$(CHIP) + +# To reduce application size use only integer printf function. +CPPFLAGS += -Dprintf=iprintf + +# --------------------------------------------------------------------------------------- +# ASM Flags + +ASFLAGS = -mcpu=cortex-m3 -mthumb -Wall -g $(OPTIMIZATION) $(INCLUDES) diff --git a/buildroot/share/PlatformIO/variants/archim/build_gcc/libvariant_arduino_due_x.mk b/buildroot/share/PlatformIO/variants/archim/build_gcc/libvariant_arduino_due_x.mk new file mode 100644 index 000000000..3f8b1b760 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/build_gcc/libvariant_arduino_due_x.mk @@ -0,0 +1,184 @@ +# +# Copyright (c) 2012 Arduino. All right reserved. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# + +# Makefile for compiling libArduino +.SUFFIXES: .o .a .c .s + +CHIP=__SAM3X8E__ +VARIANT=arduino_due_x +LIBNAME=libvariant_$(VARIANT) +TOOLCHAIN=gcc + +#------------------------------------------------------------------------------- +# Path +#------------------------------------------------------------------------------- + +# Output directories +OUTPUT_BIN = ../../../cores/arduino + +# Libraries +PROJECT_BASE_PATH = .. +SYSTEM_PATH = ../../../system +CMSIS_ROOT_PATH = $(SYSTEM_PATH)/CMSIS +CMSIS_ARM_PATH=$(CMSIS_ROOT_PATH)/CMSIS/Include +CMSIS_ATMEL_PATH=$(CMSIS_ROOT_PATH)/Device/ATMEL +#CMSIS_CHIP_PATH=$(CMSIS_ROOT_PATH)/Device/ATMEL/$(CHIP_SERIE) + +ARDUINO_PATH = ../../../cores/arduino +VARIANT_BASE_PATH = ../../../variants +VARIANT_PATH = ../../../variants/$(VARIANT) + +#------------------------------------------------------------------------------- +# Files +#------------------------------------------------------------------------------- + +#vpath %.h $(PROJECT_BASE_PATH) $(SYSTEM_PATH) $(VARIANT_PATH) +vpath %.cpp $(PROJECT_BASE_PATH) + +VPATH+=$(PROJECT_BASE_PATH) + +INCLUDES = +#INCLUDES += -I$(PROJECT_BASE_PATH) +INCLUDES += -I$(ARDUINO_PATH) +INCLUDES += -I$(ARDUINO_PATH)/USB +INCLUDES += -I$(SYSTEM_PATH) +INCLUDES += -I$(SYSTEM_PATH)/libsam +INCLUDES += -I$(SYSTEM_PATH)/USBHost +INCLUDES += -I$(VARIANT_BASE_PATH) +INCLUDES += -I$(VARIANT_PATH) +INCLUDES += -I$(CMSIS_ARM_PATH) +INCLUDES += -I$(CMSIS_ATMEL_PATH) + +#------------------------------------------------------------------------------- +ifdef DEBUG +include debug.mk +else +include release.mk +endif + +#------------------------------------------------------------------------------- +# Tools +#------------------------------------------------------------------------------- + +include $(TOOLCHAIN).mk + +#------------------------------------------------------------------------------- +ifdef DEBUG +OUTPUT_OBJ=debug +OUTPUT_LIB_POSTFIX=dbg +else +OUTPUT_OBJ=release +OUTPUT_LIB_POSTFIX=rel +endif + +OUTPUT_LIB=$(LIBNAME)_$(TOOLCHAIN)_$(OUTPUT_LIB_POSTFIX).a +OUTPUT_PATH=$(OUTPUT_OBJ)_$(VARIANT) + +#------------------------------------------------------------------------------- +# C source files and objects +#------------------------------------------------------------------------------- +C_SRC=$(wildcard $(PROJECT_BASE_PATH)/*.c) + +C_OBJ_TEMP = $(patsubst %.c, %.o, $(notdir $(C_SRC))) + +# during development, remove some files +C_OBJ_FILTER= + +C_OBJ=$(filter-out $(C_OBJ_FILTER), $(C_OBJ_TEMP)) + +#------------------------------------------------------------------------------- +# CPP source files and objects +#------------------------------------------------------------------------------- +CPP_SRC=$(wildcard $(PROJECT_BASE_PATH)/*.cpp) + +CPP_OBJ_TEMP = $(patsubst %.cpp, %.o, $(notdir $(CPP_SRC))) + +# during development, remove some files +CPP_OBJ_FILTER= + +CPP_OBJ=$(filter-out $(CPP_OBJ_FILTER), $(CPP_OBJ_TEMP)) + +#------------------------------------------------------------------------------- +# Assembler source files and objects +#------------------------------------------------------------------------------- +A_SRC=$(wildcard $(PROJECT_BASE_PATH)/*.s) + +A_OBJ_TEMP=$(patsubst %.s, %.o, $(notdir $(A_SRC))) + +# during development, remove some files +A_OBJ_FILTER= + +A_OBJ=$(filter-out $(A_OBJ_FILTER), $(A_OBJ_TEMP)) + +#------------------------------------------------------------------------------- +# Rules +#------------------------------------------------------------------------------- +all: $(VARIANT) + +$(VARIANT): create_output $(OUTPUT_LIB) + +.PHONY: create_output +create_output: + @echo ------------------------------------------------------------------------------------ + @echo ------------------------- + @echo --- Preparing variant $(VARIANT) files in $(OUTPUT_PATH) $(OUTPUT_BIN) + @echo ------------------------- +# @echo *$(INCLUDES) +# @echo ------------------------- +# @echo *$(C_SRC) +# @echo ------------------------- +# @echo *$(C_OBJ) +# @echo ------------------------- +# @echo *$(addprefix $(OUTPUT_PATH)/, $(C_OBJ)) +# @echo ------------------------- +# @echo *$(CPP_SRC) +# @echo ------------------------- +# @echo *$(CPP_OBJ) +# @echo ------------------------- +# @echo *$(addprefix $(OUTPUT_PATH)/, $(CPP_OBJ)) +# @echo ------------------------- +# @echo *$(A_SRC) +# @echo ------------------------- + + -@mkdir $(OUTPUT_PATH) 1>NUL 2>&1 + @echo ------------------------------------------------------------------------------------ + +$(addprefix $(OUTPUT_PATH)/,$(C_OBJ)): $(OUTPUT_PATH)/%.o: %.c +# @"$(CC)" -v -c $(CFLAGS) $< -o $@ + @"$(CC)" -c $(CFLAGS) $< -o $@ + +$(addprefix $(OUTPUT_PATH)/,$(CPP_OBJ)): $(OUTPUT_PATH)/%.o: %.cpp +# @"$(CC)" -c $(CPPFLAGS) $< -o $@ + @"$(CC)" -xc++ -c $(CPPFLAGS) $< -o $@ + +$(addprefix $(OUTPUT_PATH)/,$(A_OBJ)): $(OUTPUT_PATH)/%.o: %.s + @"$(AS)" -c $(ASFLAGS) $< -o $@ + +$(OUTPUT_LIB): $(addprefix $(OUTPUT_PATH)/, $(C_OBJ)) $(addprefix $(OUTPUT_PATH)/, $(CPP_OBJ)) $(addprefix $(OUTPUT_PATH)/, $(A_OBJ)) + @"$(AR)" -v -r "$(OUTPUT_BIN)/$@" $^ + @"$(NM)" "$(OUTPUT_BIN)/$@" > "$(OUTPUT_BIN)/$@.txt" + + +.PHONY: clean +clean: + @echo ------------------------------------------------------------------------------------ + @echo --- Cleaning $(VARIANT) files [$(OUTPUT_PATH)$(SEP)*.o] + -@$(RM) $(OUTPUT_PATH) 1>NUL 2>&1 + -@$(RM) $(OUTPUT_BIN)/$(OUTPUT_LIB) 1>NUL 2>&1 + @echo ------------------------------------------------------------------------------------ + diff --git a/buildroot/share/PlatformIO/variants/archim/build_gcc/release.mk b/buildroot/share/PlatformIO/variants/archim/build_gcc/release.mk new file mode 100644 index 000000000..0d15157f4 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/build_gcc/release.mk @@ -0,0 +1,25 @@ +# +# Copyright (c) 2011 Arduino. All right reserved. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# + +# Optimization level +# -O1 Optimize +# -O2 Optimize even more +# -O3 Optimize yet more +# -O0 Reduce compilation time and make debugging produce the expected results +# -Os Optimize for size +OPTIMIZATION = -Os diff --git a/buildroot/share/PlatformIO/variants/archim/debug_scripts/gcc/arduino_due_x_flash.gdb b/buildroot/share/PlatformIO/variants/archim/debug_scripts/gcc/arduino_due_x_flash.gdb new file mode 100644 index 000000000..4e8375b5f --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/debug_scripts/gcc/arduino_due_x_flash.gdb @@ -0,0 +1,37 @@ +#******************************************************* +# +# Connect to J-Link and debug application in flash on SAM3X. +# + +# Define 'reset' command +define reset + +# Connect to the J-Link gdb server +target remote localhost:2331 + +# Reset the chip to get to a known state +monitor reset + +# Select flash device +monitor flash device = AT91SAM3X8E + +# Enable flash download and flash breakpoints +monitor flash download = 1 + +# Load the program +load + +# Reset peripheral (RSTC_CR) +set *0x400e1a00 = 0xA5000004 + +# Initialize PC and stack pointer +mon reg sp=(0x80000) +#set *0x80004 = *0x80004 & 0xFFFFFFFE +mon reg pc=(0x80004) + +info reg + +break main + +# End of 'reset' command +end diff --git a/buildroot/share/PlatformIO/variants/archim/debug_scripts/gcc/arduino_due_x_sram.gdb b/buildroot/share/PlatformIO/variants/archim/debug_scripts/gcc/arduino_due_x_sram.gdb new file mode 100644 index 000000000..15a1792a9 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/debug_scripts/gcc/arduino_due_x_sram.gdb @@ -0,0 +1,37 @@ +#******************************************************* +# +# Connect to J-Link and debug application in sram on SAM3X. +# + +# Define 'reset' command +define reset + +# Connect to the J-Link gdb server +target remote localhost:2331 + +# Reset the chip to get to a known state +monitor reset + +# Select flash device +monitor flash device = AT91SAM3X8E + +# Enable flash download and flash breakpoints +monitor flash download = 1 + +# Load the program +load + +# Reset peripheral (RSTC_CR) +set *0x400e1a00 = 0xA5000004 + +# Initialize PC and stack pointer +mon reg sp=(0x20000000) +#set *0x20000004 = *0x20000004 & 0xFFFFFFFE +mon reg pc=(0x20000004) + +info reg + +break main + +# End of 'reset' command +end diff --git a/buildroot/share/PlatformIO/variants/archim/debug_scripts/iar/arduino_due_flash.mac b/buildroot/share/PlatformIO/variants/archim/debug_scripts/iar/arduino_due_flash.mac new file mode 100644 index 000000000..959583582 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/debug_scripts/iar/arduino_due_flash.mac @@ -0,0 +1,44 @@ +// --------------------------------------------------------- +// ATMEL Microcontroller Software Support - ROUSSET - +// --------------------------------------------------------- +// The software is delivered "AS IS" without warranty or +// condition of any kind, either express, implied or +// statutory. This includes without limitation any warranty +// or condition with respect to merchantability or fitness +// for any particular purpose, or against the infringements of +// intellectual property rights of others. +// --------------------------------------------------------- +// File: at91sam3u-ek-flash.mac +// User setup file for CSPY debugger. +// --------------------------------------------------------- +__var __mac_i; +__var __mac_pt; + +/********************************************************************* +* +* execUserReset() +*/ +execUserReset() +{ + __message "------------------------------ execUserReset ---------------------------------"; + __message "-------------------------------Set PC Reset ----------------------------------"; + + __hwReset(0); + + // perpheral reset RSTC_CR + __writeMemory32(0xA5000004,0x400e1200,"Memory"); +} + +/********************************************************************* +* +* execUserPreload() +*/ +execUserPreload() +{ + __message "------------------------------ execUserPreload ---------------------------------"; + + __hwReset(0); //* Hardware Reset: CPU is automatically halted after the reset + + // perpheral reset RSTC_CR + __writeMemory32(0xA5000004,0x400e1200,"Memory"); +} diff --git a/buildroot/share/PlatformIO/variants/archim/debug_scripts/iar/arduino_due_sram.mac b/buildroot/share/PlatformIO/variants/archim/debug_scripts/iar/arduino_due_sram.mac new file mode 100644 index 000000000..ba86029d3 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/debug_scripts/iar/arduino_due_sram.mac @@ -0,0 +1,44 @@ +// --------------------------------------------------------- +// ATMEL Microcontroller Software Support - ROUSSET - +// --------------------------------------------------------- +// The software is delivered "AS IS" without warranty or +// condition of any kind, either express, implied or +// statutory. This includes without limitation any warranty +// or condition with respect to merchantability or fitness +// for any particular purpose, or against the infringements of +// intellectual property rights of others. +// --------------------------------------------------------- +// File: at91sam3u-ek-sram.mac +// User setup file for CSPY debugger. +// --------------------------------------------------------- +__var __mac_i; +__var __mac_pt; + +/********************************************************************* +* +* execUserReset() +*/ +execUserReset() +{ + __message "------------------------------ execUserReset ---------------------------------"; + __message "-------------------------------Set PC Reset ----------------------------------"; + + //__hwReset(50); + + // perpheral reset RSTC_CR + __writeMemory32(0xA5000004,0x400e1200,"Memory"); +} + +/********************************************************************* +* +* execUserPreload() +*/ +execUserPreload() +{ + __message "------------------------------ execUserPreload ---------------------------------"; + + __hwReset(0); //* Hardware Reset: CPU is automatically halted after the reset + + // perpheral reset RSTC_CR + __writeMemory32(0xA5000004,0x400e1200,"Memory"); +} diff --git a/buildroot/share/PlatformIO/variants/archim/libsam_sam3x8e_gcc_rel.a b/buildroot/share/PlatformIO/variants/archim/libsam_sam3x8e_gcc_rel.a new file mode 100644 index 0000000000000000000000000000000000000000..3e25e6cabd1e3367a2031f76fbb34cc4a1e43d44 GIT binary patch literal 117430 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 rom + + /* .ARM.exidx is sorted, so has to go in its own output section. */ + PROVIDE_HIDDEN (__exidx_start = .); + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > rom + PROVIDE_HIDDEN (__exidx_end = .); + + . = ALIGN(4); + _etext = .; + + .relocate : AT (_etext) + { + . = ALIGN(4); + _srelocate = .; + *(.ramfunc .ramfunc.*); + *(.data .data.*); + . = ALIGN(4); + _erelocate = .; + } > ram + + /* .bss section which is used for uninitialized data */ + .bss ALIGN(4) (NOLOAD) : + { + . = ALIGN(4); + _sbss = . ; + _szero = .; + *(.bss .bss.*) + *(COMMON) + . = ALIGN(4); + _ebss = . ; + _ezero = .; + } > ram + + . = ALIGN(4); + _end = . ; + + /* .stack_dummy section doesn't contains any symbols. It is only + used for linker to calculate size of stack sections, and assign + values to stack symbols later */ + .stack_dummy : + { + *(.stack*) + } > ram + + /* Set stack top to end of ram, and stack limit move down by + * size of stack_dummy section */ + __StackTop = ORIGIN(ram) + LENGTH(ram); + __StackLimit = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(_sstack = __StackLimit); + PROVIDE(_estack = __StackTop); +} diff --git a/buildroot/share/PlatformIO/variants/archim/linker_scripts/gcc/sram.ld b/buildroot/share/PlatformIO/variants/archim/linker_scripts/gcc/sram.ld new file mode 100644 index 000000000..2a0d54e17 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/linker_scripts/gcc/sram.ld @@ -0,0 +1,145 @@ +/* ---------------------------------------------------------------------------- + * SAM Software Package License + * ---------------------------------------------------------------------------- + * Copyright (c) 2012, Atmel Corporation + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following condition is met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the disclaimer below. + * + * Atmel's name may not be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * ---------------------------------------------------------------------------- + */ + +OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") +OUTPUT_ARCH(arm) +SEARCH_DIR(.) + +/* Memory Spaces Definitions */ +MEMORY +{ + rom (rx) : ORIGIN = 0x00080000, LENGTH = 0x00080000 /* Flash, 512K */ + sram0 (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00010000 /* sram0, 64K */ + sram1 (rwx) : ORIGIN = 0x20080000, LENGTH = 0x00008000 /* sram1, 32K */ + ram (rwx) : ORIGIN = 0x20070000, LENGTH = 0x00018000 /* sram, 96K */ +} + +/* The stack size used by the application. NOTE: you need to adjust */ +STACK_SIZE = DEFINED(STACK_SIZE) ? STACK_SIZE : 0x2000 ; + +/* Section Definitions */ +SECTIONS +{ + .text : + { + . = ALIGN(4); + _sfixed = .; + KEEP(*(.vectors .vectors.*)) + *(.text .text.* .gnu.linkonce.t.*) + *(.glue_7t) *(.glue_7) + *(.rodata .rodata* .gnu.linkonce.r.*) + *(.ARM.extab* .gnu.linkonce.armextab.*) + + /* Support C constructors, and C destructors in both user code + and the C library. This also provides support for C++ code. */ + . = ALIGN(4); + KEEP(*(.init)) + . = ALIGN(4); + __preinit_array_start = .; + KEEP (*(.preinit_array)) + __preinit_array_end = .; + + . = ALIGN(4); + __init_array_start = .; + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + __init_array_end = .; + + . = ALIGN(0x4); + KEEP (*crtbegin.o(.ctors)) + KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*crtend.o(.ctors)) + + . = ALIGN(4); + KEEP(*(.fini)) + + . = ALIGN(4); + __fini_array_start = .; + KEEP (*(.fini_array)) + KEEP (*(SORT(.fini_array.*))) + __fini_array_end = .; + + KEEP (*crtbegin.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*crtend.o(.dtors)) + + . = ALIGN(4); + _efixed = .; /* End of text section */ + } > ram + + . = ALIGN(4); + _etext = .; + + .relocate : AT (_etext) + { + . = ALIGN(4); + _srelocate = .; + *(.ramfunc .ramfunc.*); + *(.data .data.*); + . = ALIGN(4); + _erelocate = .; + } > ram + + /* .bss section which is used for uninitialized data */ + .bss (NOLOAD) : + { + . = ALIGN(4); + _sbss = . ; + _szero = .; + *(.bss .bss.*) + *(COMMON) + . = ALIGN(4); + _ebss = . ; + _ezero = .; + } > ram + + /* stack section */ + .stack (NOLOAD): + { + . = ALIGN(8); + _sstack = .; + . = . + STACK_SIZE; + . = ALIGN(8); + _estack = .; + } > ram + + /* .ARM.exidx is sorted, so has to go in its own output section. */ + PROVIDE_HIDDEN (__exidx_start = .); + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > ram + PROVIDE_HIDDEN (__exidx_end = .); + + . = ALIGN(4); + _end = . ; +} + diff --git a/buildroot/share/PlatformIO/variants/archim/linker_scripts/iar/flash.icf b/buildroot/share/PlatformIO/variants/archim/linker_scripts/iar/flash.icf new file mode 100644 index 000000000..956230fbd --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/linker_scripts/iar/flash.icf @@ -0,0 +1,49 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */ +/*-Vector table start*/ +define symbol __ICFEDIT_vector_start__ = 0x00080000; /*Add for CMSIS*/ +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_RAM0_start__ = 0x20000000; +define symbol __ICFEDIT_region_RAM0_end__ = 0x20007FFF; +define symbol __ICFEDIT_region_RAM1_start__ = 0x20080000; +define symbol __ICFEDIT_region_RAM1_end__ = 0x20083FFF; +define symbol __ICFEDIT_region_ROM0_start__ = 0x00080000; +define symbol __ICFEDIT_region_ROM0_end__ = 0x0009FFFF; +define symbol __ICFEDIT_region_ROM1_start__ = 0x00100000; +define symbol __ICFEDIT_region_ROM1_end__ = 0x0011FFFF; +/*-Sizes-*/ +/*define symbol __ICFEDIT_size_cstack__ = 0x1000;*//*for nandflash*/ +define symbol __ICFEDIT_size_cstack__ = 0x2000; +define symbol __ICFEDIT_size_heap__ = 0x200; +/*-Specials-*/ +/*define symbol __ICFEDIT_region_RAM_VECT_start__ = __ICFEDIT_region_RAM0_start__;*/ /*Referenced for CMSIS*/ +/*define symbol __ICFEDIT_size_vectors__ = 0x100;*/ /*Referenced for CMSIS*/ +/*-Exports-*/ +/*export symbol __ICFEDIT_region_RAM_VECT_start__;*/ +export symbol __ICFEDIT_vector_start__; /*Add for CMSIS*/ +/**** End of ICF editor section. ###ICF###*/ + +define memory mem with size = 4G; +/*define region RAM_VECT_region = mem:[from __ICFEDIT_region_RAM_VECT_start__ size __ICFEDIT_size_vectors__];*/ /*Referenced for CMSIS*/ +/*define region RAM0_region = mem:[from __ICFEDIT_region_RAM0_start__+__ICFEDIT_size_vectors__ to __ICFEDIT_region_RAM0_end__];*/ /*Referenced for CMSIS*/ +define region RAM0_region = mem:[from __ICFEDIT_region_RAM0_start__ to __ICFEDIT_region_RAM0_end__]; +define region RAM1_region = mem:[from __ICFEDIT_region_RAM1_start__ to __ICFEDIT_region_RAM1_end__]; +/*define region RAM_region = mem:[from __ICFEDIT_region_RAM0_start__+__ICFEDIT_size_vectors__ to __ICFEDIT_region_RAM0_end__] | + mem:[from __ICFEDIT_region_RAM1_start__ to __ICFEDIT_region_RAM1_end__];*/ /*Referenced for CMSIS*/ +define region ROM0_region = mem:[from __ICFEDIT_region_ROM0_start__ to __ICFEDIT_region_ROM0_end__]; +define region ROM1_region = mem:[from __ICFEDIT_region_ROM1_start__ to __ICFEDIT_region_ROM1_end__]; + +/*define block RamVect with alignment = 8, size = __ICFEDIT_size_vectors__ { };*/ +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + +initialize by copy { readwrite }; +do not initialize { section .noinit }; + +/*place at start of ROM0_region { readonly section .vectors };*/ /*Referenced for CMSIS*/ +place at address mem:__ICFEDIT_vector_start__ { readonly section .intvec }; /*Add for CMSIS*/ +place in ROM0_region { readonly }; +place in RAM0_region { readwrite, block HEAP }; +place in RAM1_region { block CSTACK }; /* for nandflash*/ +/*place in RAM_VECT_region { block RamVect };*/ /*Referenced for CMSIS*/ \ No newline at end of file diff --git a/buildroot/share/PlatformIO/variants/archim/linker_scripts/iar/sram.icf b/buildroot/share/PlatformIO/variants/archim/linker_scripts/iar/sram.icf new file mode 100644 index 000000000..d7d33537a --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/linker_scripts/iar/sram.icf @@ -0,0 +1,33 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */ +/*-Vector table start*/ +define symbol __ICFEDIT_vector_start__ = 0x20000000; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_RAM0_start__ = 0x20000000; +define symbol __ICFEDIT_region_RAM0_end__ = 0x20007FFF; +define symbol __ICFEDIT_region_RAM1_start__ = 0x20080000; +define symbol __ICFEDIT_region_RAM1_end__ = 0x20083FFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x900; +define symbol __ICFEDIT_size_heap__ = 0x200; +/*-Exports-*/ +export symbol __ICFEDIT_vector_start__; +/**** End of ICF editor section. ###ICF###*/ + +define memory mem with size = 4G; +define region RAM0_region = mem:[from __ICFEDIT_region_RAM0_start__ to __ICFEDIT_region_RAM0_end__]; +define region RAM1_region = mem:[from __ICFEDIT_region_RAM1_start__ to __ICFEDIT_region_RAM1_end__]; +/*define region RAM_region = mem:[from __ICFEDIT_region_RAM0_start__+__ICFEDIT_size_vectors__ to __ICFEDIT_region_RAM0_end__] | + mem:[from __ICFEDIT_region_RAM1_start__ to __ICFEDIT_region_RAM1_end__];*/ + +/* define block RamVect with alignment = 8, size = __ICFEDIT_size_vectors__ { }; */ +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + +initialize by copy { readwrite }; +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_vector_start__ { readonly section .intvec }; +place in RAM0_region { readonly }; +place in RAM1_region { readwrite, block CSTACK, block HEAP }; diff --git a/buildroot/share/PlatformIO/variants/archim/pins_arduino.h b/buildroot/share/PlatformIO/variants/archim/pins_arduino.h new file mode 100644 index 000000000..4e279aa7b --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/pins_arduino.h @@ -0,0 +1,21 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +// API compatibility +#include "variant.h" + diff --git a/buildroot/share/PlatformIO/variants/archim/variant.cpp b/buildroot/share/PlatformIO/variants/archim/variant.cpp new file mode 100644 index 000000000..72ad45ef4 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/variant.cpp @@ -0,0 +1,485 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "variant.h" + +/* + * DUE Board pin | PORT | Label + * ----------------+--------+------- + * 0 | PA8 | "RX0" + * 1 | PA9 | "TX0" + * 2 TIOA0 | PB25 | + * 3 TIOA7 | PC28 | + * 4 NPCS1 | PA29 | + * TIOB6 | PC26 | + * 5 TIOA6 | PC25 | + * 6 PWML7 | PC24 | + * 7 PWML6 | PC23 | + * 8 PWML5 | PC22 | + * 9 PWML4 | PC21 | + * 10 NPCS0 | PA28 | + * TIOB7 | PC29 | + * 11 TIOA8 | PD7 | + * 12 TIOB8 | PD8 | + * 13 TIOB0 | PB27 | LED AMBER "L" + * 14 TXD3 | PD4 | "TX3" + * 15 RXD3 | PD5 | "RX3" + * 16 TXD1 | PA13 | "TX2" + * 17 RXD1 | PA12 | "RX2" + * 18 TXD0 | PA11 | "TX1" + * 19 RXD0 | PA10 | "RX1" + * 20 | PB12 | "SDA" + * 21 | PB13 | "SCL" + * 22 | PB26 | + * 23 | PA14 | + * 24 | PA15 | + * 25 | PD0 | + * 26 | PD1 | + * 27 | PD2 | + * 28 | PD3 | + * 29 | PD6 | + * 30 | PD9 | + * 31 | PA7 | + * 32 | PD10 | + * 33 | PC1 | + * 34 | PC2 | + * 35 | PC3 | + * 36 | PC4 | + * 37 | PC5 | + * 38 | PC6 | + * 39 | PC7 | + * 40 | PC8 | + * 41 | PC9 | + * 42 | PA19 | + * 43 | PA20 | + * 44 | PC19 | + * 45 | PC18 | + * 46 | PC17 | + * 47 | PC16 | + * 48 | PC15 | + * 49 | PC14 | + * 50 | PC13 | + * 51 | PC12 | + * 52 NPCS2 | PB21 | + * 53 | PB14 | + * 54 | PA16 | "A0" + * 55 | PA24 | "A1" + * 56 | PA23 | "A2" + * 57 | PA22 | "A3" + * 58 TIOB2 | PA6 | "A4" + * 69 | PA4 | "A5" + * 60 TIOB1 | PA3 | "A6" + * 61 TIOA1 | PA2 | "A7" + * 62 | PB17 | "A8" + * 63 | PB18 | "A9" + * 64 | PB19 | "A10" + * 65 | PB20 | "A11" + * 66 | PB15 | "DAC0" + * 67 | PB16 | "DAC1" + * 68 | PA1 | "CANRX" + * 69 | PA0 | "CANTX" + * 70 | PA17 | "SDA1" + * 71 | PA18 | "SCL1" + * 72 | PC30 | LED AMBER "RX" + * 73 | PA21 | LED AMBER "TX" + * 74 MISO | PA25 | + * 75 MOSI | PA26 | + * 76 SCLK | PA27 | + * 77 NPCS0 | PA28 | + * 78 NPCS3 | PB23 | unconnected! + * + * USB pin | PORT + * ----------------+-------- + * ID | PB11 + * VBOF | PB10 + * + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Pins descriptions + */ +extern const PinDescription g_APinDescription[]= +{ + // 0 .. 53 - Digital pins + // ---------------------- + // 0/1 - UART (Serial) + { PIOA, PIO_PA8A_URXD, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // URXD + { PIOA, PIO_PA9A_UTXD, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // UTXD + + // 2 + { PIOB, PIO_PB25B_TIOA0, ID_PIOB, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC0_CHA0 }, // TIOA0 + { PIOC, PIO_PC28B_TIOA7, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHA7 }, // TIOA7 + { PIOC, PIO_PC26B_TIOB6, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHB6 }, // TIOB6 + + // 5 + { PIOC, PIO_PC25B_TIOA6, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHA6 }, // TIOA6 + { PIOC, PIO_PC24B_PWML7, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH7, NOT_ON_TIMER }, // PWML7 + { PIOC, PIO_PC23B_PWML6, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH6, NOT_ON_TIMER }, // PWML6 + { PIOC, PIO_PC22B_PWML5, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH5, NOT_ON_TIMER }, // PWML5 + { PIOC, PIO_PC21B_PWML4, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH4, NOT_ON_TIMER }, // PWML4 + // 10 + { PIOC, PIO_PC29B_TIOB7, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHB7 }, // TIOB7 + { PIOD, PIO_PD7B_TIOA8, ID_PIOD, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHA8 }, // TIOA8 + { PIOD, PIO_PD8B_TIOB8, ID_PIOD, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHB8 }, // TIOB8 + + // 13 - AMBER LED + { PIOB, PIO_PB27B_TIOB0, ID_PIOB, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC0_CHB0 }, // TIOB0 + + // 14/15 - USART3 (Serial3) + { PIOD, PIO_PD4B_TXD3, ID_PIOD, PIO_PERIPH_B, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TXD3 + { PIOD, PIO_PD5B_RXD3, ID_PIOD, PIO_PERIPH_B, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // RXD3 + + // 16/17 - USART1 (Serial2) + { PIOA, PIO_PA13A_TXD1, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TXD1 + { PIOA, PIO_PA12A_RXD1, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // RXD1 + + // 18/19 - USART0 (Serial1) + { PIOA, PIO_PA11A_TXD0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TXD0 + { PIOA, PIO_PA10A_RXD0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // RXD0 + + // 20/21 - TWI1 + { PIOB, PIO_PB12A_TWD1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TWD1 - SDA0 + { PIOB, PIO_PB13A_TWCK1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TWCK1 - SCL0 + + // 22 + { PIOB, PIO_PB26, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 22 + { PIOA, PIO_PA14, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 23 + { PIOA, PIO_PA15, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 24 + { PIOD, PIO_PD0, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 25 + + // 26 + { PIOD, PIO_PD1, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 26 + { PIOD, PIO_PD2, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 27 + { PIOD, PIO_PD3, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 28 + { PIOD, PIO_PD6, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 29 + + // 30 + { PIOD, PIO_PD9, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 30 + { PIOA, PIO_PA7, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 31 + { PIOD, PIO_PD10, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 32 + { PIOC, PIO_PC1, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 33 + + // 34 + { PIOC, PIO_PC2, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 34 + { PIOC, PIO_PC3, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 35 +//{ PIOC, PIO_PC3B_PWMH0, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH0, NOT_ON_TIMER }, // PWMH0 PIN 35 + { PIOC, PIO_PC4, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 36 + { PIOC, PIO_PC5, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 37 +//{ PIOC, PIO_PC5B_PWMH1, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH1, NOT_ON_TIMER }, // PWMH1 PIN 37 + + // 38 + { PIOC, PIO_PC6, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 38 + { PIOC, PIO_PC7, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 39 +//{ PIOC, PIO_PC7B_PWMH2, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH2, NOT_ON_TIMER }, // PWMH2 PIN 39 + { PIOC, PIO_PC8, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 40 +//{ PIOC, PIO_PC8B_PWML3, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH3, NOT_ON_TIMER }, // PWML3 PIN 40 + { PIOC, PIO_PC9, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 41 + + // 42 + { PIOA, PIO_PA19, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 42 + { PIOA, PIO_PA20, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 43 + { PIOC, PIO_PC19, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 44 +//{ PIOC, PIO_PC19B_PWMH5, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH5, NOT_ON_TIMER }, // PWMH5 PIN 44 + { PIOC, PIO_PC18, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 45 + + // 46 + { PIOC, PIO_PC17, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 46 + { PIOC, PIO_PC16, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 47 + { PIOC, PIO_PC15, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 48 + { PIOC, PIO_PC14, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 49 + + // 50 + { PIOC, PIO_PC13, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 50 + { PIOC, PIO_PC12, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 51 + { PIOB, PIO_PB21, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 52 + { PIOB, PIO_PB14, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 53 + + + // 54 .. 65 - Analog pins + // ---------------------- + { PIOA, PIO_PA16X1_AD7, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC0, ADC7, NOT_ON_PWM, NOT_ON_TIMER }, // AD0 + { PIOA, PIO_PA24X1_AD6, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC1, ADC6, NOT_ON_PWM, NOT_ON_TIMER }, // AD1 + { PIOA, PIO_PA23X1_AD5, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC2, ADC5, NOT_ON_PWM, NOT_ON_TIMER }, // AD2 + { PIOA, PIO_PA22X1_AD4, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC3, ADC4, NOT_ON_PWM, NOT_ON_TIMER }, // AD3 + // 58 +//{ PIOA, PIO_PA6X1_AD3, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC4, ADC3, NOT_ON_PWM, TC0_CHB2 }, // AD4 + { PIOA, PIO_PA6A_TIOB2, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_TIMER|PIN_ATTR_DIGITAL), ADC4, ADC3, NOT_ON_PWM, TC0_CHB2 }, // TIOB2 + { PIOA, PIO_PA4X1_AD2, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC5, ADC2, NOT_ON_PWM, NOT_ON_TIMER }, // AD5 + { PIOA, PIO_PA3X1_AD1, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC6, ADC1, NOT_ON_PWM, TC0_CHB1 }, // AD6 + { PIOA, PIO_PA2X1_AD0, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC7, ADC0, NOT_ON_PWM, TC0_CHA1 }, // AD7 + // 62 + { PIOB, PIO_PB17X1_AD10, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC8, ADC10, NOT_ON_PWM, NOT_ON_TIMER }, // AD8 + { PIOB, PIO_PB18X1_AD11, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC9, ADC11, NOT_ON_PWM, NOT_ON_TIMER }, // AD9 + { PIOB, PIO_PB19X1_AD12, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC10, ADC12, NOT_ON_PWM, NOT_ON_TIMER }, // AD10 + { PIOB, PIO_PB20X1_AD13, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC11, ADC13, NOT_ON_PWM, NOT_ON_TIMER }, // AD11 + + // 66/67 - DAC0/DAC1 + { PIOB, PIO_PB15X1_DAC0, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC12, DA0, NOT_ON_PWM, NOT_ON_TIMER }, // DAC0 + { PIOB, PIO_PB16X1_DAC1, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC13, DA1, NOT_ON_PWM, NOT_ON_TIMER }, // DAC1 + + // 68/69 - CANRX0/CANTX0 + { PIOA, PIO_PA1A_CANRX0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, ADC14, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // CANRX + { PIOA, PIO_PA0A_CANTX0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, ADC15, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // CANTX + + // 70/71 - TWI0 + { PIOA, PIO_PA17A_TWD0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TWD0 - SDA1 + { PIOA, PIO_PA18A_TWCK0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TWCK0 - SCL1 + + // 72/73 - LEDs + { PIOC, PIO_PC30, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // LED AMBER RXL + { PIOA, PIO_PA21, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // LED AMBER TXL + + // 74/75/76 - SPI + { PIOA, PIO_PA25A_SPI0_MISO,ID_PIOA,PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // MISO + { PIOA, PIO_PA26A_SPI0_MOSI,ID_PIOA,PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // MOSI + { PIOA, PIO_PA27A_SPI0_SPCK,ID_PIOA,PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // SPCK + + // 77 - SPI CS0 + { PIOA, PIO_PA28A_SPI0_NPCS0,ID_PIOA,PIO_PERIPH_A,PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // NPCS0 + + // 78 - SPI CS3 (unconnected) + { PIOB, PIO_PB23B_SPI0_NPCS3,ID_PIOB,PIO_PERIPH_B,PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // NPCS3 + + // 79 .. 84 - "All pins" masks + + // 79 - TWI0 all pins + { PIOA, PIO_PA17A_TWD0|PIO_PA18A_TWCK0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, + // 80 - TWI1 all pins + { PIOB, PIO_PB12A_TWD1|PIO_PB13A_TWCK1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, + // 81 - UART (Serial) all pins + { PIOA, PIO_PA8A_URXD|PIO_PA9A_UTXD, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, + // 82 - USART0 (Serial1) all pins + { PIOA, PIO_PA11A_TXD0|PIO_PA10A_RXD0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, + // 83 - USART1 (Serial2) all pins + { PIOA, PIO_PA13A_TXD1|PIO_PA12A_RXD1, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, + // 84 - USART3 (Serial3) all pins + { PIOD, PIO_PD4B_TXD3|PIO_PD5B_RXD3, ID_PIOD, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, + + // 85 - USB +//{ PIOB, PIO_PB11A_UOTGID|PIO_PB10A_UOTGVBOF, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL,NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // ID - VBOF + // 85 - PB11 only + { PIOB, PIO_PB11A_UOTGID, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL,NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // ID - VBOF + + // 86 - SPI CS2 + { PIOB, PIO_PB21B_SPI0_NPCS2, ID_PIOB, PIO_PERIPH_B, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // NPCS2 + + // 87 - SPI CS1 + { PIOA, PIO_PA29A_SPI0_NPCS1, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // NPCS1 + + // 88/89 - CANRX1/CANTX1 (same physical pin for 66/53) + { PIOB, PIO_PB15A_CANRX1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // CANRX1 + { PIOB, PIO_PB14A_CANTX1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // CANTX1 + + // 90 .. 91 - "All CAN pins" masks + // 90 - CAN0 all pins + { PIOA, PIO_PA1A_CANRX0|PIO_PA0A_CANTX0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, + // 91 - CAN1 all pins + { PIOB, PIO_PB15A_CANRX1|PIO_PB14A_CANTX1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, + + // 92 - Extra AMBIT Pins + { PIOC, PIO_PC11, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 92 + { PIOB, PIO_PB2, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 93 + { PIOB, PIO_PB1, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 94 + { PIOB, PIO_PB0, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 95 + { PIOC, PIO_PC10, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 96 + { PIOB, PIO_PB24, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 97 + { PIOB, PIO_PB7, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 98 + { PIOB, PIO_PB6, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 99 + { PIOB, PIO_PB8, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 100 + { PIOB, PIO_PB5, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 101 + { PIOB, PIO_PB4, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 102 + { PIOB, PIO_PB3, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 103 + { PIOC, PIO_PC20, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 104 + { PIOB, PIO_PB22, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 105 + { PIOC, PIO_PC27, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 106 + { PIOB, PIO_PB10B_A18, ID_PIOB, PIO_PERIPH_B, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 107 + { PIOB, PIO_PB9, ID_PIOB, PIO_PERIPH_B, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 108 + { PIOA, PIO_PA5, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 109 + + // END + { NULL, 0, 0, PIO_NOT_A_PIN, PIO_DEFAULT, 0, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER } +} ; + + +uint8_t g_pinStatus[PINS_COUNT] = {0}; + +#ifdef __cplusplus +} +#endif + +/* + * UART objects + */ +RingBuffer rx_buffer1; +RingBuffer tx_buffer1; + +UARTClass Serial(UART, UART_IRQn, ID_UART, &rx_buffer1, &tx_buffer1); +void serialEvent() __attribute__((weak)); +void serialEvent() { } + +// IT handlers +void UART_Handler(void) +{ + Serial.IrqHandler(); +} + +// ---------------------------------------------------------------------------- +/* + * USART objects + */ +RingBuffer rx_buffer2; +RingBuffer rx_buffer3; +RingBuffer rx_buffer4; +RingBuffer tx_buffer2; +RingBuffer tx_buffer3; +RingBuffer tx_buffer4; + +USARTClass Serial1(USART0, USART0_IRQn, ID_USART0, &rx_buffer2, &tx_buffer2); +void serialEvent1() __attribute__((weak)); +void serialEvent1() { } +USARTClass Serial2(USART1, USART1_IRQn, ID_USART1, &rx_buffer3, &tx_buffer3); +void serialEvent2() __attribute__((weak)); +void serialEvent2() { } +USARTClass Serial3(USART3, USART3_IRQn, ID_USART3, &rx_buffer4, &tx_buffer4); +void serialEvent3() __attribute__((weak)); +void serialEvent3() { } + +// IT handlers +void USART0_Handler(void) +{ + Serial1.IrqHandler(); +} + +void USART1_Handler(void) +{ + Serial2.IrqHandler(); +} + +void USART3_Handler(void) +{ + Serial3.IrqHandler(); +} + +// ---------------------------------------------------------------------------- + +void serialEventRun(void) +{ + if (Serial.available()) serialEvent(); + if (Serial1.available()) serialEvent1(); + if (Serial2.available()) serialEvent2(); + if (Serial3.available()) serialEvent3(); +} + +// ---------------------------------------------------------------------------- + +#ifdef __cplusplus +extern "C" { +#endif + +void __libc_init_array(void); + +void init( void ) +{ + SystemInit(); + + // Set Systick to 1ms interval, common to all SAM3 variants + if (SysTick_Config(SystemCoreClock / 1000)) + { + // Capture error + while (true); + } + + // Initialize C library + __libc_init_array(); + + // Disable pull-up on every pin + for (unsigned i = 0; i < PINS_COUNT; i++) + digitalWrite(i, LOW); + + // Enable parallel access on PIO output data registers + PIOA->PIO_OWER = 0xFFFFFFFF; + PIOB->PIO_OWER = 0xFFFFFFFF; + PIOC->PIO_OWER = 0xFFFFFFFF; + PIOD->PIO_OWER = 0xFFFFFFFF; + + // Set USB Full Speed for Archim + udd_low_speed_disable(); + udd_high_speed_disable(); + + // Initialize Serial port U(S)ART pins + PIO_Configure( + g_APinDescription[PINS_UART].pPort, + g_APinDescription[PINS_UART].ulPinType, + g_APinDescription[PINS_UART].ulPin, + g_APinDescription[PINS_UART].ulPinConfiguration); + digitalWrite(0, HIGH); // Enable pullup for RX0 + PIO_Configure( + g_APinDescription[PINS_USART0].pPort, + g_APinDescription[PINS_USART0].ulPinType, + g_APinDescription[PINS_USART0].ulPin, + g_APinDescription[PINS_USART0].ulPinConfiguration); + PIO_Configure( + g_APinDescription[PINS_USART1].pPort, + g_APinDescription[PINS_USART1].ulPinType, + g_APinDescription[PINS_USART1].ulPin, + g_APinDescription[PINS_USART1].ulPinConfiguration); + PIO_Configure( + g_APinDescription[PINS_USART3].pPort, + g_APinDescription[PINS_USART3].ulPinType, + g_APinDescription[PINS_USART3].ulPin, + g_APinDescription[PINS_USART3].ulPinConfiguration); + + // Initialize USB pins + PIO_Configure( + g_APinDescription[PINS_USB].pPort, + g_APinDescription[PINS_USB].ulPinType, + g_APinDescription[PINS_USB].ulPin, + g_APinDescription[PINS_USB].ulPinConfiguration); + + // Initialize CAN pins + PIO_Configure( + g_APinDescription[PINS_CAN0].pPort, + g_APinDescription[PINS_CAN0].ulPinType, + g_APinDescription[PINS_CAN0].ulPin, + g_APinDescription[PINS_CAN0].ulPinConfiguration); + PIO_Configure( + g_APinDescription[PINS_CAN1].pPort, + g_APinDescription[PINS_CAN1].ulPinType, + g_APinDescription[PINS_CAN1].ulPin, + g_APinDescription[PINS_CAN1].ulPinConfiguration); + + // Initialize Analog Controller + pmc_enable_periph_clk(ID_ADC); + adc_init(ADC, SystemCoreClock, ADC_FREQ_MAX, ADC_STARTUP_FAST); + adc_configure_timing(ADC, 0, ADC_SETTLING_TIME_3, 1); + adc_configure_trigger(ADC, ADC_TRIG_SW, 0); // Disable hardware trigger. + adc_disable_interrupt(ADC, 0xFFFFFFFF); // Disable all ADC interrupts. + adc_disable_all_channel(ADC); + + // Initialize analogOutput module + analogOutputInit(); +} + +#ifdef __cplusplus +} +#endif + diff --git a/buildroot/share/PlatformIO/variants/archim/variant.h b/buildroot/share/PlatformIO/variants/archim/variant.h new file mode 100644 index 000000000..56f641420 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/variant.h @@ -0,0 +1,284 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _VARIANT_ARDUINO_DUE_X_ +#define _VARIANT_ARDUINO_DUE_X_ + +/*---------------------------------------------------------------------------- + * Definitions + *----------------------------------------------------------------------------*/ + +/** Frequency of the board main oscillator */ +#define VARIANT_MAINOSC 12000000 + +/** Master clock frequency */ +#define VARIANT_MCK 84000000 + +/*---------------------------------------------------------------------------- + * Headers + *----------------------------------------------------------------------------*/ + +#include "Arduino.h" +#ifdef __cplusplus +#include "UARTClass.h" +#include "USARTClass.h" +#endif + +#ifdef __cplusplus +extern "C"{ +#endif // __cplusplus + +/** + * Libc porting layers + */ +#if defined ( __GNUC__ ) /* GCC CS3 */ +# include /** RedHat Newlib minimal stub */ +#endif + +/*---------------------------------------------------------------------------- + * Pins + *----------------------------------------------------------------------------*/ + +// Number of pins defined in PinDescription array +#define PINS_COUNT (79u) +#define NUM_DIGITAL_PINS (66u) +#define NUM_ANALOG_INPUTS (12u) +#define analogInputToDigitalPin(p) ((p < 12u) ? (p) + 54u : -1) + +#define digitalPinToPort(P) ( g_APinDescription[P].pPort ) +#define digitalPinToBitMask(P) ( g_APinDescription[P].ulPin ) +//#define analogInPinToBit(P) ( ) +#define portOutputRegister(port) ( &(port->PIO_ODSR) ) +#define portInputRegister(port) ( &(port->PIO_PDSR) ) +#define digitalPinHasPWM(P) ( g_APinDescription[P].ulPWMChannel != NOT_ON_PWM || g_APinDescription[P].ulTCChannel != NOT_ON_TIMER ) + +/* + * portModeRegister(..) should return a register to set pin mode + * INPUT or OUTPUT by setting the corresponding bit to 0 or 1. + * Unfortunately on SAM architecture the PIO_OSR register is + * read-only and can be set only through the enable/disable registers + * pair PIO_OER/PIO_ODR. + */ +// #define portModeRegister(port) ( &(port->PIO_OSR) ) + +/* + * digitalPinToTimer(..) is AVR-specific and is not defined for SAM + * architecture. If you need to check if a pin supports PWM you must + * use digitalPinHasPWM(..). + * + * https://github.com/arduino/Arduino/issues/1833 + */ +// #define digitalPinToTimer(P) + +// Interrupts +#define digitalPinToInterrupt(p) ((p) < NUM_DIGITAL_PINS ? (p) : -1) + +// LEDs +#define PIN_LED_13 (13u) +#define PIN_LED_RXL (72u) +#define PIN_LED_TXL (73u) +#define PIN_LED PIN_LED_13 +#define PIN_LED2 PIN_LED_RXL +#define PIN_LED3 PIN_LED_TXL +#define LED_BUILTIN 13 + +/* + * SPI Interfaces + */ +#define SPI_INTERFACES_COUNT 1 + +#define SPI_INTERFACE SPI0 +#define SPI_INTERFACE_ID ID_SPI0 +#define SPI_CHANNELS_NUM 4 +#define PIN_SPI_SS0 (77u) +#define PIN_SPI_SS1 (87u) +#define PIN_SPI_SS2 (86u) +#define PIN_SPI_SS3 (78u) +#define PIN_SPI_MOSI (75u) +#define PIN_SPI_MISO (74u) +#define PIN_SPI_SCK (76u) +#define BOARD_SPI_SS0 (77u) //(10u) +#define BOARD_SPI_SS1 (4u) +#define BOARD_SPI_SS2 (52u) +#define BOARD_SPI_SS3 PIN_SPI_SS3 +#define BOARD_SPI_DEFAULT_SS BOARD_SPI_SS3 + +#define BOARD_PIN_TO_SPI_PIN(x) \ + (x==BOARD_SPI_SS0 ? PIN_SPI_SS0 : \ + (x==BOARD_SPI_SS1 ? PIN_SPI_SS1 : \ + (x==BOARD_SPI_SS2 ? PIN_SPI_SS2 : PIN_SPI_SS3 ))) +#define BOARD_PIN_TO_SPI_CHANNEL(x) \ + (x==BOARD_SPI_SS0 ? 0 : \ + (x==BOARD_SPI_SS1 ? 1 : \ + (x==BOARD_SPI_SS2 ? 2 : 3))) + +static const uint8_t SS = BOARD_SPI_SS0; +static const uint8_t SS1 = BOARD_SPI_SS1; +static const uint8_t SS2 = BOARD_SPI_SS2; +static const uint8_t SS3 = BOARD_SPI_SS3; +static const uint8_t MOSI = PIN_SPI_MOSI; +static const uint8_t MISO = PIN_SPI_MISO; +static const uint8_t SCK = PIN_SPI_SCK; + +/* + * Wire Interfaces + */ +#define WIRE_INTERFACES_COUNT 2 + +#define PIN_WIRE_SDA (20u) +#define PIN_WIRE_SCL (21u) +#define WIRE_INTERFACE TWI1 +#define WIRE_INTERFACE_ID ID_TWI1 +#define WIRE_ISR_HANDLER TWI1_Handler +#define WIRE_ISR_ID TWI1_IRQn + +#define PIN_WIRE1_SDA (70u) +#define PIN_WIRE1_SCL (71u) +#define WIRE1_INTERFACE TWI0 +#define WIRE1_INTERFACE_ID ID_TWI0 +#define WIRE1_ISR_HANDLER TWI0_Handler +#define WIRE1_ISR_ID TWI0_IRQn + +static const uint8_t SDA = PIN_WIRE_SDA; +static const uint8_t SCL = PIN_WIRE_SCL; +static const uint8_t SDA1 = PIN_WIRE1_SDA; +static const uint8_t SCL1 = PIN_WIRE1_SCL; + +/* + * UART/USART Interfaces + */ +// Serial +#define PINS_UART (81u) +// Serial1 +#define PINS_USART0 (82u) +// Serial2 +#define PINS_USART1 (83u) +// Serial3 +#define PINS_USART3 (84u) + +/* + * USB Interfaces + */ +#define PINS_USB (85u) + +/* + * Analog pins + */ +static const uint8_t A0 = 54; +static const uint8_t A1 = 55; +static const uint8_t A2 = 56; +static const uint8_t A3 = 57; +static const uint8_t A4 = 58; +static const uint8_t A5 = 59; +static const uint8_t A6 = 60; +static const uint8_t A7 = 61; +static const uint8_t A8 = 62; +static const uint8_t A9 = 63; +static const uint8_t A10 = 64; +static const uint8_t A11 = 65; +static const uint8_t DAC0 = 66; +static const uint8_t DAC1 = 67; +static const uint8_t CANRX = 68; +static const uint8_t CANTX = 69; +#define ADC_RESOLUTION 12 + +/* + * Complementary CAN pins + */ +static const uint8_t CAN1RX = 88; +static const uint8_t CAN1TX = 89; + +// CAN0 +#define PINS_CAN0 (90u) +// CAN1 +#define PINS_CAN1 (91u) + + +/* + * DACC + */ +#define DACC_INTERFACE DACC +#define DACC_INTERFACE_ID ID_DACC +#define DACC_RESOLUTION 12 +#define DACC_ISR_HANDLER DACC_Handler +#define DACC_ISR_ID DACC_IRQn + +/* + * PWM + */ +#define PWM_INTERFACE PWM +#define PWM_INTERFACE_ID ID_PWM +#define PWM_FREQUENCY 31000 +#define PWM_MAX_DUTY_CYCLE 255 +#define PWM_MIN_DUTY_CYCLE 0 +#define PWM_RESOLUTION 8 + +/* + * TC + */ +#define TC_INTERFACE TC0 +#define TC_INTERFACE_ID ID_TC0 +#define TC_FREQUENCY 100000 +#define TC_MAX_DUTY_CYCLE 255 +#define TC_MIN_DUTY_CYCLE 0 +#define TC_RESOLUTION 8 + +#ifdef __cplusplus +} +#endif + +/*---------------------------------------------------------------------------- + * Arduino objects - C++ only + *----------------------------------------------------------------------------*/ + +#ifdef __cplusplus + +extern UARTClass Serial; +extern USARTClass Serial1; +extern USARTClass Serial2; +extern USARTClass Serial3; + +#endif + +// These serial port names are intended to allow libraries and architecture-neutral +// sketches to automatically default to the correct port name for a particular type +// of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, +// the first hardware serial port whose RX/TX pins are not dedicated to another use. +// +// SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor +// +// SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial +// +// SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library +// +// SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. +// +// SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX +// pins are NOT connected to anything by default. +#define SERIAL_PORT_MONITOR Serial +#define SERIAL_PORT_USBVIRTUAL SerialUSB +#define SERIAL_PORT_HARDWARE_OPEN Serial1 +#define SERIAL_PORT_HARDWARE_OPEN1 Serial2 +#define SERIAL_PORT_HARDWARE_OPEN2 Serial3 +#define SERIAL_PORT_HARDWARE Serial +#define SERIAL_PORT_HARDWARE1 Serial1 +#define SERIAL_PORT_HARDWARE2 Serial2 +#define SERIAL_PORT_HARDWARE3 Serial3 + +#endif /* _VARIANT_ARDUINO_DUE_X_ */ + diff --git a/platformio.ini b/platformio.ini index c426c5223..1f2586e26 100644 --- a/platformio.ini +++ b/platformio.ini @@ -576,8 +576,10 @@ build_flags = ${common.build_flags} [common_DUE_archim] platform = atmelsam extends = env:DUE +board = archim build_flags = ${common.build_flags} -DARDUINO_SAM_ARCHIM -DARDUINO_ARCH_SAM -D__SAM3X8E__ -DUSBCON +board_build.variants_dir = buildroot/share/PlatformIO/variants/ extra_scripts = ${common.extra_scripts} Marlin/src/HAL/DUE/upload_extra_script.py