From 9721172481f4656dab8a07eac1df8f12f189cd7f Mon Sep 17 00:00:00 2001 From: Valeriy Koval Date: Wed, 4 Feb 2015 20:23:50 +0200 Subject: [PATCH 1/3] Fix optional board "extra_flags" and "ldscript" --- platformio/builder/main.py | 9 ----- .../builder/scripts/frameworks/arduino.py | 1 - .../builder/scripts/frameworks/opencm3.py | 4 +-- platformio/builder/scripts/frameworks/spl.py | 2 +- platformio/builder/scripts/stm32.py | 33 ++++++++----------- platformio/builder/scripts/titiva.py | 10 +++--- platformio/builder/tools/platformio.py | 10 ++++++ 7 files changed, 31 insertions(+), 38 deletions(-) diff --git a/platformio/builder/main.py b/platformio/builder/main.py index e2383e00..3bde0b9d 100644 --- a/platformio/builder/main.py +++ b/platformio/builder/main.py @@ -84,15 +84,6 @@ if "BOARD" in env: env.Replace(UPLOAD_PROTOCOL="${BOARD_OPTIONS['upload']['protocol']}") if "UPLOAD_SPEED" not in env: env.Replace(UPLOAD_SPEED="${BOARD_OPTIONS['upload']['speed']}") - # specific linker script - if "ldscript" in env.get("BOARD_OPTIONS", {}).get("build", {}): - env.Replace( - LINKFLAGS=["-T", join( - "$PIOHOME_DIR", "packages", "ldscripts", - "${BOARD_OPTIONS['build']['ldscript']}")] - ) - if "extra_flags" in env.get("BOARD_OPTIONS", {}).get("build", {}): - env.MergeFlags(env.subst("${BOARD_OPTIONS['build']['extra_flags']}")) if "IGNORE_LIBS" in env: env['IGNORE_LIBS'] = [l.strip() for l in env['IGNORE_LIBS'].split(",")] diff --git a/platformio/builder/scripts/frameworks/arduino.py b/platformio/builder/scripts/frameworks/arduino.py index e2ddd95c..5719b298 100644 --- a/platformio/builder/scripts/frameworks/arduino.py +++ b/platformio/builder/scripts/frameworks/arduino.py @@ -43,7 +43,6 @@ env.Append( ] ) - # # Target: Build Core Library # diff --git a/platformio/builder/scripts/frameworks/opencm3.py b/platformio/builder/scripts/frameworks/opencm3.py index 82c9a5bb..d07357c4 100644 --- a/platformio/builder/scripts/frameworks/opencm3.py +++ b/platformio/builder/scripts/frameworks/opencm3.py @@ -156,8 +156,8 @@ merge_ld_scripts(ldscript_path) generate_nvic_files() # override ldscript by opencm3 -assert env['LINKFLAGS'][0] == "-T" -env['LINKFLAGS'][1] = ldscript_path +assert "-T" in env['LINKFLAGS'] +env['LINKFLAGS'][env['LINKFLAGS'].index("-T") + 1] = ldscript_path libs = [] env.VariantDir( diff --git a/platformio/builder/scripts/frameworks/spl.py b/platformio/builder/scripts/frameworks/spl.py index 239a6ba2..62801bfd 100644 --- a/platformio/builder/scripts/frameworks/spl.py +++ b/platformio/builder/scripts/frameworks/spl.py @@ -50,7 +50,7 @@ if "STM32F40_41xxx" in extra_flags: elif "STM32F303xC" in extra_flags: ignore_files += ["stm32f30x_hrtim.c"] elif "STM32L1XX_MD" in extra_flags: - ignore_files += ["stm32l1xx_flash_ramfunc.c"] # removed warning + ignore_files += ["stm32l1xx_flash_ramfunc.c"] libs = [] libs.append(envsafe.BuildLibrary( diff --git a/platformio/builder/scripts/stm32.py b/platformio/builder/scripts/stm32.py index 38b3af25..3793e7de 100644 --- a/platformio/builder/scripts/stm32.py +++ b/platformio/builder/scripts/stm32.py @@ -48,6 +48,20 @@ env.Replace( "-fno-exceptions" ], + CPPDEFINES=[ + "F_CPU=$BOARD_F_CPU", + "${BOARD_OPTIONS['build']['variant'].upper()}" + ], + + LINKFLAGS=[ + "-Os", + "-nostartfiles", + "-nostdlib", + "-Wl,--gc-sections", + "-mthumb", + "-mcpu=${BOARD_OPTIONS['build']['mcu']}" + ], + UPLOADER=join("$PIOPACKAGES_DIR", "tool-stlink", "st-flash"), UPLOADERFLAGS=[ "write", # write in flash @@ -58,25 +72,6 @@ env.Replace( UPLOADCMD="$UPLOADER $UPLOADERFLAGS" ) - -env.Append( - CPPDEFINES=[ - "F_CPU=$BOARD_F_CPU", - "${BOARD_OPTIONS['build']['variant'].upper()}" - ] -) - -env.Append( - LINKFLAGS=[ - "-Os", - "-nostartfiles", - "-nostdlib", - "-Wl,--gc-sections", - "-mthumb", - "-mcpu=${BOARD_OPTIONS['build']['mcu']}" - ] -) - if env.get("BOARD_OPTIONS", {}).get("build", {}).get("mcu")[-2:] == "m4": env.Append( ASFLAGS=[ diff --git a/platformio/builder/scripts/titiva.py b/platformio/builder/scripts/titiva.py index e5c39a88..613e6aef 100644 --- a/platformio/builder/scripts/titiva.py +++ b/platformio/builder/scripts/titiva.py @@ -59,11 +59,6 @@ env.Replace( "F_CPU=$BOARD_F_CPU" ], - UPLOADER=join("$PIOPACKAGES_DIR", "tool-lm4flash", "lm4flash"), - UPLOADCMD="$UPLOADER $SOURCES" -) - -env.Append( LINKFLAGS=[ "-Os", "-nostartfiles", @@ -74,7 +69,10 @@ env.Append( "-mfloat-abi=hard", "-mfpu=fpv4-sp-d16", "-fsingle-precision-constant" - ] + ], + + UPLOADER=join("$PIOPACKAGES_DIR", "tool-lm4flash", "lm4flash"), + UPLOADCMD="$UPLOADER $SOURCES" ) env.Append( diff --git a/platformio/builder/tools/platformio.py b/platformio/builder/tools/platformio.py index 7f6ceb08..09aba659 100644 --- a/platformio/builder/tools/platformio.py +++ b/platformio/builder/tools/platformio.py @@ -16,6 +16,16 @@ from platformio.util import get_serialports def ProcessGeneral(env): corelibs = [] + # specific linker script + if "ldscript" in env.get("BOARD_OPTIONS", {}).get("build", {}): + env.Append( + LINKFLAGS=["-T", join( + "$PIOHOME_DIR", "packages", "ldscripts", + "${BOARD_OPTIONS['build']['ldscript']}")] + ) + if "extra_flags" in env.get("BOARD_OPTIONS", {}).get("build", {}): + env.MergeFlags(env.subst("${BOARD_OPTIONS['build']['extra_flags']}")) + if "BUILD_FLAGS" in env: env.MergeFlags(env['BUILD_FLAGS']) From 2280c01dc7fdc5ce463f7bd2bc32e8a2c5634f2c Mon Sep 17 00:00:00 2001 From: Valeriy Koval Date: Thu, 5 Feb 2015 15:58:12 +0200 Subject: [PATCH 2/3] Initial support of SAM platform --- platformio/boards/sam.json | 25 +++++ platformio/builder/scripts/sam.py | 170 ++++++++++++++++++++++++++++++ platformio/platforms/sam.py | 33 ++++++ 3 files changed, 228 insertions(+) create mode 100644 platformio/boards/sam.json create mode 100644 platformio/builder/scripts/sam.py create mode 100644 platformio/platforms/sam.py 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 + } + } From 14355cb7d44617b2a8aaa459777ac54680a8b8a1 Mon Sep 17 00:00:00 2001 From: Valeriy Koval Date: Fri, 6 Feb 2015 18:12:56 +0200 Subject: [PATCH 3/3] Finalize with Atmel SAM platform --- platformio/boards/arduino.json | 26 +++++- platformio/boards/sam.json | 25 ------ .../builder/scripts/frameworks/arduino.py | 29 ++++++- platformio/builder/scripts/sam.py | 79 ++++++------------- platformio/platforms/sam.py | 3 +- 5 files changed, 78 insertions(+), 84 deletions(-) delete mode 100644 platformio/boards/sam.json diff --git a/platformio/boards/arduino.json b/platformio/boards/arduino.json index deba1b1b..84fa14ff 100644 --- a/platformio/boards/arduino.json +++ b/platformio/boards/arduino.json @@ -536,5 +536,29 @@ "via_ssh": true, "wait_for_upload_port": true } - } + }, + "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", + "ldscript": "sam3x8e.ld" + }, + "name": "Arduino Due (Programming Port)", + "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 + } + } } diff --git a/platformio/boards/sam.json b/platformio/boards/sam.json deleted file mode 100644 index 1a713952..00000000 --- a/platformio/boards/sam.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "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/frameworks/arduino.py b/platformio/builder/scripts/frameworks/arduino.py index ef7f2123..aa353081 100644 --- a/platformio/builder/scripts/frameworks/arduino.py +++ b/platformio/builder/scripts/frameworks/arduino.py @@ -2,7 +2,7 @@ # See LICENSE for details. """ - Build script for Android Framework (based on Wiring). + Build script for Arduino Framework (based on Wiring). """ from os.path import join @@ -49,6 +49,33 @@ if "variant" in env.get("BOARD_OPTIONS", {}).get("build", {}): ] ) +if env.get("BOARD_OPTIONS", {}).get("platform", None) == "sam": + env.VariantDir( + join("$BUILD_DIR", "FrameworkCMSISInc"), + join("$PLATFORMFW_DIR", "system", "CMSIS", "CMSIS", "include") + ) + env.VariantDir( + join("$BUILD_DIR", "FrameworkLibSamInc"), + join("$PLATFORMFW_DIR", "system", "libsam") + ) + env.VariantDir( + join("$BUILD_DIR", "FrameworkDeviceInc"), + join("$PLATFORMFW_DIR", "system", "CMSIS", "Device", "ATMEL") + ) + env.Append( + CPPPATH=[ + join("$BUILD_DIR", "FrameworkCMSISInc"), + join("$BUILD_DIR", "FrameworkLibSamInc"), + join("$BUILD_DIR", "FrameworkDeviceInc") + ] + ) + env.Append( + LINKFLAGS=[ + "-T", join("$PIOHOME_DIR", "packages", "ldscripts", + "${BOARD_OPTIONS['build']['ldscript']}") + ] + ) + # # Target: Build Core Library # diff --git a/platformio/builder/scripts/sam.py b/platformio/builder/scripts/sam.py index c9ca92af..a8c98183 100644 --- a/platformio/builder/scripts/sam.py +++ b/platformio/builder/scripts/sam.py @@ -28,22 +28,25 @@ env.Replace( "-c", "-g", # include debugging info (so errors include line numbers) "-x", "assembler-with-cpp", - "-mmcu=$BOARD_MCU" + "-Wall", + "-mthumb", + "-mcpu=${BOARD_OPTIONS['build']['mcu']}" ], CCFLAGS=[ "-g", # include debugging info (so errors include line numbers) "-Os", # optimize for size - # "-Wall", # show warnings + "-Wall", # show warnings "-ffunction-sections", # place each function in its own section "-fdata-sections", "-MMD", # output dependency info - "-mmcu=$BOARD_MCU" + "-mcpu=${BOARD_OPTIONS['build']['mcu']}", + "-mthumb" ], CXXFLAGS=[ - "-fno-exceptions", - "-fno-threadsafe-statics" + "-fno-rtti", + "-fno-exceptions" ], CPPDEFINES=[ @@ -52,54 +55,34 @@ env.Replace( LINKFLAGS=[ "-Os", - "-mmcu=$BOARD_MCU", "-Wl,--gc-sections", - "-Wl,--start-group" + "-mcpu=${BOARD_OPTIONS['build']['mcu']}", + "-mthumb" ], - UPLOADER=join("$PIOPACKAGES_DIR", "tool-sam", "bossac"), + UPLOADER=join("$PIOPACKAGES_DIR", "$PIOPACKAGE_UPLOADER", "bossac"), UPLOADERFLAGS=[ - "-i", - "-d", + "--info", + "--debug", "--port", "$UPLOAD_PORT", - "-U false", # @TODO "Native USB"? - "-e", - "-w", - "-v", - "-b" + "--erase", + "--write", + "--verify", + "--boot" ], - UPLOADBINCMD='"$UPLOADER" $UPLOADERFLAGS -U flash:w:$SOURCES:i', - UPLOADEEPCMD='"$UPLOADER" $UPLOADERFLAGS -U eeprom:w:$SOURCES:i' + UPLOADBINCMD='"$UPLOADER" $UPLOADERFLAGS $SOURCES' ) env.Append( BUILDERS=dict( - ElfToEep=Builder( + ElfToBin=Builder( action=" ".join([ "$OBJCOPY", "-O", - "ihex", - "-j", - ".eeprom", - '--set-section-flags=.eeprom="alloc,load"', - "--no-change-warnings", - "--change-section-lma", - ".eeprom=0", + "binary", "$SOURCES", "$TARGET"]), - suffix=".eep" - ), - - BUILDERS=dict( - ElfToBin=Builder( - action=" ".join([ - "$OBJCOPY", - "-O", - "binary", - "$SOURCES", - "$TARGET"]), - suffix=".bin" - ) + suffix=".bin" ) ) ) @@ -110,7 +93,7 @@ CORELIBS = env.ProcessGeneral() # Target: Build executable and linkable firmware # -target_elf = env.BuildFirmware(CORELIBS + ["m"]) +target_elf = env.BuildFirmware(CORELIBS + ["m", "gcc"]) # # Target: Build the .bin file @@ -121,13 +104,6 @@ if "uploadlazy" in COMMAND_LINE_TARGETS: 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 # @@ -135,20 +111,11 @@ target_eep = env.Alias("eep", env.ElfToEep(join("$BUILD_DIR", "firmware"), 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)) +is_uptarget = (set(["upload", "uploadlazy"]) & set(COMMAND_LINE_TARGETS)) if is_uptarget: # try autodetect upload port diff --git a/platformio/platforms/sam.py b/platformio/platforms/sam.py index 0beeaa5b..3bc6ac9b 100644 --- a/platformio/platforms/sam.py +++ b/platformio/platforms/sam.py @@ -8,6 +8,7 @@ class SamPlatform(BasePlatform): """ An embedded platform for Atmel SAM microcontrollers + (with Arduino Framework) """ PACKAGES = { @@ -26,7 +27,7 @@ class SamPlatform(BasePlatform): "default": True }, - "tool-sam": { + "tool-bossac": { "alias": "uploader", "default": True }