Initial support for RP2040
This commit is contained in:
66
builder/frameworks/_bare.py
Normal file
66
builder/frameworks/_bare.py
Normal file
@ -0,0 +1,66 @@
|
||||
# Copyright 2014-present PlatformIO <contact@platformio.org>
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
#
|
||||
# Default flags for bare-metal programming (without any framework layers)
|
||||
#
|
||||
|
||||
from SCons.Script import DefaultEnvironment
|
||||
|
||||
env = DefaultEnvironment()
|
||||
|
||||
env.Append(
|
||||
ASFLAGS=["-x", "assembler-with-cpp"],
|
||||
|
||||
CCFLAGS=[
|
||||
"-Os", # optimize for size
|
||||
"-ffunction-sections", # place each function in its own section
|
||||
"-fdata-sections",
|
||||
"-Wall",
|
||||
"-mthumb",
|
||||
"-nostdlib"
|
||||
],
|
||||
|
||||
CXXFLAGS=[
|
||||
"-fno-rtti",
|
||||
"-fno-exceptions"
|
||||
],
|
||||
|
||||
CPPDEFINES=[
|
||||
("F_CPU", "$BOARD_F_CPU")
|
||||
],
|
||||
|
||||
LINKFLAGS=[
|
||||
"-Os",
|
||||
"-Wl,--gc-sections,--relax",
|
||||
"-mthumb",
|
||||
"--specs=nano.specs",
|
||||
"--specs=nosys.specs"
|
||||
],
|
||||
|
||||
LIBS=["c", "gcc", "m", "stdc++", "nosys"]
|
||||
)
|
||||
|
||||
if "BOARD" in env:
|
||||
env.Append(
|
||||
CCFLAGS=[
|
||||
"-mcpu=%s" % env.BoardConfig().get("build.cpu")
|
||||
],
|
||||
LINKFLAGS=[
|
||||
"-mcpu=%s" % env.BoardConfig().get("build.cpu")
|
||||
]
|
||||
)
|
||||
|
||||
# copy CCFLAGS to ASFLAGS (-x assembler-with-cpp mode)
|
||||
env.Append(ASFLAGS=env.get("CCFLAGS", [])[:])
|
1
builder/frameworks/arduino/mbed-core
Submodule
1
builder/frameworks/arduino/mbed-core
Submodule
Submodule builder/frameworks/arduino/mbed-core added at ceb4f608f9
222
builder/main.py
Normal file
222
builder/main.py
Normal file
@ -0,0 +1,222 @@
|
||||
# Copyright 2014-present PlatformIO <contact@platformio.org>
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
import sys
|
||||
from platform import system
|
||||
from os import makedirs
|
||||
from os.path import isdir, join
|
||||
|
||||
from platformio.util import get_serial_ports
|
||||
|
||||
from SCons.Script import (ARGUMENTS, COMMAND_LINE_TARGETS, AlwaysBuild,
|
||||
Builder, Default, DefaultEnvironment)
|
||||
|
||||
|
||||
def BeforeUpload(target, source, env): # pylint: disable=W0613,W0621
|
||||
upload_options = {}
|
||||
if "BOARD" in env:
|
||||
upload_options = env.BoardConfig().get("upload", {})
|
||||
|
||||
env.AutodetectUploadPort()
|
||||
before_ports = get_serial_ports()
|
||||
|
||||
if upload_options.get("use_1200bps_touch", False):
|
||||
env.TouchSerialPort("$UPLOAD_PORT", 1200)
|
||||
|
||||
if upload_options.get("wait_for_upload_port", False):
|
||||
env.Replace(UPLOAD_PORT=env.WaitForNewSerialPort(before_ports))
|
||||
|
||||
|
||||
env = DefaultEnvironment()
|
||||
platform = env.PioPlatform()
|
||||
board = env.BoardConfig()
|
||||
|
||||
env.Replace(
|
||||
AR="arm-none-eabi-ar",
|
||||
AS="arm-none-eabi-as",
|
||||
CC="arm-none-eabi-gcc",
|
||||
CXX="arm-none-eabi-g++",
|
||||
GDB="arm-none-eabi-gdb",
|
||||
OBJCOPY="arm-none-eabi-objcopy",
|
||||
RANLIB="arm-none-eabi-ranlib",
|
||||
SIZETOOL="arm-none-eabi-size",
|
||||
|
||||
ARFLAGS=["rc"],
|
||||
|
||||
SIZEPROGREGEXP=r"^(?:\.text|\.data|\.rodata|\.text.align|\.ARM.exidx)\s+(\d+).*",
|
||||
SIZEDATAREGEXP=r"^(?:\.data|\.bss|\.noinit)\s+(\d+).*",
|
||||
SIZECHECKCMD="$SIZETOOL -A -d $SOURCES",
|
||||
SIZEPRINTCMD='$SIZETOOL -B -d $SOURCES',
|
||||
|
||||
PROGSUFFIX=".elf"
|
||||
)
|
||||
|
||||
# Allow user to override via pre:script
|
||||
if env.get("PROGNAME", "program") == "program":
|
||||
env.Replace(PROGNAME="firmware")
|
||||
|
||||
env.Append(
|
||||
BUILDERS=dict(
|
||||
ElfToBin=Builder(
|
||||
action=env.VerboseAction(" ".join([
|
||||
"$OBJCOPY",
|
||||
"-O",
|
||||
"binary",
|
||||
"$SOURCES",
|
||||
"$TARGET"
|
||||
]), "Building $TARGET"),
|
||||
suffix=".bin"
|
||||
),
|
||||
ElfToHex=Builder(
|
||||
action=env.VerboseAction(" ".join([
|
||||
"$OBJCOPY",
|
||||
"-O",
|
||||
"ihex",
|
||||
"-R",
|
||||
".eeprom",
|
||||
"$SOURCES",
|
||||
"$TARGET"
|
||||
]), "Building $TARGET"),
|
||||
suffix=".hex"
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
if not env.get("PIOFRAMEWORK"):
|
||||
env.SConscript("frameworks/_bare.py")
|
||||
|
||||
#
|
||||
# Target: Build executable and linkable firmware
|
||||
#
|
||||
|
||||
target_elf = None
|
||||
if "nobuild" in COMMAND_LINE_TARGETS:
|
||||
target_elf = join("$BUILD_DIR", "${PROGNAME}.elf")
|
||||
target_firm = join("$BUILD_DIR", "${PROGNAME}.bin")
|
||||
else:
|
||||
target_elf = env.BuildProgram()
|
||||
target_firm = env.ElfToBin(join("$BUILD_DIR", "${PROGNAME}"), target_elf)
|
||||
env.Depends(target_firm, "checkprogsize")
|
||||
|
||||
AlwaysBuild(env.Alias("nobuild", target_firm))
|
||||
target_buildprog = env.Alias("buildprog", target_firm, target_firm)
|
||||
|
||||
#
|
||||
# Target: Print binary size
|
||||
#
|
||||
|
||||
target_size = env.Alias(
|
||||
"size", target_elf,
|
||||
env.VerboseAction("$SIZEPRINTCMD", "Calculating size $SOURCE"))
|
||||
AlwaysBuild(target_size)
|
||||
|
||||
#
|
||||
# Target: Upload by default .bin file
|
||||
#
|
||||
|
||||
debug_tools = env.BoardConfig().get("debug.tools", {})
|
||||
upload_protocol = env.subst("$UPLOAD_PROTOCOL") or "picotool"
|
||||
upload_actions = []
|
||||
upload_source = target_firm
|
||||
|
||||
if upload_protocol == "mbed":
|
||||
upload_actions = [
|
||||
env.VerboseAction(env.AutodetectUploadPort, "Looking for upload disk..."),
|
||||
env.VerboseAction(env.UploadToDisk, "Uploading $SOURCE")
|
||||
]
|
||||
elif upload_protocol == "picotool":
|
||||
env.Replace(
|
||||
UPLOADER=join(platform.get_package_dir("tool-rp2040tools") or "", "rp2040load"),
|
||||
UPLOADERFLAGS=["-v", "-D"],
|
||||
UPLOADCMD="$UPLOADER $UPLOADERFLAGS $SOURCES"
|
||||
)
|
||||
|
||||
upload_actions = [
|
||||
env.VerboseAction(BeforeUpload, "Looking for upload port..."),
|
||||
env.VerboseAction("$UPLOADCMD", "Uploading $SOURCE"),
|
||||
]
|
||||
|
||||
upload_source = target_elf
|
||||
|
||||
elif upload_protocol.startswith("jlink"):
|
||||
|
||||
def _jlink_cmd_script(env, source):
|
||||
build_dir = env.subst("$BUILD_DIR")
|
||||
if not isdir(build_dir):
|
||||
makedirs(build_dir)
|
||||
script_path = join(build_dir, "upload.jlink")
|
||||
commands = [
|
||||
"h",
|
||||
"loadbin %s, %s" % (source, board.get(
|
||||
"upload.offset_address", "0x0")),
|
||||
"r",
|
||||
"q"
|
||||
]
|
||||
with open(script_path, "w") as fp:
|
||||
fp.write("\n".join(commands))
|
||||
return script_path
|
||||
|
||||
env.Replace(
|
||||
__jlink_cmd_script=_jlink_cmd_script,
|
||||
UPLOADER="JLink.exe" if system() == "Windows" else "JLinkExe",
|
||||
UPLOADERFLAGS=[
|
||||
"-device", board.get("debug", {}).get("jlink_device"),
|
||||
"-speed", env.GetProjectOption("debug_speed", "4000"),
|
||||
"-if", ("jtag" if upload_protocol == "jlink-jtag" else "swd"),
|
||||
"-autoconnect", "1",
|
||||
"-NoGui", "1"
|
||||
],
|
||||
UPLOADCMD='$UPLOADER $UPLOADERFLAGS -CommanderScript "${__jlink_cmd_script(__env__, SOURCE)}"'
|
||||
)
|
||||
upload_actions = [env.VerboseAction("$UPLOADCMD", "Uploading $SOURCE")]
|
||||
|
||||
elif upload_protocol in debug_tools:
|
||||
openocd_args = [
|
||||
"-d%d" % (2 if int(ARGUMENTS.get("PIOVERBOSE", 0)) else 1)
|
||||
]
|
||||
openocd_args.extend(
|
||||
debug_tools.get(upload_protocol).get("server").get("arguments", []))
|
||||
if env.GetProjectOption("debug_speed"):
|
||||
openocd_args.extend(
|
||||
["-c", "adapter speed %s" % env.GetProjectOption("debug_speed")]
|
||||
)
|
||||
openocd_args.extend([
|
||||
"-c", "program {$SOURCE} %s verify reset; shutdown;" %
|
||||
board.get("upload.offset_address", "")
|
||||
])
|
||||
openocd_args = [
|
||||
f.replace("$PACKAGE_DIR", platform.get_package_dir(
|
||||
"tool-openocd-raspberrypi") or "")
|
||||
for f in openocd_args
|
||||
]
|
||||
env.Replace(
|
||||
UPLOADER="openocd",
|
||||
UPLOADERFLAGS=openocd_args,
|
||||
UPLOADCMD="$UPLOADER $UPLOADERFLAGS")
|
||||
upload_actions = [env.VerboseAction("$UPLOADCMD", "Uploading $SOURCE")]
|
||||
|
||||
# custom upload tool
|
||||
elif upload_protocol == "custom":
|
||||
upload_actions = [env.VerboseAction("$UPLOADCMD", "Uploading $SOURCE")]
|
||||
|
||||
if not upload_actions:
|
||||
sys.stderr.write("Warning! Unknown upload protocol %s\n" % upload_protocol)
|
||||
|
||||
AlwaysBuild(env.Alias("upload", upload_source, upload_actions))
|
||||
|
||||
#
|
||||
# Default targets
|
||||
#
|
||||
|
||||
Default([target_buildprog, target_size])
|
Reference in New Issue
Block a user