Initial support for MBED Framework

This commit is contained in:
Valeriy Koval
2015-03-09 12:27:54 +02:00
parent 4a8cd9914b
commit d3b9322d3b
7 changed files with 326 additions and 9 deletions

View 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

View 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

View File

@ -0,0 +1,12 @@
#include "mbed.h"
DigitalOut myled(LED1);
int main() {
while(1) {
myled = 1;
wait(1);
myled = 0;
wait(1);
}
}

View 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)

View File

@ -7,7 +7,7 @@ from time import sleep
from SCons.Script import Exit
from serial import Serial
from platformio.util import get_serialports
from platformio.util import get_logicaldisks, get_serialports
def FlushSerialBuffer(env, port):
@ -52,16 +52,28 @@ def WaitForNewSerialPort(_, before):
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():
if "VID:PID" in item['hwid']:
print "Auto-detected UPLOAD_PORT: %s" % item['port']
env.Replace(UPLOAD_PORT=item['port'])
break
if "VID:PID" not in item['hwid']:
continue
print "Auto-detected UPLOAD_PORT: %s" % item['port']
env.Replace(UPLOAD_PORT=item['port'])
break
if "UPLOAD_PORT" not in env:
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(_):

View File

@ -3,8 +3,10 @@
import json
import os
import re
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 threading import Thread
@ -173,7 +175,30 @@ def get_serialports():
from serial.tools.list_ports_posix import comports
else:
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):

View 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())