diff --git a/platformio/boards/sam.json b/platformio/boards/sam.json new file mode 100644 index 00000000..1a713952 --- /dev/null +++ b/platformio/boards/sam.json @@ -0,0 +1,25 @@ +{ + "Due": { + "build": { + "core": "arduino", + "extra_flags": "-D__SAM3X8E__ -DARDUINO_SAM_DUE -DARDUINO_ARCH_SAM", + "f_cpu": "84000000L", + "mcu": "cortex-m3", + "pid": "0x003e", + "usb_product": "Arduino Due", + "variant": "arduino_due_x", + "vid": "0x2341" + }, + "name": "Arduino Due", + "platform": "sam", + "upload": { + "disable_flushing": true, + "maximum_ram_size": 524288, + "maximum_size": 28672, + "protocol": "sam-ba", + "speed": 57600, + "use_1200bps_touch": true, + "wait_for_upload_port": false + } + } +} \ No newline at end of file diff --git a/platformio/builder/scripts/sam.py b/platformio/builder/scripts/sam.py new file mode 100644 index 00000000..c9ca92af --- /dev/null +++ b/platformio/builder/scripts/sam.py @@ -0,0 +1,170 @@ +# Copyright (C) Ivan Kravets +# See LICENSE for details. + +""" + Builder for Atmel SAM series of microcontrollers +""" + +from os.path import join + +from SCons.Script import (COMMAND_LINE_TARGETS, AlwaysBuild, Builder, Default, + DefaultEnvironment) + +from platformio.util import get_serialports + +env = DefaultEnvironment() + +env.Replace( + AR="arm-none-eabi-ar", + AS="arm-none-eabi-gcc", + CC="arm-none-eabi-gcc", + CXX="arm-none-eabi-g++", + OBJCOPY="arm-none-eabi-objcopy", + RANLIB="arm-none-eabi-ranlib", + + ARFLAGS=["rcs"], + + ASFLAGS=[ + "-c", + "-g", # include debugging info (so errors include line numbers) + "-x", "assembler-with-cpp", + "-mmcu=$BOARD_MCU" + ], + + CCFLAGS=[ + "-g", # include debugging info (so errors include line numbers) + "-Os", # optimize for size + # "-Wall", # show warnings + "-ffunction-sections", # place each function in its own section + "-fdata-sections", + "-MMD", # output dependency info + "-mmcu=$BOARD_MCU" + ], + + CXXFLAGS=[ + "-fno-exceptions", + "-fno-threadsafe-statics" + ], + + CPPDEFINES=[ + "F_CPU=$BOARD_F_CPU" + ], + + LINKFLAGS=[ + "-Os", + "-mmcu=$BOARD_MCU", + "-Wl,--gc-sections", + "-Wl,--start-group" + ], + + UPLOADER=join("$PIOPACKAGES_DIR", "tool-sam", "bossac"), + UPLOADERFLAGS=[ + "-i", + "-d", + "--port", "$UPLOAD_PORT", + "-U false", # @TODO "Native USB"? + "-e", + "-w", + "-v", + "-b" + ], + UPLOADBINCMD='"$UPLOADER" $UPLOADERFLAGS -U flash:w:$SOURCES:i', + UPLOADEEPCMD='"$UPLOADER" $UPLOADERFLAGS -U eeprom:w:$SOURCES:i' +) + +env.Append( + BUILDERS=dict( + ElfToEep=Builder( + action=" ".join([ + "$OBJCOPY", + "-O", + "ihex", + "-j", + ".eeprom", + '--set-section-flags=.eeprom="alloc,load"', + "--no-change-warnings", + "--change-section-lma", + ".eeprom=0", + "$SOURCES", + "$TARGET"]), + suffix=".eep" + ), + + BUILDERS=dict( + ElfToBin=Builder( + action=" ".join([ + "$OBJCOPY", + "-O", + "binary", + "$SOURCES", + "$TARGET"]), + suffix=".bin" + ) + ) + ) +) + +CORELIBS = env.ProcessGeneral() + +# +# Target: Build executable and linkable firmware +# + +target_elf = env.BuildFirmware(CORELIBS + ["m"]) + +# +# Target: Build the .bin file +# + +if "uploadlazy" in COMMAND_LINE_TARGETS: + target_bin = join("$BUILD_DIR", "firmware.bin") +else: + target_bin = env.ElfToBin(join("$BUILD_DIR", "firmware"), target_elf) + +# +# Target: Extract EEPROM data (from EEMEM directive) to .eep file +# + +target_eep = env.Alias("eep", env.ElfToEep(join("$BUILD_DIR", "firmware"), + target_elf)) + +# +# Target: Upload by default .bin file +# + +upload = env.Alias(["upload", "uploadlazy"], target_bin, ("$UPLOADBINCMD")) +AlwaysBuild(upload) + +# +# Target: Upload .eep file +# + +uploadeep = env.Alias(["uploadeep"], target_eep, ("$UPLOADEEPCMD")) +AlwaysBuild(uploadeep) + + +# +# Check for $UPLOAD_PORT variable +# + +is_uptarget = (set(["upload", "uploadlazy", "uploadeep"]) & + set(COMMAND_LINE_TARGETS)) + +if is_uptarget: + # try autodetect upload port + if "UPLOAD_PORT" not in env: + for item in get_serialports(): + if "VID:PID" in item['hwid']: + print "Auto-detected UPLOAD_PORT: %s" % item['port'] + env.Replace(UPLOAD_PORT=item['port']) + break + + if "UPLOAD_PORT" not in env: + print("WARNING!!! Please specify environment 'upload_port' or use " + "global --upload-port option.\n") + +# +# Setup default targets +# + +Default(target_bin) diff --git a/platformio/platforms/sam.py b/platformio/platforms/sam.py new file mode 100644 index 00000000..0beeaa5b --- /dev/null +++ b/platformio/platforms/sam.py @@ -0,0 +1,33 @@ +# Copyright (C) Ivan Kravets +# See LICENSE for details. + +from platformio.platforms.base import BasePlatform + + +class SamPlatform(BasePlatform): + + """ + An embedded platform for Atmel SAM microcontrollers + """ + + PACKAGES = { + + "toolchain-gccarmnoneeabi": { + "alias": "toolchain", + "default": True + }, + + "ldscripts": { + "default": True + }, + + "framework-arduinosam": { + "alias": "framework", + "default": True + }, + + "tool-sam": { + "alias": "uploader", + "default": True + } + }