mirror of
https://github.com/platformio/platformio-core.git
synced 2025-07-30 18:17:13 +02:00
Initial support for MBED Framework
This commit is contained in:
21
examples/mbed/mbed-blink/README.rst
Normal file
21
examples/mbed/mbed-blink/README.rst
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
How to buid PlatformIO based project
|
||||||
|
====================================
|
||||||
|
|
||||||
|
1. `Install PlatformIO <http://docs.platformio.org/en/latest/installation.html>`_
|
||||||
|
2. Download `source code with examples <https://github.com/ivankravets/platformio/archive/develop.zip>`_
|
||||||
|
3. Extract ZIP archive
|
||||||
|
4. Run these commands:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
# Change directory to example
|
||||||
|
> cd platformio-develop/examples/mbed/mbed-blink
|
||||||
|
|
||||||
|
# Process example project
|
||||||
|
> platformio run
|
||||||
|
|
||||||
|
# Upload firmware
|
||||||
|
> platformio run --target upload
|
||||||
|
|
||||||
|
# Clean build files
|
||||||
|
> platformio run --target clean
|
43
examples/mbed/mbed-blink/platformio.ini
Normal file
43
examples/mbed/mbed-blink/platformio.ini
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
#
|
||||||
|
# Project Configuration File
|
||||||
|
#
|
||||||
|
# A detailed documentation with the EXAMPLES is located here:
|
||||||
|
# http://docs.platformio.org/en/latest/projectconf.html
|
||||||
|
#
|
||||||
|
|
||||||
|
# A sign `#` at the beginning of the line indicates a comment
|
||||||
|
# Comment lines are ignored.
|
||||||
|
|
||||||
|
# Simple and base environment
|
||||||
|
# [env:mybaseenv]
|
||||||
|
# platform = %INSTALLED_PLATFORM_NAME_HERE%
|
||||||
|
# framework =
|
||||||
|
# board =
|
||||||
|
#
|
||||||
|
# Automatic targets - enable auto-uploading
|
||||||
|
# targets = upload
|
||||||
|
|
||||||
|
|
||||||
|
# NXP LPC Platform
|
||||||
|
[env:lpc1768]
|
||||||
|
platform = nxplpc
|
||||||
|
framework = mbed
|
||||||
|
board = lpc1768
|
||||||
|
|
||||||
|
# Nordic nRF51 Platform
|
||||||
|
[env:nrf51_mkit]
|
||||||
|
platform = nordicnrf51
|
||||||
|
framework = mbed
|
||||||
|
board = nrf51_mkit
|
||||||
|
|
||||||
|
# Freescale FRDM Platform
|
||||||
|
[env:frdm_k64f]
|
||||||
|
platform = freescalekinetis
|
||||||
|
framework = mbed
|
||||||
|
board = frdm_k64f
|
||||||
|
|
||||||
|
# ST STM32 Platform
|
||||||
|
[env:nucleo_f401re]
|
||||||
|
platform = ststm32
|
||||||
|
framework = mbed
|
||||||
|
board = nucleo_f401re
|
12
examples/mbed/mbed-blink/src/main.cpp
Normal file
12
examples/mbed/mbed-blink/src/main.cpp
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#include "mbed.h"
|
||||||
|
|
||||||
|
DigitalOut myled(LED1);
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
while(1) {
|
||||||
|
myled = 1;
|
||||||
|
wait(1);
|
||||||
|
myled = 0;
|
||||||
|
wait(1);
|
||||||
|
}
|
||||||
|
}
|
140
platformio/builder/scripts/frameworks/mbed.py
Normal file
140
platformio/builder/scripts/frameworks/mbed.py
Normal file
@ -0,0 +1,140 @@
|
|||||||
|
# Copyright (C) Ivan Kravets <me@ikravets.com>
|
||||||
|
# See LICENSE for details.
|
||||||
|
|
||||||
|
"""
|
||||||
|
Build script for Mbed Framework
|
||||||
|
"""
|
||||||
|
|
||||||
|
import xml.etree.ElementTree as ElementTree
|
||||||
|
from binascii import crc32
|
||||||
|
from os.path import join, normpath
|
||||||
|
|
||||||
|
from SCons.Script import DefaultEnvironment
|
||||||
|
|
||||||
|
env = DefaultEnvironment()
|
||||||
|
|
||||||
|
BOARD_OPTS = env.get("BOARD_OPTIONS", {}).get("build", {})
|
||||||
|
|
||||||
|
env.Replace(
|
||||||
|
PLATFORMFW_DIR=join("$PIOPACKAGES_DIR", "framework-mbed")
|
||||||
|
)
|
||||||
|
|
||||||
|
MBED_VARIANTS = {
|
||||||
|
"stm32f3discovery": "DISCO_F303VC",
|
||||||
|
"stm32f4discovery": "DISCO_F407VG",
|
||||||
|
"stm32f429discovery": "DISCO_F429ZI",
|
||||||
|
"blueboard_lpc11u24": "LPC11U24",
|
||||||
|
"dipcortexm0": "LPC11U24",
|
||||||
|
"seeeduinoArchPro": "ARCH_PRO",
|
||||||
|
"ubloxc027": "UBLOX_C027",
|
||||||
|
"lpc1114fn28": "LPC1114",
|
||||||
|
"lpc11u35": "LPC11U35_401",
|
||||||
|
"mbuino": "LPC11U24",
|
||||||
|
"nrf51_mkit": "NRF51822",
|
||||||
|
"redBearLab": "NRF51822",
|
||||||
|
"nrf51-dt": "NRF51_DK",
|
||||||
|
"redBearLabBLENano": "NRF51822",
|
||||||
|
"wallBotBLE": "NRF51822",
|
||||||
|
"frdm_kl25z": "KL25Z",
|
||||||
|
"frdm_kl46z": "KL46Z",
|
||||||
|
"frdm_k64f": "K64F",
|
||||||
|
"frdm_kl05z": "KL05Z",
|
||||||
|
"frdm_k20d50m": "K20D50M",
|
||||||
|
"frdm_k22f": "K22F"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def parse_eix_file(filename):
|
||||||
|
result = {}
|
||||||
|
paths = (
|
||||||
|
("CFLAGS", "./Target/Source/CC/Switch"),
|
||||||
|
("CXXFLAGS", "./Target/Source/CPPC/Switch"),
|
||||||
|
("CPPDEFINES", "./Target/Source/Symbols/Symbol"),
|
||||||
|
("FILES", "./Target/Files/File"),
|
||||||
|
("LINKFLAGS", "./Target/Source/LD/Switch"),
|
||||||
|
("STDLIBS", "./Target/Source/Syslibs/Library"),
|
||||||
|
("LDSCRIPT_PATH", "./Target/Source/Scriptfile"),
|
||||||
|
("CPPPATH", "./Target/Compiler/Includepaths/Includepath")
|
||||||
|
)
|
||||||
|
|
||||||
|
tree = ElementTree.parse(filename)
|
||||||
|
|
||||||
|
for (key, path) in paths:
|
||||||
|
if key not in result:
|
||||||
|
result[key] = []
|
||||||
|
|
||||||
|
for node in tree.findall(path):
|
||||||
|
_nkeys = node.keys()
|
||||||
|
result[key].append(
|
||||||
|
node.get(_nkeys[0]) if len(_nkeys) == 1 else node.attrib)
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
def get_source_files(flist):
|
||||||
|
files = []
|
||||||
|
for f in flist:
|
||||||
|
if f['type'] == "h" or not f['name'].startswith("mbed"):
|
||||||
|
continue
|
||||||
|
files.append(join("$BUILD_DIR", "FrameworkMBED", f['name'][5:]))
|
||||||
|
return files
|
||||||
|
|
||||||
|
|
||||||
|
def get_build_flags(data):
|
||||||
|
flags = {}
|
||||||
|
cflags = set(data.get("CFLAGS", []))
|
||||||
|
cxxflags = set(data.get("CXXFLAGS", []))
|
||||||
|
cppflags = set(cflags & cxxflags)
|
||||||
|
flags['CPPFLAGS'] = list(cppflags)
|
||||||
|
flags['CXXFLAGS'] = list(cxxflags - cppflags)
|
||||||
|
flags['CFLAGS'] = list(cflags - cppflags)
|
||||||
|
return flags
|
||||||
|
|
||||||
|
board_type = env.subst("$BOARD")
|
||||||
|
variant = MBED_VARIANTS[
|
||||||
|
board_type] if board_type in MBED_VARIANTS else board_type.upper()
|
||||||
|
eixdata = parse_eix_file(
|
||||||
|
join(env.subst("$PLATFORMFW_DIR"), "variant", variant, "%s.eix" % variant))
|
||||||
|
|
||||||
|
build_flags = get_build_flags(eixdata)
|
||||||
|
env.Replace(
|
||||||
|
CPPFLAGS=build_flags.get("CPPFLAGS", []),
|
||||||
|
CFLAGS=build_flags.get("CFLAGS", []),
|
||||||
|
CXXFLAGS=build_flags.get("CXXFLAGS", []),
|
||||||
|
LINKFLAGS=eixdata.get("LINKFLAGS", []),
|
||||||
|
CPPDEFINES=[define for define in eixdata.get("CPPDEFINES", [])],
|
||||||
|
LDSCRIPT_PATH=normpath(join(
|
||||||
|
"$PLATFORMFW_DIR", "core", eixdata.get("LDSCRIPT_PATH")[0][5:]))
|
||||||
|
)
|
||||||
|
|
||||||
|
# Hook for K64F and K22F
|
||||||
|
if board_type in ("frdm_k22f", "frdm_k64f"):
|
||||||
|
env.Append(
|
||||||
|
LINKFLAGS=["-Wl,--start-group"]
|
||||||
|
)
|
||||||
|
|
||||||
|
for lib_path in eixdata.get("CPPPATH"):
|
||||||
|
_vdir = join("$BUILD_DIR", "FrameworkMbedInc%d" % crc32(lib_path))
|
||||||
|
env.VariantDir(
|
||||||
|
_vdir,
|
||||||
|
join("$PLATFORMFW_DIR", "core", lib_path[5:])
|
||||||
|
)
|
||||||
|
env.Append(CPPPATH=[_vdir])
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Target: Build MBED Library
|
||||||
|
#
|
||||||
|
|
||||||
|
libs = [l for l in eixdata.get("STDLIBS", []) if l not in env.get("LIBS")]
|
||||||
|
|
||||||
|
env.VariantDir(
|
||||||
|
join("$BUILD_DIR", "FrameworkMBED"),
|
||||||
|
join("$PLATFORMFW_DIR", "core")
|
||||||
|
)
|
||||||
|
libs.append(env.Library(
|
||||||
|
join("$BUILD_DIR", "FrameworkMBED"),
|
||||||
|
get_source_files(eixdata.get("FILES", []))
|
||||||
|
))
|
||||||
|
|
||||||
|
env.Append(LIBS=libs)
|
@ -7,7 +7,7 @@ from time import sleep
|
|||||||
from SCons.Script import Exit
|
from SCons.Script import Exit
|
||||||
from serial import Serial
|
from serial import Serial
|
||||||
|
|
||||||
from platformio.util import get_serialports
|
from platformio.util import get_logicaldisks, get_serialports
|
||||||
|
|
||||||
|
|
||||||
def FlushSerialBuffer(env, port):
|
def FlushSerialBuffer(env, port):
|
||||||
@ -52,16 +52,28 @@ def WaitForNewSerialPort(_, before):
|
|||||||
|
|
||||||
|
|
||||||
def AutodetectUploadPort(env):
|
def AutodetectUploadPort(env):
|
||||||
if "UPLOAD_PORT" not in env:
|
if "UPLOAD_PORT" in env:
|
||||||
|
return
|
||||||
|
|
||||||
|
if env.subst("$FRAMEWORK") == "mbed":
|
||||||
|
for item in get_logicaldisks():
|
||||||
|
if not item['name'] or "mbed" != item['name'].lower():
|
||||||
|
continue
|
||||||
|
print "Auto-detected UPLOAD_PORT: %s" % item['disk']
|
||||||
|
env.Replace(UPLOAD_PORT=item['disk'])
|
||||||
|
break
|
||||||
|
else:
|
||||||
for item in get_serialports():
|
for item in get_serialports():
|
||||||
if "VID:PID" in item['hwid']:
|
if "VID:PID" not in item['hwid']:
|
||||||
print "Auto-detected UPLOAD_PORT: %s" % item['port']
|
continue
|
||||||
env.Replace(UPLOAD_PORT=item['port'])
|
print "Auto-detected UPLOAD_PORT: %s" % item['port']
|
||||||
break
|
env.Replace(UPLOAD_PORT=item['port'])
|
||||||
|
break
|
||||||
|
|
||||||
if "UPLOAD_PORT" not in env:
|
if "UPLOAD_PORT" not in env:
|
||||||
Exit("Error: Please specify `upload_port` for environment or use "
|
Exit("Error: Please specify `upload_port` for environment or use "
|
||||||
"global `--upload-port` option.\n")
|
"global `--upload-port` option.\n"
|
||||||
|
"For the some development platforms it can be USB flash drive\n")
|
||||||
|
|
||||||
|
|
||||||
def exists(_):
|
def exists(_):
|
||||||
|
@ -3,8 +3,10 @@
|
|||||||
|
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
|
import re
|
||||||
import subprocess
|
import subprocess
|
||||||
from os.path import abspath, dirname, expanduser, isdir, isfile, join, realpath
|
from os.path import (abspath, basename, dirname, expanduser, isdir, isfile,
|
||||||
|
join, realpath)
|
||||||
from platform import system, uname
|
from platform import system, uname
|
||||||
from threading import Thread
|
from threading import Thread
|
||||||
|
|
||||||
@ -173,7 +175,30 @@ def get_serialports():
|
|||||||
from serial.tools.list_ports_posix import comports
|
from serial.tools.list_ports_posix import comports
|
||||||
else:
|
else:
|
||||||
raise exception.GetSerialPortsError(os.name)
|
raise exception.GetSerialPortsError(os.name)
|
||||||
return[{"port": p, "description": d, "hwid": h} for p, d, h in comports()]
|
return [{"port": p, "description": d, "hwid": h} for p, d, h in comports()]
|
||||||
|
|
||||||
|
|
||||||
|
def get_logicaldisks():
|
||||||
|
disks = []
|
||||||
|
if system() == "Windows":
|
||||||
|
result = exec_command(
|
||||||
|
["wmic", "logicaldisk", "get", "name,VolumeName"]).get("out")
|
||||||
|
disknamere = re.compile(r"^([A-Z]{1}\:)\s*(\S+)?")
|
||||||
|
for line in result.split("\n"):
|
||||||
|
match = disknamere.match(line.strip())
|
||||||
|
if not match:
|
||||||
|
continue
|
||||||
|
disks.append({"disk": match.group(1), "name": match.group(2)})
|
||||||
|
else:
|
||||||
|
result = exec_command(["df"]).get("out")
|
||||||
|
disknamere = re.compile(r"\d+\%\s+([a-z\d\-_/]+)$", flags=re.I)
|
||||||
|
for line in result.split("\n"):
|
||||||
|
match = disknamere.search(line.strip())
|
||||||
|
if not match:
|
||||||
|
continue
|
||||||
|
disks.append({"disk": match.group(1),
|
||||||
|
"name": basename(match.group(1))})
|
||||||
|
return disks
|
||||||
|
|
||||||
|
|
||||||
def get_api_result(path, params=None, data=None):
|
def get_api_result(path, params=None, data=None):
|
||||||
|
64
scripts/mbed_to_package.py
Normal file
64
scripts/mbed_to_package.py
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
# Copyright (C) Ivan Kravets <me@ikravets.com>
|
||||||
|
# See LICENSE for details.
|
||||||
|
|
||||||
|
from os import getcwd, mkdir, makedirs, listdir
|
||||||
|
from os.path import isfile, isdir, join
|
||||||
|
from shutil import copy2, rmtree, copytree
|
||||||
|
from sys import exit as sys_exit
|
||||||
|
from sys import path
|
||||||
|
import zipfile
|
||||||
|
|
||||||
|
|
||||||
|
MBED_DIR = "/home/valeros/mbed-master"
|
||||||
|
OUTPUT_DIR = "/home/valeros/mbed-framework"
|
||||||
|
CORE_DIR = join(OUTPUT_DIR, "core")
|
||||||
|
VARIANT_DIR = join(OUTPUT_DIR, "variant")
|
||||||
|
|
||||||
|
path.append("..")
|
||||||
|
path.append(MBED_DIR)
|
||||||
|
from workspace_tools.export import gccarm
|
||||||
|
from platformio.util import exec_command
|
||||||
|
|
||||||
|
|
||||||
|
def _unzip_generated_file(mcu):
|
||||||
|
filename = join(
|
||||||
|
MBED_DIR, "build", "export", "MBED_A1_emblocks_%s.zip" % mcu)
|
||||||
|
variant_dir = join(VARIANT_DIR, mcu)
|
||||||
|
if isfile(filename):
|
||||||
|
print "Processing board: %s" % mcu
|
||||||
|
with zipfile.ZipFile(filename) as zfile:
|
||||||
|
mkdir(variant_dir)
|
||||||
|
file_data = zfile.read("MBED_A1/MBED_A1.eix")
|
||||||
|
with open(join(variant_dir, "%s.eix" % mcu), "w") as f:
|
||||||
|
f.write(file_data)
|
||||||
|
else:
|
||||||
|
print "Warning! Skipped board: %s" % mcu
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
print "Starting..."
|
||||||
|
if isdir(OUTPUT_DIR):
|
||||||
|
rmtree(OUTPUT_DIR)
|
||||||
|
print "Delete previous framework dir"
|
||||||
|
makedirs(VARIANT_DIR)
|
||||||
|
# copy MBED library
|
||||||
|
mbedlib_dir = join(MBED_DIR, "libraries", "mbed")
|
||||||
|
for item in listdir(mbedlib_dir):
|
||||||
|
src = join(mbedlib_dir, item)
|
||||||
|
dst = join(CORE_DIR, item)
|
||||||
|
if isdir(src):
|
||||||
|
copytree(src, dst)
|
||||||
|
else:
|
||||||
|
copy2(src, dst)
|
||||||
|
# make .eix files
|
||||||
|
for mcu in set(gccarm.GccArm.TARGETS):
|
||||||
|
exec_command(
|
||||||
|
["python", join(MBED_DIR, "workspace_tools", "project.py"),
|
||||||
|
"--mcu", mcu, "-i", "emblocks", "-p", "0"], cwd=getcwd()
|
||||||
|
)
|
||||||
|
_unzip_generated_file(mcu)
|
||||||
|
print "Complete!"
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
sys_exit(main())
|
Reference in New Issue
Block a user