Merge pull request #61 from valeros/develop

Add support for Atmel SAM development platform
This commit is contained in:
Ivan Kravets
2015-02-06 18:18:21 +02:00
11 changed files with 305 additions and 85 deletions

View File

@ -1,8 +1,8 @@
{
"LilyPadUSB": {
"build": {
"board": "AVR_LILYPAD_USB",
"core": "arduino",
"extra_flags": "-DARDUINO_ARCH_AVR -DARDUINO_AVR_LILYPAD_USB",
"f_cpu": "8000000L",
"mcu": "atmega32u4",
"pid": "0x9208",
@ -24,8 +24,8 @@
},
"atmegangatmega168": {
"build": {
"board": "AVR_NG",
"core": "arduino",
"extra_flags": "-DARDUINO_ARCH_AVR -DARDUINO_AVR_NG",
"f_cpu": "16000000L",
"mcu": "atmega168",
"variant": "standard"
@ -41,8 +41,8 @@
},
"atmegangatmega8": {
"build": {
"board": "AVR_NG",
"core": "arduino",
"extra_flags": "-DARDUINO_ARCH_AVR -DARDUINO_AVR_NG",
"f_cpu": "16000000L",
"mcu": "atmega8",
"variant": "standard"
@ -58,8 +58,8 @@
},
"btatmega168": {
"build": {
"board": "AVR_BT",
"core": "arduino",
"extra_flags": "-DARDUINO_ARCH_AVR -DARDUINO_AVR_BT",
"f_cpu": "16000000L",
"mcu": "atmega168",
"variant": "eightanaloginputs"
@ -76,8 +76,8 @@
},
"btatmega328": {
"build": {
"board": "AVR_BT",
"core": "arduino",
"extra_flags": "-DARDUINO_ARCH_AVR -DARDUINO_AVR_BT",
"f_cpu": "16000000L",
"mcu": "atmega328p",
"variant": "eightanaloginputs"
@ -94,8 +94,8 @@
},
"diecimilaatmega168": {
"build": {
"board": "AVR_DUEMILANOVE",
"core": "arduino",
"extra_flags": "-DARDUINO_ARCH_AVR -DARDUINO_AVR_DUEMILANOVE",
"f_cpu": "16000000L",
"mcu": "atmega168",
"variant": "standard"
@ -111,8 +111,8 @@
},
"diecimilaatmega328": {
"build": {
"board": "AVR_DUEMILANOVE",
"core": "arduino",
"extra_flags": "-DARDUINO_ARCH_AVR -DARDUINO_AVR_DUEMILANOVE",
"f_cpu": "16000000L",
"mcu": "atmega328p",
"variant": "standard"
@ -128,8 +128,8 @@
},
"esplora": {
"build": {
"board": "AVR_ESPLORA",
"core": "arduino",
"extra_flags": "-DARDUINO_ARCH_AVR -DARDUINO_AVR_ESPLORA",
"f_cpu": "16000000L",
"mcu": "atmega32u4",
"pid": "0x803c",
@ -151,8 +151,8 @@
},
"ethernet": {
"build": {
"board": "AVR_ETHERNET",
"core": "arduino",
"extra_flags": "-DARDUINO_ARCH_AVR -DARDUINO_AVR_ETHERNET",
"f_cpu": "16000000L",
"mcu": "atmega328p",
"variant": "ethernet"
@ -168,8 +168,8 @@
},
"fio": {
"build": {
"board": "AVR_FIO",
"core": "arduino",
"extra_flags": "-DARDUINO_ARCH_AVR -DARDUINO_AVR_FIO",
"f_cpu": "8000000L",
"mcu": "atmega328p",
"variant": "eightanaloginputs"
@ -185,8 +185,8 @@
},
"leonardo": {
"build": {
"board": "AVR_LEONARDO",
"core": "arduino",
"extra_flags": "-DARDUINO_ARCH_AVR -DARDUINO_AVR_LEONARDO",
"f_cpu": "16000000L",
"mcu": "atmega32u4",
"pid": "0x8036",
@ -208,8 +208,8 @@
},
"lilypadatmega168": {
"build": {
"board": "AVR_LILYPAD",
"core": "arduino",
"extra_flags": "-DARDUINO_ARCH_AVR -DARDUINO_AVR_LILYPAD",
"f_cpu": "8000000L",
"mcu": "atmega168",
"variant": "standard"
@ -225,8 +225,8 @@
},
"lilypadatmega328": {
"build": {
"board": "AVR_LILYPAD",
"core": "arduino",
"extra_flags": "-DARDUINO_ARCH_AVR -DARDUINO_AVR_LILYPAD",
"f_cpu": "8000000L",
"mcu": "atmega328p",
"variant": "standard"
@ -242,8 +242,8 @@
},
"megaADK": {
"build": {
"board": "AVR_ADK",
"core": "arduino",
"extra_flags": "-DARDUINO_ARCH_AVR -DARDUINO_AVR_ADK",
"f_cpu": "16000000L",
"mcu": "atmega2560",
"variant": "mega"
@ -259,8 +259,8 @@
},
"megaatmega1280": {
"build": {
"board": "AVR_MEGA",
"core": "arduino",
"extra_flags": "-DARDUINO_ARCH_AVR -DARDUINO_AVR_MEGA",
"f_cpu": "16000000L",
"mcu": "atmega1280",
"variant": "mega"
@ -276,8 +276,8 @@
},
"megaatmega2560": {
"build": {
"board": "AVR_MEGA2560",
"core": "arduino",
"extra_flags": "-DARDUINO_ARCH_AVR -DARDUINO_AVR_MEGA2560",
"f_cpu": "16000000L",
"mcu": "atmega2560",
"variant": "mega"
@ -293,8 +293,8 @@
},
"micro": {
"build": {
"board": "AVR_MICRO",
"core": "arduino",
"extra_flags": "-DARDUINO_ARCH_AVR -DARDUINO_AVR_MICRO",
"f_cpu": "16000000L",
"mcu": "atmega32u4",
"pid": "0x8037",
@ -316,8 +316,8 @@
},
"miniatmega168": {
"build": {
"board": "AVR_MINI",
"core": "arduino",
"extra_flags": "-DARDUINO_ARCH_AVR -DARDUINO_AVR_MINI",
"f_cpu": "16000000L",
"mcu": "atmega168",
"variant": "eightanaloginputs"
@ -333,8 +333,8 @@
},
"miniatmega328": {
"build": {
"board": "AVR_MINI",
"core": "arduino",
"extra_flags": "-DARDUINO_ARCH_AVR -DARDUINO_AVR_MINI",
"f_cpu": "16000000L",
"mcu": "atmega328p",
"variant": "eightanaloginputs"
@ -350,8 +350,8 @@
},
"nanoatmega168": {
"build": {
"board": "AVR_NANO",
"core": "arduino",
"extra_flags": "-DARDUINO_ARCH_AVR -DARDUINO_AVR_NANO",
"f_cpu": "16000000L",
"mcu": "atmega168",
"variant": "eightanaloginputs"
@ -367,8 +367,8 @@
},
"nanoatmega328": {
"build": {
"board": "AVR_NANO",
"core": "arduino",
"extra_flags": "-DARDUINO_ARCH_AVR -DARDUINO_AVR_NANO",
"f_cpu": "16000000L",
"mcu": "atmega328p",
"variant": "eightanaloginputs"
@ -384,8 +384,8 @@
},
"pro16MHzatmega168": {
"build": {
"board": "AVR_PRO",
"core": "arduino",
"extra_flags": "-DARDUINO_ARCH_AVR -DARDUINO_AVR_PRO",
"f_cpu": "16000000L",
"mcu": "atmega168",
"variant": "eightanaloginputs"
@ -401,8 +401,8 @@
},
"pro16MHzatmega328": {
"build": {
"board": "AVR_PRO",
"core": "arduino",
"extra_flags": "-DARDUINO_ARCH_AVR -DARDUINO_AVR_PRO",
"f_cpu": "16000000L",
"mcu": "atmega328p",
"variant": "eightanaloginputs"
@ -418,8 +418,8 @@
},
"pro8MHzatmega168": {
"build": {
"board": "AVR_PRO",
"core": "arduino",
"extra_flags": "-DARDUINO_ARCH_AVR -DARDUINO_AVR_PRO",
"f_cpu": "8000000L",
"mcu": "atmega168",
"variant": "eightanaloginputs"
@ -435,8 +435,8 @@
},
"pro8MHzatmega328": {
"build": {
"board": "AVR_PRO",
"core": "arduino",
"extra_flags": "-DARDUINO_ARCH_AVR -DARDUINO_AVR_PRO",
"f_cpu": "8000000L",
"mcu": "atmega328p",
"variant": "eightanaloginputs"
@ -452,8 +452,8 @@
},
"robotControl": {
"build": {
"board": "AVR_ROBOT_CONTROL",
"core": "arduino",
"extra_flags": "-DARDUINO_ARCH_AVR -DARDUINO_AVR_ROBOT_CONTROL",
"f_cpu": "16000000L",
"mcu": "atmega32u4",
"pid": "0x8038",
@ -475,8 +475,8 @@
},
"robotMotor": {
"build": {
"board": "AVR_ROBOT_MOTOR",
"core": "arduino",
"extra_flags": "-DARDUINO_ARCH_AVR -DARDUINO_AVR_ROBOT_MOTOR",
"f_cpu": "16000000L",
"mcu": "atmega32u4",
"pid": "0x8039",
@ -498,8 +498,8 @@
},
"uno": {
"build": {
"board": "AVR_UNO",
"core": "arduino",
"extra_flags": "-DARDUINO_ARCH_AVR -DARDUINO_AVR_UNO",
"f_cpu": "16000000L",
"mcu": "atmega328p",
"variant": "standard"
@ -515,8 +515,8 @@
},
"yun": {
"build": {
"board": "AVR_YUN",
"core": "arduino",
"extra_flags": "-DARDUINO_ARCH_AVR -DARDUINO_AVR_YUN",
"f_cpu": "16000000L",
"mcu": "atmega32u4",
"pid": "0x8041",
@ -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
}
}
}

View File

@ -2,11 +2,11 @@
"stm32f4discovery": {
"build": {
"core": "stm32",
"extra_flags": "-DSTM32F40_41xxx",
"f_cpu": "168000000L",
"ldscript": "stm32f405x6.ld",
"mcu": "cortex-m4",
"variant": "stm32f4",
"extra_flags": "-DSTM32F40_41xxx"
"variant": "stm32f4"
},
"name": "STM32F4Discovery (168 MHz) with digital accelerometer, digital microphone, audio DAC",
"platform": "stm32",
@ -18,11 +18,11 @@
"stm32ldiscovery": {
"build": {
"core": "stm32",
"extra_flags": "-DSTM32L1XX_MD",
"f_cpu": "32000000L",
"ldscript": "stm32l15xx6.ld",
"mcu": "cortex-m3",
"variant": "stm32l1",
"extra_flags": "-DSTM32L1XX_MD"
"variant": "stm32l1"
},
"name": "STM32LDiscovery (32 MHz) ultra low-power development kit",
"platform": "stm32",
@ -34,11 +34,11 @@
"stm32f3discovery": {
"build": {
"core": "stm32",
"extra_flags": "-DSTM32F303xC",
"f_cpu": "72000000L",
"ldscript": "stm32f30xx.ld",
"mcu": "cortex-m4",
"variant": "stm32f3",
"extra_flags": "-DSTM32F303xC"
"variant": "stm32f3"
},
"name": "STM32F3Discovery (72 MHz) with accelerometer, gyroscope and e-compass",
"platform": "stm32",

View File

@ -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(",")]

View File

@ -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
@ -26,24 +26,55 @@ if "usb_product" in env.subst("${BOARD_OPTIONS['build']}"):
"${BOARD_OPTIONS['build']['usb_product']}").replace('"', ""))
]
# include board variant
env.VariantDir(
join("$BUILD_DIR", "FrameworkArduinoVariant"),
join("$PLATFORMFW_DIR", "variants", "${BOARD_OPTIONS['build']['variant']}")
)
env.Append(
CPPDEFINES=[
"ARDUINO_ARCH_%s" % env.subst("$PLATFORM").upper()[-3:],
"ARDUINO=%d" % ARDUINO_VERSION,
"ARDUINO_${BOARD_OPTIONS['build']['board']}"
"ARDUINO=%d" % ARDUINO_VERSION
] + ARDUINO_USBDEFINES,
CPPPATH=[
join("$BUILD_DIR", "FrameworkArduino"),
join("$BUILD_DIR", "FrameworkArduinoVariant")
join("$BUILD_DIR", "FrameworkArduino")
]
)
# include board variant
if "variant" in env.get("BOARD_OPTIONS", {}).get("build", {}):
env.VariantDir(
join("$BUILD_DIR", "FrameworkArduinoVariant"),
join("$PLATFORMFW_DIR", "variants",
"${BOARD_OPTIONS['build']['variant']}")
)
env.Append(
CPPPATH=[
join("$BUILD_DIR", "FrameworkArduinoVariant")
]
)
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

View File

@ -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(

View File

@ -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(

View File

@ -0,0 +1,137 @@
# Copyright (C) Ivan Kravets <me@ikravets.com>
# 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",
"-Wall",
"-mthumb",
"-mcpu=${BOARD_OPTIONS['build']['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
"-mcpu=${BOARD_OPTIONS['build']['mcu']}",
"-mthumb"
],
CXXFLAGS=[
"-fno-rtti",
"-fno-exceptions"
],
CPPDEFINES=[
"F_CPU=$BOARD_F_CPU"
],
LINKFLAGS=[
"-Os",
"-Wl,--gc-sections",
"-mcpu=${BOARD_OPTIONS['build']['mcu']}",
"-mthumb"
],
UPLOADER=join("$PIOPACKAGES_DIR", "$PIOPACKAGE_UPLOADER", "bossac"),
UPLOADERFLAGS=[
"--info",
"--debug",
"--port", "$UPLOAD_PORT",
"--erase",
"--write",
"--verify",
"--boot"
],
UPLOADBINCMD='"$UPLOADER" $UPLOADERFLAGS $SOURCES'
)
env.Append(
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", "gcc"])
#
# 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: Upload by default .bin file
#
upload = env.Alias(["upload", "uploadlazy"], target_bin, ("$UPLOADBINCMD"))
AlwaysBuild(upload)
#
# Check for $UPLOAD_PORT variable
#
is_uptarget = (set(["upload", "uploadlazy"]) & 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)

View File

@ -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=[

View File

@ -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(

View File

@ -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'])

View File

@ -0,0 +1,34 @@
# Copyright (C) Ivan Kravets <me@ikravets.com>
# See LICENSE for details.
from platformio.platforms.base import BasePlatform
class SamPlatform(BasePlatform):
"""
An embedded platform for Atmel SAM microcontrollers
(with Arduino Framework)
"""
PACKAGES = {
"toolchain-gccarmnoneeabi": {
"alias": "toolchain",
"default": True
},
"ldscripts": {
"default": True
},
"framework-arduinosam": {
"alias": "framework",
"default": True
},
"tool-bossac": {
"alias": "uploader",
"default": True
}
}