From eee6685c591ac6d8ac319baa4264d621a9b46eb6 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Wed, 4 May 2016 14:59:08 +0300 Subject: [PATCH 01/39] Update platforms liste README --- README.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.rst b/README.rst index 2350c701..6a5d4d87 100644 --- a/README.rst +++ b/README.rst @@ -161,6 +161,9 @@ It has support for the most popular embedded platforms: * `Atmel SAM `_ * `Espressif `_ * `Freescale Kinetis `_ +* `Intel ARC32 `_ +* `Lattice iCE40 `_ +* `Microchip PIC32 `_ * `Nordic nRF51 `_ * `NXP LPC `_ * `ST STM32 `_ From 3edc336f628a7ff062e6e1c05a990179fa2b808a Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Wed, 4 May 2016 15:10:08 +0300 Subject: [PATCH 02/39] Fix bug with "env_default" when "pio run -e" is used --- HISTORY.rst | 5 +++++ README.rst | 6 +++--- examples | 2 +- platformio/__init__.py | 2 +- platformio/commands/run.py | 3 ++- 5 files changed, 12 insertions(+), 6 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index ae4961ea..e0432a6d 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -4,6 +4,11 @@ Release Notes PlatformIO 2.0 -------------- +2.9.2 (2016-??-??) +~~~~~~~~~~~~~~~~~~ + +* Fixed bug with ``env_default`` when ``pio run -e`` is used + 2.9.1 (2016-04-30) ~~~~~~~~~~~~~~~~~~ diff --git a/README.rst b/README.rst index 6a5d4d87..32f07e81 100644 --- a/README.rst +++ b/README.rst @@ -62,9 +62,9 @@ IDE integration. Arduino and MBED compatible. Ready for Cloud compiling. platforms and frameworks; learn via examples; be up-to-date with the latest version. -*Atmel AVR & SAM, Espressif, Freescale Kinetis, Nordic nRF51, NXP LPC, -Silicon Labs EFM32, ST STM32, TI MSP430 & Tiva, Teensy, Arduino, mbed, -libOpenCM3, etc.* +*Atmel AVR & SAM, Espressif, Freescale Kinetis, Intel ARC32, Lattice iCE40, +Microchip PIC32, Nordic nRF51, NXP LPC, Silicon Labs EFM32, ST STM32, +TI MSP430 & Tiva, Teensy, Arduino, mbed, libOpenCM3, etc.* .. image:: https://raw.githubusercontent.com/platformio/platformio/develop/docs/_static/platformio-demo-wiring.gif :target: http://platformio.org diff --git a/examples b/examples index c06e8437..48e856c1 160000 --- a/examples +++ b/examples @@ -1 +1 @@ -Subproject commit c06e843757238811d50f5e5008c211e694308b7e +Subproject commit 48e856c1e88c0a7c384590a574c289f70f596bd6 diff --git a/platformio/__init__.py b/platformio/__init__.py index 0f6724ec..d8d22716 100644 --- a/platformio/__init__.py +++ b/platformio/__init__.py @@ -14,7 +14,7 @@ import sys -VERSION = (2, 9, 1) +VERSION = (2, 9, "2.dev0") __version__ = ".".join([str(s) for s in VERSION]) __title__ = "platformio" diff --git a/platformio/commands/run.py b/platformio/commands/run.py index c0739dc5..46541e57 100644 --- a/platformio/commands/run.py +++ b/platformio/commands/run.py @@ -81,7 +81,8 @@ def cli(ctx, environment, target, upload_port, # pylint: disable=R0913,R0914 envname = section[4:] if ((environment and envname not in environment) or - (env_default and envname not in env_default)): + (not environment and env_default and + envname not in env_default)): # echo("Skipped %s environment" % style(envname, fg="yellow")) continue From b587927687e4ac3562f0f89877bf04f088efa121 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Wed, 4 May 2016 15:11:15 +0300 Subject: [PATCH 03/39] Sync examples --- examples | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples b/examples index 48e856c1..a5498135 160000 --- a/examples +++ b/examples @@ -1 +1 @@ -Subproject commit 48e856c1e88c0a7c384590a574c289f70f596bd6 +Subproject commit a5498135baca2dd71e518406ee5cf19ac4be058b From aca646e6b9af078c4362ce5f99686e06fc1280ba Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Wed, 4 May 2016 15:50:00 +0300 Subject: [PATCH 04/39] Use HTTP mirror for Package Manager in case with SSL errors // Resolve #645 --- HISTORY.rst | 2 ++ platformio/pkgmanager.py | 1 + 2 files changed, 3 insertions(+) diff --git a/HISTORY.rst b/HISTORY.rst index e0432a6d..394c941a 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -7,6 +7,8 @@ PlatformIO 2.0 2.9.2 (2016-??-??) ~~~~~~~~~~~~~~~~~~ +* Use HTTP mirror for Package Manager in case with SSL errors + (`issue #645 `_) * Fixed bug with ``env_default`` when ``pio run -e`` is used 2.9.1 (2016-04-30) diff --git a/platformio/pkgmanager.py b/platformio/pkgmanager.py index 0c7bdce7..33f74bb7 100644 --- a/platformio/pkgmanager.py +++ b/platformio/pkgmanager.py @@ -102,6 +102,7 @@ class PackageManager(object): dlpath = self.download(info['url'], pkg_dir, info['sha1']) except (requests.exceptions.ConnectionError, requests.exceptions.ChunkedEncodingError, + requests.exceptions.SSLError, exception.FDUnrecognizedStatusCode, StopIteration): if not info['url'].startswith("http://dl.platformio.org"): dlpath = self.download( From 3c46c17242e88699f2d27d276f02b35f859ac4d0 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Wed, 4 May 2016 15:51:45 +0300 Subject: [PATCH 05/39] Typo fix --- HISTORY.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HISTORY.rst b/HISTORY.rst index 394c941a..ab3a3500 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -7,7 +7,7 @@ PlatformIO 2.0 2.9.2 (2016-??-??) ~~~~~~~~~~~~~~~~~~ -* Use HTTP mirror for Package Manager in case with SSL errors +* Use HTTP mirror for Package Manager in a case with SSL errors (`issue #645 `_) * Fixed bug with ``env_default`` when ``pio run -e`` is used From 304c8b7184abc4d5acd4cf0a154945eb1fe3ea88 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Fri, 6 May 2016 15:18:48 +0300 Subject: [PATCH 06/39] Add support for MightyCore ATmega8535 board // Issue #585 --- HISTORY.rst | 2 ++ platformio/boards/microchippic32.json | 6 +++--- platformio/boards/mightycore.json | 24 +++++++++++++++++++++++- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index ab3a3500..e024d821 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -7,6 +7,8 @@ PlatformIO 2.0 2.9.2 (2016-??-??) ~~~~~~~~~~~~~~~~~~ +* Added support for MightyCore ATmega8535 board + (`issue #585 `_) * Use HTTP mirror for Package Manager in a case with SSL errors (`issue #645 `_) * Fixed bug with ``env_default`` when ``pio run -e`` is used diff --git a/platformio/boards/microchippic32.json b/platformio/boards/microchippic32.json index a118c8e0..b5a949be 100644 --- a/platformio/boards/microchippic32.json +++ b/platformio/boards/microchippic32.json @@ -561,7 +561,7 @@ "variant": "OpenBCI" }, "frameworks": ["arduino"], - "name": "Digilent OpenScope", + "name": "OpenBCI 32bit", "platform": "microchippic32", "upload": { "maximum_ram_size": 32768, @@ -571,7 +571,7 @@ "speed": 115200, "wait_for_upload_port": true }, - "url": "http://store.digilentinc.com/", - "vendor": "Digilent" + "url": "http://shop.openbci.com/", + "vendor": "OpenBCI" } } diff --git a/platformio/boards/mightycore.json b/platformio/boards/mightycore.json index 88730431..7ee7913f 100644 --- a/platformio/boards/mightycore.json +++ b/platformio/boards/mightycore.json @@ -129,5 +129,27 @@ }, "url": "https://www.tindie.com/products/MCUdude/dip-40-arduino-compatible-development-board", "vendor": "Mcudude" + }, + + "mightycore8535": { + "build": { + "core": "MightyCore", + "extra_flags": "-DARDUINO_ARCH_AVR -DARDUINO_AVR_ATmega8535", + "f_cpu": "16000000L", + "mcu": "atmega16", + "variant": "mightycore" + }, + "frameworks": ["arduino"], + "name": "MightyCore ATmega8535", + "platform": "atmelavr", + "upload": { + "maximum_ram_size": 512, + "maximum_size": 7680, + "protocol": "arduino", + "require_upload_port" : true, + "speed": 115200 + }, + "url": "https://www.tindie.com/products/MCUdude/dip-40-arduino-compatible-development-board", + "vendor": "Mcudude" } -} \ No newline at end of file +} From 75ca6c6e52b9c5b93a647163a3102be9d029d99c Mon Sep 17 00:00:00 2001 From: Valeriy Koval Date: Fri, 6 May 2016 15:26:56 +0300 Subject: [PATCH 07/39] Add several new mbed boards --- platformio/boards/siliconlabsefm32.json | 17 +++++++++++++++++ platformio/boards/ststm32.json | 16 ++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/platformio/boards/siliconlabsefm32.json b/platformio/boards/siliconlabsefm32.json index dfa58584..e4d55f18 100644 --- a/platformio/boards/siliconlabsefm32.json +++ b/platformio/boards/siliconlabsefm32.json @@ -82,5 +82,22 @@ }, "url": "https://developer.mbed.org/platforms/EFM32-Happy-Gecko/", "vendor": "Silicon Labs" + }, + + "efm32pg_stk3401": { + "build": { + "f_cpu": "40000000L", + "cpu": "cortex-m4", + "mcu": "efm32pg1b200f256" + }, + "frameworks": ["mbed"], + "name": "Silicon Labs SLSTK3401A (Pearl Gecko)", + "platform": "siliconlabsefm32", + "upload": { + "maximum_ram_size": 32768, + "maximum_size": 262144 + }, + "url": "https://developer.mbed.org/platforms/EFM32-Pearl-Gecko/", + "vendor": "Silicon Labs" } } diff --git a/platformio/boards/ststm32.json b/platformio/boards/ststm32.json index 18633fab..187d811f 100644 --- a/platformio/boards/ststm32.json +++ b/platformio/boards/ststm32.json @@ -605,5 +605,21 @@ }, "url": "https://developer.mbed.org/platforms/ST-B96B-F446VE/", "vendor": "96Boards" + }, + "mts_mdot_f411re": { + "build": { + "f_cpu": "100000000L", + "cpu": "cortex-m4", + "mcu": "stm32f411ret6" + }, + "frameworks": ["mbed"], + "name": "MultiTech mDot F411", + "platform": "ststm32", + "upload": { + "maximum_ram_size": 131072, + "maximum_size": 524288 + }, + "url": "https://developer.mbed.org/platforms/MTS-mDot-F411/", + "vendor": "MultiTech" } } From d89b2828e36fd02ed99cde71d75a6f792d877fdb Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Fri, 6 May 2016 18:22:09 +0300 Subject: [PATCH 08/39] Add "Keep build panel visible" to PlatformIO IDE FAQ --- HISTORY.rst | 2 ++ docs/ide/atom.rst | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/HISTORY.rst b/HISTORY.rst index e024d821..44fe50ea 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -7,6 +7,8 @@ PlatformIO 2.0 2.9.2 (2016-??-??) ~~~~~~~~~~~~~~~~~~ +* Added support for Silicon Labs SLSTK3401A (Pearl Gecko) and + MultiTech mDot F411 ARM mbed based boards * Added support for MightyCore ATmega8535 board (`issue #585 `_) * Use HTTP mirror for Package Manager in a case with SSL errors diff --git a/docs/ide/atom.rst b/docs/ide/atom.rst index 61d515ea..a0d33f3f 100644 --- a/docs/ide/atom.rst +++ b/docs/ide/atom.rst @@ -437,6 +437,14 @@ To force Smart Code Linter to use Arduino files as C++ please Frequently Asked Questions -------------------------- +Keep build panel visible +~~~~~~~~~~~~~~~~~~~~~~~~ + +PlatformIO IDE hides build panel on success by default. Nevertheless, you can +keep it visible all time. Please follow to +``Menu: PlatformIO > Settings > Build`` and set ``Panel Visibility`` to +``Keep Visible``. + Automatically save on build ~~~~~~~~~~~~~~~~~~~~~~~~~~~ From d881dfb63ca37002eaa9406267236cf28cb698bc Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Fri, 6 May 2016 19:52:27 +0300 Subject: [PATCH 09/39] Typo fix --- docs/quickstart.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/quickstart.rst b/docs/quickstart.rst index f70bbe63..def834dd 100644 --- a/docs/quickstart.rst +++ b/docs/quickstart.rst @@ -15,7 +15,7 @@ Quick Start =========== .. note:: - If you are looking for a Qucik Start for PlatformIO IDE please follow to + If you are looking for a Quick Start for PlatformIO IDE please follow to :ref:`PlatformIO IDE Quick Start ` page. This tutorial introduces you to the basics of PlatformIO Command Line Interface From 69effbfedb3650666158797943c09c2acf7af2aa Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Sat, 7 May 2016 00:16:39 +0300 Subject: [PATCH 10/39] Add new articles; Link to the Virtual IoT Meetup --- docs/_static/ide-eclipse-virtualiot.jpg | Bin 0 -> 143781 bytes docs/articles.rst | 3 +++ docs/ide/atom.rst | 1 + docs/ide/eclipse.rst | 9 +++++++++ 4 files changed, 13 insertions(+) create mode 100644 docs/_static/ide-eclipse-virtualiot.jpg diff --git a/docs/_static/ide-eclipse-virtualiot.jpg b/docs/_static/ide-eclipse-virtualiot.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1c6ee0fa4b6e119aec5e3eb13a57aeef181e04fb GIT binary patch literal 143781 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%0D=~K72xb`GwNkM=1fzwj6f@`xr90|9n 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 z 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 S?2)|_+0y0bbC2Ee|4je^e|9ba literal 0 HcmV?d00001 diff --git a/docs/articles.rst b/docs/articles.rst index 26b4cd40..62256daa 100644 --- a/docs/articles.rst +++ b/docs/articles.rst @@ -23,10 +23,13 @@ Here are recent articles about PlatformIO: 2016 ^^^^ +* May 05, 2016 - **Ivan Kravets, Ph.D. / Eclipse Virtual IoT Meetup** - `PlatformIO: a cross-platform IoT solution to build them all! `_ * Apr 23, 2016 - **Al Williams** - `Hackaday: Atomic Arduino (and Other) Development `_ * Apr 16, 2016 - **Sathittham Sangthong** - `[PlatformIO] มาลองเล่น PlatformIO แทน Arduino IDE กัน (Let's play together with PlatformIO IDE [alternative to Arduino IDE], Thai) `_ +* Apr 15, 2016 - **Daniel Eichhorn** - `ESP8266: Offline Debugging with the Platformio Environment `_ * Apr 11, 2016 - **Matjaz Trcek** - `Top 5 Arduino integrated development environments `_ * Apr 06, 2016 - **Aleks** - `PlatformIO ausprobiert (Tried PlatformIO, German) `_ +* Apr 02, 2016 - **Diego Pinto** - `Você tem coragem de abandonar a IDE do Arduino? PlatformIO + Atom (Do you dare to leave the Arduino IDE? PlatformIO + Atom, Portuguese) `_ * Mar 30, 2016 - **Brandon Cannaday** - `Getting Started with PlatformIO and ESP8266 NodeMcu `_ * Mar 29, 2016 - **Pablo Peñalve** - `PlatformIO + Geany + Raspberry PI, Spanish `_ * Mar 24, 2016 - **NAzT** - `PlatformIO และการปรับแต่ง เพื่อใช้สำหรับพัฒนา Arduino Library (PlatformIO and advanced development for Arduino Library, Thai) `_ diff --git a/docs/ide/atom.rst b/docs/ide/atom.rst index a0d33f3f..9e2103c9 100644 --- a/docs/ide/atom.rst +++ b/docs/ide/atom.rst @@ -470,6 +470,7 @@ Articles / Manuals * Apr 16, 2016 - **Sathittham Sangthong** - `[PlatformIO] มาลองเล่น PlatformIO แทน Arduino IDE กัน (Let's play together with PlatformIO IDE [alternative to Arduino IDE], Thai) `_ * Apr 11, 2016 - **Matjaz Trcek** - `Top 5 Arduino integrated development environments `_ * Apr 06, 2016 - **Aleks** - `PlatformIO ausprobiert (Tried PlatformIO, German) `_ +* Apr 02, 2016 - **Diego Pinto** - `Você tem coragem de abandonar a IDE do Arduino? PlatformIO + Atom (Do you dare to leave the Arduino IDE? PlatformIO + Atom, Portuguese) `_ * Mar 30, 2016 - **Brandon Cannaday** - `Getting Started with PlatformIO and ESP8266 NodeMcu `_ * Mar 12, 2016 - **Peter Marks** - `PlatformIO, the Arduino IDE for programmers `_ * Mar 05, 2016 - **brichacek.net** - `PlatformIO – otevřený ekosystém pro vývoj IoT (PlatformIO – an open source ecosystem for IoT development, Czech) `_ diff --git a/docs/ide/eclipse.rst b/docs/ide/eclipse.rst index 7a775272..230de1f9 100644 --- a/docs/ide/eclipse.rst +++ b/docs/ide/eclipse.rst @@ -71,9 +71,18 @@ If you have some problems with unresolved includes, defines, etc., then after generating process wont be reflected in IDE. To fix it you need to reinitialize project using :ref:`cmd_init` (repeat it). +Live Integration +---------------- + +Eclipse Virtual IoT Meetup: `PlatformIO: a cross-platform IoT solution to build them all! `_ + +.. image:: ../_static/ide-eclipse-virtualiot.jpg + :target: https://www.youtube.com/watch?v=6t7UbX812Yw + Articles / Manuals ------------------ +* May 05, 2016 - **Ivan Kravets, Ph.D. / Eclipse Virtual IoT Meetup** - `PlatformIO: a cross-platform IoT solution to build them all! `_ * Sep 01, 2015 - **Thomas P. Weldon, Ph.D.** - `Improvised MBED FRDM-K64F Eclipse/PlatformIO Setup and Software Installation `_ * Jul 11, 2015 - **TrojanC** - `Learning Arduino GitHub Repository `_ * June 20, 2014 - **Ivan Kravets, Ph.D.** - `Building and debugging Atmel AVR (Arduino-based) project using Eclipse IDE+PlatformIO `_ From 056cc08d6803cc2abeda04c49848fdb79d0ad270 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Tue, 10 May 2016 15:36:00 +0300 Subject: [PATCH 11/39] Fix issue with ``src_filter`` option for Windows OS // Resolve #652 --- HISTORY.rst | 2 ++ platformio/builder/main.py | 7 +++++ platformio/commands/run.py | 10 +++---- platformio/platforms/base.py | 54 +++++++++++++++++------------------- 4 files changed, 39 insertions(+), 34 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index 44fe50ea..8f8afef1 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -14,6 +14,8 @@ PlatformIO 2.0 * Use HTTP mirror for Package Manager in a case with SSL errors (`issue #645 `_) * Fixed bug with ``env_default`` when ``pio run -e`` is used +* Fixed issue with ``src_filter`` option for Windows OS + (`issue #652 `_) 2.9.1 (2016-04-30) ~~~~~~~~~~~~~~~~~~ diff --git a/platformio/builder/main.py b/platformio/builder/main.py index 69f9e53c..8b01c7b2 100644 --- a/platformio/builder/main.py +++ b/platformio/builder/main.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import base64 import json import sys from os import environ @@ -99,6 +100,12 @@ DefaultEnvironment( ) env = DefaultEnvironment() + +# decode common variables +for k in commonvars.keys(): + if k in env: + env[k] = base64.b64decode(env[k]) + env.Prepend(LIBPATH=[join("$PIOPACKAGES_DIR", "ldscripts")]) if "BOARD" in env: diff --git a/platformio/commands/run.py b/platformio/commands/run.py index 46541e57..0834edf0 100644 --- a/platformio/commands/run.py +++ b/platformio/commands/run.py @@ -164,14 +164,14 @@ class EnvironmentProcessor(object): return result def _get_build_variables(self): - variables = ["PIOENV=" + self.name] + variables = {"pioenv": self.name} if self.upload_port: - variables.append("UPLOAD_PORT=%s" % self.upload_port) + variables['upload_port'] = self.upload_port for k, v in self.options.items(): - k = k.upper() - if k == "TARGETS" or (k == "UPLOAD_PORT" and self.upload_port): + k = k.lower() + if k == "targets" or (k == "upload_port" and self.upload_port): continue - variables.append("%s=%s" % (k, v)) + variables[k] = v return variables def _get_build_targets(self): diff --git a/platformio/platforms/base.py b/platformio/platforms/base.py index b5e311a9..8486967d 100644 --- a/platformio/platforms/base.py +++ b/platformio/platforms/base.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import base64 import os import re import sys @@ -400,10 +401,10 @@ class BasePlatform(object): obsolated = pm.get_outdated() return not set(self.get_packages().keys()).isdisjoint(set(obsolated)) - def configure_default_packages(self, envoptions, targets): + def configure_default_packages(self, variables, targets): # enbale used frameworks for pkg_name in self.pkg_aliases_to_names(["framework"]): - for framework in envoptions.get("framework", "").split(","): + for framework in variables.get("framework", "").split(","): framework = framework.lower().strip() if not framework: continue @@ -441,15 +442,10 @@ class BasePlatform(object): raise exception.PlatformNotInstalledYet(self.get_type()) def run(self, variables, targets, verbose): - assert isinstance(variables, list) + assert isinstance(variables, dict) assert isinstance(targets, list) - envoptions = {} - for v in variables: - _name, _value = v.split("=", 1) - envoptions[_name.lower()] = _value - - self.configure_default_packages(envoptions, targets) + self.configure_default_packages(variables, targets) self._install_default_packages() self._verbose_level = int(verbose) @@ -458,23 +454,17 @@ class BasePlatform(object): targets.remove("clean") targets.append("-c") - if "build_script" not in envoptions: - variables.append("BUILD_SCRIPT=%s" % self.get_build_script()) - - for v in variables: - if not v.startswith("BUILD_SCRIPT="): - continue - _, path = v.split("=", 1) - if not isfile(path): - raise exception.BuildScriptNotFound(path) + if "build_script" not in variables: + variables['build_script'] = self.get_build_script() + if not isfile(variables['build_script']): + raise exception.BuildScriptNotFound(variables['build_script']) # append aliases of the installed packages installed_packages = PackageManager.get_installed() for name, options in self.get_packages().items(): if "alias" not in options or name not in installed_packages: continue - variables.append( - "PIOPACKAGE_%s=%s" % (options['alias'].upper(), name)) + variables['piopackage_%s' % options['alias']] = name self._found_error = False result = self._run_scons(variables, targets) @@ -498,16 +488,22 @@ class BasePlatform(object): _PYTHONPATH.append(p) os.environ['PYTHONPATH'] = os.pathsep.join(_PYTHONPATH) + cmd = [ + os.path.normpath(sys.executable), + join(util.get_home_dir(), "packages", "tool-scons", + "script", "scons"), + "-Q", + "-j %d" % self.get_job_nums(), + "--warn=no-no-parallel-support", + "-f", join(util.get_source_dir(), "builder", "main.py") + ] + targets + + # encode and append variables + for key, value in variables.items(): + cmd.append("%s=%s" % (key.upper(), base64.b64encode(value))) + result = util.exec_command( - [ - os.path.normpath(sys.executable), - join(util.get_home_dir(), "packages", "tool-scons", - "script", "scons"), - "-Q", - "-j %d" % self.get_job_nums(), - "--warn=no-no-parallel-support", - "-f", join(util.get_source_dir(), "builder", "main.py") - ] + variables + targets, + cmd, stdout=util.AsyncPipe(self.on_run_out), stderr=util.AsyncPipe(self.on_run_err) ) From 9cbe12fbb86007b8379030481b3fed99c691d71b Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Thu, 12 May 2016 19:51:04 +0300 Subject: [PATCH 12/39] New article by Pedro Minatel --- docs/ide/atom.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/ide/atom.rst b/docs/ide/atom.rst index 9e2103c9..f11e3562 100644 --- a/docs/ide/atom.rst +++ b/docs/ide/atom.rst @@ -466,6 +466,7 @@ package and `C/C++ Uncrustify Code Beautifier `_ * Apr 23, 2016 - **Al Williams** - `Hackaday: Atomic Arduino (and Other) Development `_ * Apr 16, 2016 - **Sathittham Sangthong** - `[PlatformIO] มาลองเล่น PlatformIO แทน Arduino IDE กัน (Let's play together with PlatformIO IDE [alternative to Arduino IDE], Thai) `_ * Apr 11, 2016 - **Matjaz Trcek** - `Top 5 Arduino integrated development environments `_ From ab3a5331c10f9c09cf1ee4d73a89a344c150029a Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Thu, 12 May 2016 19:51:22 +0300 Subject: [PATCH 13/39] New article by Pedro Minatel --- docs/articles.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/articles.rst b/docs/articles.rst index 62256daa..a4244ac0 100644 --- a/docs/articles.rst +++ b/docs/articles.rst @@ -24,6 +24,7 @@ Here are recent articles about PlatformIO: ^^^^ * May 05, 2016 - **Ivan Kravets, Ph.D. / Eclipse Virtual IoT Meetup** - `PlatformIO: a cross-platform IoT solution to build them all! `_ +* May 01, 2016 - **Pedro Minatel** - `PlatformIO – Uma alternativa ao Arduino IDE (PlatformIO - An alternative to the Arduino IDE, Portuguese) `_ * Apr 23, 2016 - **Al Williams** - `Hackaday: Atomic Arduino (and Other) Development `_ * Apr 16, 2016 - **Sathittham Sangthong** - `[PlatformIO] มาลองเล่น PlatformIO แทน Arduino IDE กัน (Let's play together with PlatformIO IDE [alternative to Arduino IDE], Thai) `_ * Apr 15, 2016 - **Daniel Eichhorn** - `ESP8266: Offline Debugging with the Platformio Environment `_ From b3d27b42ad157dc1199eff5ff22d333be903d4f4 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Wed, 18 May 2016 15:46:59 +0300 Subject: [PATCH 14/39] Add key-binding for Toggle Build Panel --- docs/ide/atom.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/ide/atom.rst b/docs/ide/atom.rst index f11e3562..1f7e5e59 100644 --- a/docs/ide/atom.rst +++ b/docs/ide/atom.rst @@ -445,6 +445,11 @@ keep it visible all time. Please follow to ``Menu: PlatformIO > Settings > Build`` and set ``Panel Visibility`` to ``Keep Visible``. +Key-bindings (toggle panel): + +* ``cmd+alt+v`` - Mac OS X +* ``ctrl+alt+v`` - Windows/Linux + Automatically save on build ~~~~~~~~~~~~~~~~~~~~~~~~~~~ From cd22f5197bcaa319242ad3de36ea50c5ee267132 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Tue, 24 May 2016 19:20:12 +0300 Subject: [PATCH 15/39] Specify supported types of library repository --- docs/librarymanager/config.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/librarymanager/config.rst b/docs/librarymanager/config.rst index 1784a99b..c56d74ed 100644 --- a/docs/librarymanager/config.rst +++ b/docs/librarymanager/config.rst @@ -141,7 +141,7 @@ Examples: The repository in which the source code can be found. The field consists for the next items: -* ``type`` +* ``type`` the only "git", "hg" or "svn" are supported * ``url`` * ``branch`` if is not specified, default branch will be used. This field will be ignored if tag/release exists with the value of :ref:`libjson_version`. From 1a305f2dd7000e856eaba31d55c70c49ffd66c4c Mon Sep 17 00:00:00 2001 From: Valeriy Koval Date: Wed, 25 May 2016 11:29:26 +0300 Subject: [PATCH 16/39] Add stlink as the default uploader for disco boards // Issue #665 --- platformio/boards/ststm32.json | 36 ++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/platformio/boards/ststm32.json b/platformio/boards/ststm32.json index 187d811f..46037168 100644 --- a/platformio/boards/ststm32.json +++ b/platformio/boards/ststm32.json @@ -14,7 +14,8 @@ "platform": "ststm32", "upload": { "maximum_ram_size": 131072, - "maximum_size": 1048576 + "maximum_size": 1048576, + "protocol": "stlink" }, "url": "http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/LN1848/PF252419", "vendor": "ST" @@ -34,7 +35,8 @@ "platform": "ststm32", "upload": { "maximum_ram_size": 16384, - "maximum_size": 131072 + "maximum_size": 131072, + "protocol": "stlink" }, "url": "http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/LN1848/PF258515", "vendor": "ST" @@ -54,7 +56,8 @@ "platform": "ststm32", "upload": { "maximum_ram_size": 49152, - "maximum_size": 262144 + "maximum_size": 262144, + "protocol": "stlink" }, "url": "http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/LN1848/PF254044", "vendor": "ST" @@ -70,7 +73,8 @@ "platform": "ststm32", "upload": { "maximum_ram_size": 8192, - "maximum_size": 131072 + "maximum_size": 131072, + "protocol": "stlink" }, "url": "http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/LN1848/PF250863", "vendor": "ST" @@ -86,7 +90,8 @@ "platform": "ststm32", "upload": { "maximum_ram_size": 8192, - "maximum_size": 65536 + "maximum_size": 65536, + "protocol": "stlink" }, "url": "http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/LN1848/PF253215", "vendor": "ST" @@ -102,7 +107,8 @@ "platform": "ststm32", "upload": { "maximum_ram_size": 16384, - "maximum_size": 65536 + "maximum_size": 65536, + "protocol": "stlink" }, "url": "http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/LN1848/PF260318", "vendor": "ST" @@ -118,7 +124,8 @@ "platform": "ststm32", "upload": { "maximum_ram_size": 65536, - "maximum_size": 262144 + "maximum_size": 262144, + "protocol": "stlink" }, "url": "http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/LN1848/PF259098", "vendor": "ST" @@ -134,7 +141,8 @@ "platform": "ststm32", "upload": { "maximum_ram_size": 262144, - "maximum_size": 2097152 + "maximum_size": 2097152, + "protocol": "stlink" }, "url": "http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/LN1848/PF259090", "vendor": "ST" @@ -425,7 +433,8 @@ "platform": "ststm32", "upload": { "maximum_ram_size": 8192, - "maximum_size": 65536 + "maximum_size": 65536, + "protocol": "stlink" }, "url": "http://www.st.com/web/en/catalog/tools/PF260319", "vendor": "ST" @@ -441,7 +450,8 @@ "platform": "ststm32", "upload": { "maximum_ram_size": 12288, - "maximum_size": 65536 + "maximum_size": 65536, + "protocol": "stlink" }, "url": "http://www.st.com/web/en/catalog/tools/PF260318", "vendor": "ST" @@ -457,7 +467,8 @@ "platform": "ststm32", "upload": { "maximum_ram_size": 393216, - "maximum_size": 1048576 + "maximum_size": 1048576, + "protocol": "stlink" }, "url": "http://www.st.com/web/catalog/tools/FM116/CL1620/SC959/SS1532/LN1848/PF262395", "vendor": "ST" @@ -473,7 +484,8 @@ "platform": "ststm32", "upload": { "maximum_ram_size": 131072, - "maximum_size": 1048576 + "maximum_size": 1048576, + "protocol": "stlink" }, "url": "http://www.st.com/web/catalog/tools/FM116/CL1620/SC959/SS1532/LN1848/PF261635", "vendor": "ST" From 0cb28f906ebad61c2c659f4691254f08ba45388d Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Sat, 28 May 2016 19:09:24 +0300 Subject: [PATCH 17/39] Fix broken links to project examples --- HISTORY.rst | 2 +- README.rst | 2 +- docs/demo.rst | 2 +- docs/index.rst | 2 +- docs/projectconf.rst | 2 +- docs/quickstart.rst | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index 8f8afef1..85f3c813 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -659,7 +659,7 @@ PlatformIO 1.0 (`issue #183 `_) * Added GDB as alternative uploader to `ststm32 `__ platform (`issue #175 `_) -* Added `examples `__ +* Added `examples `__ with preconfigured IDE projects (`issue #154 `_) * Fixed firmware uploading under Linux OS for Arduino Leonardo board diff --git a/README.rst b/README.rst index 32f07e81..d516a1b0 100644 --- a/README.rst +++ b/README.rst @@ -29,7 +29,7 @@ PlatformIO `Home `_ | `IDE `_ | -`Project Examples `_ | +`Project Examples `_ | `Docs `_ | `Twitter `_ | `Facebook `_ | diff --git a/docs/demo.rst b/docs/demo.rst index e53a31fa..7d1d2c25 100644 --- a/docs/demo.rst +++ b/docs/demo.rst @@ -19,7 +19,7 @@ Demo & Projects Project Examples ---------------- -Preconfigured demo projects are located in `PlatformIO GitHub `_ repository. +Preconfigured demo projects are located in `PlatformIO GitHub `_ repository. "Blink Project" --------------- diff --git a/docs/index.rst b/docs/index.rst index b2f1fcca..be6c83e8 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -39,7 +39,7 @@ libOpenCM3, etc.* * :ref:`ide_atom` * `Web 2.0 Library Search `_ | `Embedded Boards Explorer `_ -* `Project Examples `_ +* `Project Examples `_ * `Source Code `_ | `Issues `_ * `Blog `_ | diff --git a/docs/projectconf.rst b/docs/projectconf.rst index 0af9c5f5..6ca71ca4 100644 --- a/docs/projectconf.rst +++ b/docs/projectconf.rst @@ -610,7 +610,7 @@ Examples .. note:: A full list with project examples can be found in - `PlatformIO Repository `_. + `PlatformIO Repository `_. 1. :ref:`platform_atmelavr`: Arduino UNO board with auto pre-configured ``board_*`` and ``upload_*`` options (use only ``board`` option) and Arduino diff --git a/docs/quickstart.rst b/docs/quickstart.rst index def834dd..77877d28 100644 --- a/docs/quickstart.rst +++ b/docs/quickstart.rst @@ -256,5 +256,5 @@ Arduino Uno: Further Reading --------------- -* `Project examples `_ +* `Project examples `_ * :ref:`userguide` for PlatformIO CLI commands From 6ecd86a244305bb040d17effa09265e2649ab550 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Sat, 28 May 2016 20:22:15 +0300 Subject: [PATCH 18/39] Simplified documentation for Continuous integration with AppVeyor // Resolve #671 --- HISTORY.rst | 2 + README.rst | 5 +- appveyor.yml | 27 +--- docs/ci/appveyor.rst | 172 ++++--------------------- scripts/appveyor/install.ps1 | 82 ------------ scripts/appveyor/run_with_compiler.cmd | 48 ------- 6 files changed, 32 insertions(+), 304 deletions(-) delete mode 100644 scripts/appveyor/install.ps1 delete mode 100644 scripts/appveyor/run_with_compiler.cmd diff --git a/HISTORY.rst b/HISTORY.rst index 85f3c813..fd61dbeb 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -7,6 +7,8 @@ PlatformIO 2.0 2.9.2 (2016-??-??) ~~~~~~~~~~~~~~~~~~ +* Simplified documentation for `Continuous Integration with AppVeyor `__ + (`issue #671 `_) * Added support for Silicon Labs SLSTK3401A (Pearl Gecko) and MultiTech mDot F411 ARM mbed based boards * Added support for MightyCore ATmega8535 board diff --git a/README.rst b/README.rst index d516a1b0..7976f9ac 100644 --- a/README.rst +++ b/README.rst @@ -16,11 +16,8 @@ PlatformIO .. image:: https://img.shields.io/pypi/l/platformio.svg :target: https://pypi.python.org/pypi/platformio/ :alt: License -.. image:: https://img.shields.io/pypi/dm/platformio.svg - :target: https://pypi.python.org/pypi/platformio/ - :alt: PyPi Downloads .. image:: https://img.shields.io/community/PlatformIO.png - :alt: Join the chat at https://gitter.im/platformio/platformio + :alt: Community Forums :target: https://community.platformio.org .. image:: https://img.shields.io/donate/PlatformIO.png?color=yellow :alt: Donate for PlatformIO.Org diff --git a/appveyor.yml b/appveyor.yml index cd09e534..0d091e31 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,27 +1,12 @@ build: off environment: - global: - WITH_COMPILER: "cmd /E:ON /V:ON /C .\\scripts\\appveyor\\run_with_compiler.cmd" + matrix: - TOXENV: "py27" - TOXPYTHON: "C:\\Python27-x64\\python.exe" - WINDOWS_SDK_VERSION: "v7.0" - PYTHON_HOME: "C:\\Python27-x64" - PYTHON_VERSION: "2.7" - PYTHON_ARCH: "64" - -init: - - "ECHO %TOXENV%" - - ps: "ls C:\\Python*" - + install: - - "git submodule update --init --recursive" - - "powershell scripts\\appveyor\\install.ps1" - -before_test: - - cmd: SET PATH=%PATH%;C:\MinGW\bin - + - cmd: git submodule update --init --recursive + - cmd: SET PATH=%PATH%;C:\Python27\Scripts + test_script: - - "%PYTHON_HOME%\\Scripts\\tox --version" - - "%PYTHON_HOME%\\Scripts\\pip --version" - - "%WITH_COMPILER% %PYTHON_HOME%\\Scripts\\tox" + - cmd: tox diff --git a/docs/ci/appveyor.rst b/docs/ci/appveyor.rst index b79c690f..2fc919dd 100644 --- a/docs/ci/appveyor.rst +++ b/docs/ci/appveyor.rst @@ -44,142 +44,20 @@ Put ``appveyor.yml`` to the root directory of the GitHub repository. build: off environment: - global: - WITH_COMPILER: "cmd /E:ON /V:ON /C .\\scripts\\appveyor\\run_with_compiler.cmd" - matrix: - - PLATFORMIO_CI_SRC: "path\\to\\source\\file.c" - PLATFORMIO_CI_SRC: "path\\to\\source\\file.ino" - PLATFORMIO_CI_SRC: "path\\to\\source\\directory" - WINDOWS_SDK_VERSION: "v7.0" - PYTHON_HOME: "C:\\Python27-x64" - PYTHON_VERSION: "2.7" - PYTHON_ARCH: "64" - install: - - "git submodule update --init --recursive" - - "powershell scripts\\appveyor\\install.ps1" - before_test: - - cmd: SET PATH=%PATH%;%PYTHON_HOME%;%PYTHON_HOME%\Scripts - test_script: - - '%WITH_COMPILER% %PYTHON_HOME%\\Scripts\\platformio ci --board=TYPE_1 --board=TYPE_2 --board=TYPE_N' + matrix: + - PLATFORMIO_CI_SRC: "path\\to\\source\\file.c" + - PLATFORMIO_CI_SRC: "path\\to\\source\\file.ino" + - PLATFORMIO_CI_SRC: "path\\to\\source\\directory" -Then create ``scripts/appveyor`` folder and put these 2 scripts (they are the -same for the all projects, don't need to modify them): + install: + - cmd: git submodule update --init --recursive + - cmd: SET PATH=%PATH%;C:\Python27\Scripts + - cmd: pip install -U platformio -1. ``scripts/appveyor/install.ps1``: + test_script: + - cmd: platformio ci --board=TYPE_1 --board=TYPE_2 --board=TYPE_N -.. code-block:: PowerShell - - $BASE_URL = "https://www.python.org/ftp/python/" - $GET_PIP_URL = "https://bootstrap.pypa.io/get-pip.py" - $GET_PIP_PATH = "C:\get-pip.py" - - - function DownloadPython ($python_version, $platform_suffix) { - $webclient = New-Object System.Net.WebClient - $filename = "python-" + $python_version + $platform_suffix + ".msi" - $url = $BASE_URL + $python_version + "/" + $filename - - $basedir = $pwd.Path + "\" - $filepath = $basedir + $filename - if (Test-Path $filename) { - Write-Host "Reusing" $filepath - return $filepath - } - - # Download and retry up to 5 times in case of network transient errors. - Write-Host "Downloading" $filename "from" $url - $retry_attempts = 3 - for($i=0; $i -lt $retry_attempts; $i++){ - try { - $webclient.DownloadFile($url, $filepath) - break - } - Catch [Exception]{ - Start-Sleep 1 - } - } - Write-Host "File saved at" $filepath - return $filepath - } - - - function InstallPython ($python_version, $architecture, $python_home) { - Write-Host "Installing Python" $python_version "for" $architecture "bit architecture to" $python_home - if (Test-Path $python_home) { - Write-Host $python_home "already exists, skipping." - return $false - } - if ($architecture -eq "32") { - $platform_suffix = "" - } else { - $platform_suffix = ".amd64" - } - $filepath = DownloadPython $python_version $platform_suffix - Write-Host "Installing" $filepath "to" $python_home - $args = "/qn /i $filepath TARGETDIR=$python_home" - Write-Host "msiexec.exe" $args - Start-Process -FilePath "msiexec.exe" -ArgumentList $args -Wait -Passthru - Write-Host "Python $python_version ($architecture) installation complete" - return $true - } - - - function InstallPip ($python_home) { - $python_path = $python_home + "/python.exe" - Write-Host "Installing pip..." - $webclient = New-Object System.Net.WebClient - $webclient.DownloadFile($GET_PIP_URL, $GET_PIP_PATH) - Write-Host "Executing:" $python_path $GET_PIP_PATH - Start-Process -FilePath "$python_path" -ArgumentList "$GET_PIP_PATH" -Wait -Passthru - } - - function InstallPackage ($python_home, $pkg) { - $pip_path = $python_home + "/Scripts/pip.exe" - & $pip_path install -U $pkg - } - - function main () { - InstallPython $env:PYTHON_VERSION $env:PYTHON_ARCH $env:PYTHON_HOME - InstallPip $env:PYTHON_HOME - InstallPackage $env:PYTHON_HOME setuptools - InstallPackage $env:PYTHON_HOME platformio - } - - main - -2. ``scripts/appveyor/run_with_compiler.cmd``: - -.. code-block:: guess - - @ECHO OFF - - SET COMMAND_TO_RUN=%* - SET WIN_SDK_ROOT=C:\Program Files\Microsoft SDKs\Windows - - SET MAJOR_PYTHON_VERSION="%PYTHON_VERSION:~0,1%" - IF %MAJOR_PYTHON_VERSION% == "2" ( - SET WINDOWS_SDK_VERSION="v7.0" - ) ELSE IF %MAJOR_PYTHON_VERSION% == "3" ( - SET WINDOWS_SDK_VERSION="v7.1" - ) ELSE ( - ECHO Unsupported Python version: "%MAJOR_PYTHON_VERSION%" - EXIT 1 - ) - - IF "%PYTHON_ARCH%"=="64" ( - ECHO Configuring Windows SDK %WINDOWS_SDK_VERSION% for Python %MAJOR_PYTHON_VERSION% on a 64 bit architecture - SET DISTUTILS_USE_SDK=1 - SET MSSdk=1 - "%WIN_SDK_ROOT%\%WINDOWS_SDK_VERSION%\Setup\WindowsSdkVer.exe" -q -version:%WINDOWS_SDK_VERSION% - "%WIN_SDK_ROOT%\%WINDOWS_SDK_VERSION%\Bin\SetEnv.cmd" /x64 /release - ECHO Executing: %COMMAND_TO_RUN% - call %COMMAND_TO_RUN% || EXIT 1 - ) ELSE ( - ECHO Using default MSVC build environment for 32 bit architecture - ECHO Executing: %COMMAND_TO_RUN% - call %COMMAND_TO_RUN% || EXIT 1 - ) For more details as for PlatformIO build process please look into :ref:`cmd_ci` command. @@ -194,20 +72,16 @@ Examples build: off environment: - global: - WITH_COMPILER: "cmd /E:ON /V:ON /C .\\scripts\\appveyor\\run_with_compiler.cmd" - matrix: - - PLATFORMIO_CI_SRC: "examples\\Bluetooth\\PS3SPP\\PS3SPP.ino" - PLATFORMIO_CI_SRC: "examples\\pl2303\\pl2303_gps\\pl2303_gps.ino" - WINDOWS_SDK_VERSION: "v7.0" - PYTHON_HOME: "C:\\Python27-x64" - PYTHON_VERSION: "2.7" - PYTHON_ARCH: "64" - install: - - "git submodule update --init --recursive" - - "powershell scripts\\appveyor\\install.ps1" - before_test: - - cmd: SET PATH=%PATH%;%PYTHON_HOME%;%PYTHON_HOME%\Scripts - - cmd: git clone https://github.com/xxxajk/spi4teensy3.git c:\spi4teensy - test_script: - - '%WITH_COMPILER% %PYTHON_HOME%\\Scripts\\platformio ci --lib="." --lib="c:\spi4teensy" --board=uno --board=teensy31 --board=due' + + matrix: + - PLATFORMIO_CI_SRC: "examples\\Bluetooth\\PS3SPP\\PS3SPP.ino" + - PLATFORMIO_CI_SRC: "examples\\pl2303\\pl2303_gps\\pl2303_gps.ino" + + install: + - cmd: git submodule update --init --recursive + - cmd: SET PATH=%PATH%;C:\Python27\Scripts + - cmd: pip install -U platformio + - cmd: git clone https://github.com/xxxajk/spi4teensy3.git C:\spi4teensy + + test_script: + - cmd: platformio ci --lib="." --lib="C:\\spi4teensy" --board=uno --board=teensy31 --board=due diff --git a/scripts/appveyor/install.ps1 b/scripts/appveyor/install.ps1 deleted file mode 100644 index 61e93c1e..00000000 --- a/scripts/appveyor/install.ps1 +++ /dev/null @@ -1,82 +0,0 @@ -# https://packaging.python.org/en/latest/appveyor.html -# Sample script to install Python and pip under Windows -# Authors: Olivier Grisel and Kyle Kastner -# License: CC0 1.0 Universal: http://creativecommons.org/publicdomain/zero/1.0/ - -$BASE_URL = "https://www.python.org/ftp/python/" -$GET_PIP_URL = "https://bootstrap.pypa.io/get-pip.py" -$GET_PIP_PATH = "C:\get-pip.py" - - -function DownloadPython ($python_version, $platform_suffix) { - $webclient = New-Object System.Net.WebClient - $filename = "python-" + $python_version + $platform_suffix + ".msi" - $url = $BASE_URL + $python_version + "/" + $filename - - $basedir = $pwd.Path + "\" - $filepath = $basedir + $filename - if (Test-Path $filename) { - Write-Host "Reusing" $filepath - return $filepath - } - - # Download and retry up to 5 times in case of network transient errors. - Write-Host "Downloading" $filename "from" $url - $retry_attempts = 3 - for($i=0; $i -lt $retry_attempts; $i++){ - try { - $webclient.DownloadFile($url, $filepath) - break - } - Catch [Exception]{ - Start-Sleep 1 - } - } - Write-Host "File saved at" $filepath - return $filepath -} - - -function InstallPython ($python_version, $architecture, $python_home) { - Write-Host "Installing Python" $python_version "for" $architecture "bit architecture to" $python_home - if (Test-Path $python_home) { - Write-Host $python_home "already exists, skipping." - return $false - } - if ($architecture -eq "32") { - $platform_suffix = "" - } else { - $platform_suffix = ".amd64" - } - $filepath = DownloadPython $python_version $platform_suffix - Write-Host "Installing" $filepath "to" $python_home - $args = "/qn /i $filepath TARGETDIR=$python_home" - Write-Host "msiexec.exe" $args - Start-Process -FilePath "msiexec.exe" -ArgumentList $args -Wait -Passthru - Write-Host "Python $python_version ($architecture) installation complete" - return $true -} - - -function InstallPip ($python_home) { - $python_path = $python_home + "/python.exe" - Write-Host "Installing pip..." - $webclient = New-Object System.Net.WebClient - $webclient.DownloadFile($GET_PIP_URL, $GET_PIP_PATH) - Write-Host "Executing:" $python_path $GET_PIP_PATH - Start-Process -FilePath "$python_path" -ArgumentList "$GET_PIP_PATH" -Wait -Passthru -} - -function InstallPackage ($python_home, $pkg) { - $pip_path = $python_home + "/Scripts/pip.exe" - & $pip_path install -U $pkg -} - -function main () { - InstallPython $env:PYTHON_VERSION $env:PYTHON_ARCH $env:PYTHON_HOME - InstallPip $env:PYTHON_HOME - InstallPackage $env:PYTHON_HOME setuptools - InstallPackage $env:PYTHON_HOME tox -} - -main diff --git a/scripts/appveyor/run_with_compiler.cmd b/scripts/appveyor/run_with_compiler.cmd deleted file mode 100644 index 7a75d18c..00000000 --- a/scripts/appveyor/run_with_compiler.cmd +++ /dev/null @@ -1,48 +0,0 @@ -:: https://packaging.python.org/en/latest/appveyor.html -:: To build extensions for 64 bit Python 3, we need to configure environment -:: variables to use the MSVC 2010 C++ compilers from GRMSDKX_EN_DVD.iso of: -:: MS Windows SDK for Windows 7 and .NET Framework 4 (SDK v7.1) -:: -:: To build extensions for 64 bit Python 2, we need to configure environment -:: variables to use the MSVC 2008 C++ compilers from GRMSDKX_EN_DVD.iso of: -:: MS Windows SDK for Windows 7 and .NET Framework 3.5 (SDK v7.0) -:: -:: 32 bit builds do not require specific environment configurations. -:: -:: Note: this script needs to be run with the /E:ON and /V:ON flags for the -:: cmd interpreter, at least for (SDK v7.0) -:: -:: More details at: -:: https://github.com/cython/cython/wiki/64BitCythonExtensionsOnWindows -:: http://stackoverflow.com/a/13751649/163740 -:: -:: Author: Olivier Grisel -:: License: CC0 1.0 Universal: http://creativecommons.org/publicdomain/zero/1.0/ -@ECHO OFF - -SET COMMAND_TO_RUN=%* -SET WIN_SDK_ROOT=C:\Program Files\Microsoft SDKs\Windows - -SET MAJOR_PYTHON_VERSION="%PYTHON_VERSION:~0,1%" -IF %MAJOR_PYTHON_VERSION% == "2" ( - SET WINDOWS_SDK_VERSION="v7.0" -) ELSE IF %MAJOR_PYTHON_VERSION% == "3" ( - SET WINDOWS_SDK_VERSION="v7.1" -) ELSE ( - ECHO Unsupported Python version: "%MAJOR_PYTHON_VERSION%" - EXIT 1 -) - -IF "%PYTHON_ARCH%"=="64" ( - ECHO Configuring Windows SDK %WINDOWS_SDK_VERSION% for Python %MAJOR_PYTHON_VERSION% on a 64 bit architecture - SET DISTUTILS_USE_SDK=1 - SET MSSdk=1 - "%WIN_SDK_ROOT%\%WINDOWS_SDK_VERSION%\Setup\WindowsSdkVer.exe" -q -version:%WINDOWS_SDK_VERSION% - "%WIN_SDK_ROOT%\%WINDOWS_SDK_VERSION%\Bin\SetEnv.cmd" /x64 /release - ECHO Executing: %COMMAND_TO_RUN% - call %COMMAND_TO_RUN% || EXIT 1 -) ELSE ( - ECHO Using default MSVC build environment for 32 bit architecture - ECHO Executing: %COMMAND_TO_RUN% - call %COMMAND_TO_RUN% || EXIT 1 -) \ No newline at end of file From 35a602cfefde288ffe72f6d21436ac6785ffcab4 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Sat, 28 May 2016 20:27:16 +0300 Subject: [PATCH 19/39] Install tox manually --- appveyor.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/appveyor.yml b/appveyor.yml index 0d091e31..a04e1904 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -7,6 +7,7 @@ environment: install: - cmd: git submodule update --init --recursive - cmd: SET PATH=%PATH%;C:\Python27\Scripts + - cmd: pip install tox test_script: - cmd: tox From f6014d2e523ad1d73727c199ee14810b454f752a Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Sun, 29 May 2016 16:47:54 +0300 Subject: [PATCH 20/39] Fixed configuration data for TI LaunchPads based on msp430fr4133 and msp430fr6989 MCUs // Resolve #676 --- HISTORY.rst | 3 +++ docs/frameworks/arduino.rst | 34 +++++++++++++++++++++++------ docs/frameworks/energia.rst | 4 ++-- docs/frameworks/mbed.rst | 27 +++++++++++++++++++++++ docs/platforms/atmelavr.rst | 7 ++++++ docs/platforms/microchippic32.rst | 27 +++++++++++++++++------ docs/platforms/siliconlabsefm32.rst | 7 ++++++ docs/platforms/ststm32.rst | 20 +++++++++++++++++ docs/platforms/timsp430.rst | 4 ++-- platformio/boards/timsp430.json | 4 ++-- tests/test_pkgmanifest.py | 2 +- 11 files changed, 118 insertions(+), 21 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index fd61dbeb..2d5d6560 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -18,6 +18,9 @@ PlatformIO 2.0 * Fixed bug with ``env_default`` when ``pio run -e`` is used * Fixed issue with ``src_filter`` option for Windows OS (`issue #652 `_) +* Fixed configuration data for TI LaunchPads based on msp430fr4133 and + msp430fr6989 MCUs + (`issue #676 `_) 2.9.1 (2016-04-30) ~~~~~~~~~~~~~~~~~~ diff --git a/docs/frameworks/arduino.rst b/docs/frameworks/arduino.rst index af3f11b1..74b7b485 100644 --- a/docs/frameworks/arduino.rst +++ b/docs/frameworks/arduino.rst @@ -571,13 +571,6 @@ Digilent - 512 Kb - 128 Kb - * - ``openbci`` - - `Digilent OpenScope `_ - - 32MX250F128B - - 40 MHz - - 128 Kb - - 32 Kb - * - ``openscope`` - `Digilent OpenScope `_ - 32MZ2048EFG124 @@ -1020,6 +1013,13 @@ Mcudude - 64 Kb - 4 Kb + * - ``mightycore8535`` + - `MightyCore ATmega8535 `_ + - ATMEGA16 + - 16 MHz + - 8 Kb + - 0.5 Kb + Microduino ~~~~~~~~~~ @@ -1150,6 +1150,26 @@ Olimex - 256 Kb - 32 Kb +OpenBCI +~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``openbci`` + - `OpenBCI 32bit `_ + - 32MX250F128B + - 40 MHz + - 128 Kb + - 32 Kb + PONTECH ~~~~~~~ diff --git a/docs/frameworks/energia.rst b/docs/frameworks/energia.rst index 00f84582..7caf06e0 100644 --- a/docs/frameworks/energia.rst +++ b/docs/frameworks/energia.rst @@ -77,7 +77,7 @@ TI * - ``lpmsp430fr4133`` - `TI LaunchPad w/ msp430fr4133 `_ - - MSP430G2553 + - MSP430FR4133 - 16 MHz - 16 Kb - 2 Kb @@ -98,7 +98,7 @@ TI * - ``lpmsp430fr6989`` - `TI LaunchPad w/ msp430fr6989 `_ - - MSP430G2553 + - MSP430FR6989 - 16 MHz - 128 Kb - 2 Kb diff --git a/docs/frameworks/mbed.rst b/docs/frameworks/mbed.rst index 2335eaa9..9aa1575b 100644 --- a/docs/frameworks/mbed.rst +++ b/docs/frameworks/mbed.rst @@ -286,6 +286,26 @@ JKSoft - 128 Kb - 16 Kb +MultiTech +~~~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``mts_mdot_f411re`` + - `MultiTech mDot F411 `_ + - STM32F411RET6 + - 100 MHz + - 512 Kb + - 128 Kb + NGX Technologies ~~~~~~~~~~~~~~~~ @@ -705,6 +725,13 @@ Silicon Labs - 256 Kb - 32 Kb + * - ``efm32pg_stk3401`` + - `Silicon Labs SLSTK3401A (Pearl Gecko) `_ + - EFM32PG1B200F256 + - 40 MHz + - 256 Kb + - 32 Kb + * - ``efm32wg_stk3800`` - `Silicon Labs EFM32WG-STK3800 (Wonder Gecko) `_ - EFM32WG990F256 diff --git a/docs/platforms/atmelavr.rst b/docs/platforms/atmelavr.rst index 4f4b5955..3731e747 100644 --- a/docs/platforms/atmelavr.rst +++ b/docs/platforms/atmelavr.rst @@ -702,6 +702,13 @@ Mcudude - 64 Kb - 4 Kb + * - ``mightycore8535`` + - `MightyCore ATmega8535 `_ + - ATMEGA16 + - 16 MHz + - 8 Kb + - 0.5 Kb + Microduino ~~~~~~~~~~ diff --git a/docs/platforms/microchippic32.rst b/docs/platforms/microchippic32.rst index 46e56537..5e6a6bfe 100644 --- a/docs/platforms/microchippic32.rst +++ b/docs/platforms/microchippic32.rst @@ -177,13 +177,6 @@ Digilent - 512 Kb - 128 Kb - * - ``openbci`` - - `Digilent OpenScope `_ - - 32MX250F128B - - 40 MHz - - 128 Kb - - 32 Kb - * - ``openscope`` - `Digilent OpenScope `_ - 32MZ2048EFG124 @@ -245,6 +238,26 @@ Olimex - 256 Kb - 32 Kb +OpenBCI +~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``openbci`` + - `OpenBCI 32bit `_ + - 32MX250F128B + - 40 MHz + - 128 Kb + - 32 Kb + PONTECH ~~~~~~~ diff --git a/docs/platforms/siliconlabsefm32.rst b/docs/platforms/siliconlabsefm32.rst index 11929989..d08cca92 100644 --- a/docs/platforms/siliconlabsefm32.rst +++ b/docs/platforms/siliconlabsefm32.rst @@ -98,6 +98,13 @@ Silicon Labs - 256 Kb - 32 Kb + * - ``efm32pg_stk3401`` + - `Silicon Labs SLSTK3401A (Pearl Gecko) `_ + - EFM32PG1B200F256 + - 40 MHz + - 256 Kb + - 32 Kb + * - ``efm32wg_stk3800`` - `Silicon Labs EFM32WG-STK3800 (Wonder Gecko) `_ - EFM32WG990F256 diff --git a/docs/platforms/ststm32.rst b/docs/platforms/ststm32.rst index cb56e6ac..0f900362 100644 --- a/docs/platforms/ststm32.rst +++ b/docs/platforms/ststm32.rst @@ -142,6 +142,26 @@ Armstrap - 512 Kb - 192 Kb +MultiTech +~~~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``mts_mdot_f411re`` + - `MultiTech mDot F411 `_ + - STM32F411RET6 + - 100 MHz + - 512 Kb + - 128 Kb + ST ~~ diff --git a/docs/platforms/timsp430.rst b/docs/platforms/timsp430.rst index 1ef7c5a3..8b444792 100644 --- a/docs/platforms/timsp430.rst +++ b/docs/platforms/timsp430.rst @@ -122,7 +122,7 @@ TI * - ``lpmsp430fr4133`` - `TI LaunchPad w/ msp430fr4133 `_ - - MSP430G2553 + - MSP430FR4133 - 16 MHz - 16 Kb - 2 Kb @@ -143,7 +143,7 @@ TI * - ``lpmsp430fr6989`` - `TI LaunchPad w/ msp430fr6989 `_ - - MSP430G2553 + - MSP430FR6989 - 16 MHz - 128 Kb - 2 Kb diff --git a/platformio/boards/timsp430.json b/platformio/boards/timsp430.json index ca46ffad..5b8544a6 100644 --- a/platformio/boards/timsp430.json +++ b/platformio/boards/timsp430.json @@ -129,7 +129,7 @@ "build": { "core": "msp430", "f_cpu": "16000000L", - "mcu": "msp430g2553", + "mcu": "msp430fr4133", "variant": "launchpad_fr4133" }, "frameworks": ["energia"], @@ -147,7 +147,7 @@ "build": { "core": "msp430", "f_cpu": "16000000L", - "mcu": "msp430g2553", + "mcu": "msp430fr6989", "variant": "launchpad_fr6989" }, "frameworks": ["energia"], diff --git a/tests/test_pkgmanifest.py b/tests/test_pkgmanifest.py index ff0235cb..62b1b9d6 100644 --- a/tests/test_pkgmanifest.py +++ b/tests/test_pkgmanifest.py @@ -38,7 +38,7 @@ def validate_response(req): def test_package(package_data): - assert package_data['url'].endswith("%d.tar.gz" % package_data['version']) + assert package_data['url'].endswith(".tar.gz") r = requests.head(package_data['url'], allow_redirects=True) validate_response(r) From ab15bafc5b32f07cfefcf389567337a9a892b96d Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Sun, 29 May 2016 18:09:21 +0300 Subject: [PATCH 21/39] Automatically add source directory to "CPPPATH" of Build System --- HISTORY.rst | 1 + platformio/builder/tools/platformio.py | 1 + 2 files changed, 2 insertions(+) diff --git a/HISTORY.rst b/HISTORY.rst index 2d5d6560..3133868b 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -9,6 +9,7 @@ PlatformIO 2.0 * Simplified documentation for `Continuous Integration with AppVeyor `__ (`issue #671 `_) +* Automatically add source directory to ``CPPPATH`` of Build System * Added support for Silicon Labs SLSTK3401A (Pearl Gecko) and MultiTech mDot F411 ARM mbed based boards * Added support for MightyCore ATmega8535 board diff --git a/platformio/builder/tools/platformio.py b/platformio/builder/tools/platformio.py index f897d24a..891f45ba 100644 --- a/platformio/builder/tools/platformio.py +++ b/platformio/builder/tools/platformio.py @@ -80,6 +80,7 @@ def BuildProgram(env): env.Append( CPPDEFINES=["PLATFORMIO={0:02d}{1:02d}{2:02d}".format( *pioversion_to_intstr())], + CPPPATH=["$PROJECTSRC_DIR"], LIBS=deplibs, LIBPATH=["$BUILD_DIR"] ) From a1e7ce415b96e452c3cb76b8277fe004b0e89801 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Mon, 30 May 2016 13:15:19 +0300 Subject: [PATCH 22/39] Add MinGW to the PATH --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index a04e1904..845307f6 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -6,7 +6,7 @@ environment: install: - cmd: git submodule update --init --recursive - - cmd: SET PATH=%PATH%;C:\Python27\Scripts + - cmd: SET PATH=%PATH%;C:\Python27\Scripts;C:\MinGW\bin - cmd: pip install tox test_script: From c74a2b452959cf46cfa9df752aca8bce2eb42949 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Wed, 1 Jun 2016 20:24:08 +0300 Subject: [PATCH 23/39] Improve firmware uploading to Arduino Leonardo based boards --- HISTORY.rst | 1 + platformio/builder/tools/pioupload.py | 3 ++- platformio/util.py | 27 ++++++++++++++++++++++----- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index 3133868b..1215c69d 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -16,6 +16,7 @@ PlatformIO 2.0 (`issue #585 `_) * Use HTTP mirror for Package Manager in a case with SSL errors (`issue #645 `_) +* Improved firmware uploading to Arduino Leonardo based boards * Fixed bug with ``env_default`` when ``pio run -e`` is used * Fixed issue with ``src_filter`` option for Windows OS (`issue #652 `_) diff --git a/platformio/builder/tools/pioupload.py b/platformio/builder/tools/pioupload.py index d1cd6dab..bbf77d19 100644 --- a/platformio/builder/tools/pioupload.py +++ b/platformio/builder/tools/pioupload.py @@ -50,8 +50,9 @@ def TouchSerialPort(env, port, baudrate): def WaitForNewSerialPort(env, before): new_port = None elapsed = 0 + sleep(0.5) while elapsed < 10: - now = [i['port'] for i in get_serialports()] + now = [i['port'] for i in get_serialports(use_grep=True)] diff = list(set(now) - set(before)) if diff: new_port = diff[0] diff --git a/platformio/util.py b/platformio/util.py index 6dc1bd5e..e3a02b3d 100644 --- a/platformio/util.py +++ b/platformio/util.py @@ -280,7 +280,24 @@ def exec_command(*args, **kwargs): return result -def get_serialports(): +def get_serialports(use_grep=False): + + def _grep_serial_ports(): + assert "Windows" != system() + result = [] + if "Linux" == system(): + patterns = ["/dev/%s*" % p for p in ( + "ttyS", "ttyUSB", "ttyACM", "ttyAMA", "rfcomm", "ttyO")] + else: + patterns = ["/dev/tty.*"] + for pattern in patterns: + for port in glob(pattern): + result.append({"port": port, "description": "", "hwid": ""}) + return result + + if use_grep and "Windows" != system(): + return _grep_serial_ports() + try: from serial.tools.list_ports import comports except ImportError: @@ -290,7 +307,7 @@ def get_serialports(): for p, d, h in comports(): if not p: continue - if "windows" in get_systype(): + if "Windows" == system(): try: d = unicode(d, errors="ignore") except TypeError: @@ -298,9 +315,9 @@ def get_serialports(): result.append({"port": p, "description": d, "hwid": h}) # fix for PySerial - if not result and system() == "Darwin": - for p in glob("/dev/tty.*"): - result.append({"port": p, "description": "", "hwid": ""}) + if not result: + result = _grep_serial_ports() + return result From 250b39bcc80f9c40e409d26f996b4ae4ed48461a Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Wed, 1 Jun 2016 20:26:10 +0300 Subject: [PATCH 24/39] Skip grep search for serial ports on Windows machines --- platformio/util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio/util.py b/platformio/util.py index e3a02b3d..a82b3c15 100644 --- a/platformio/util.py +++ b/platformio/util.py @@ -315,7 +315,7 @@ def get_serialports(use_grep=False): result.append({"port": p, "description": d, "hwid": h}) # fix for PySerial - if not result: + if not result and "Windows" != system(): result = _grep_serial_ports() return result From 694121d49a991403b88c14b7dabfacc36a42d366 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Wed, 1 Jun 2016 20:35:05 +0300 Subject: [PATCH 25/39] Grep for "/dev/cu.*" on OS X --- platformio/util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio/util.py b/platformio/util.py index a82b3c15..39f3ad06 100644 --- a/platformio/util.py +++ b/platformio/util.py @@ -289,7 +289,7 @@ def get_serialports(use_grep=False): patterns = ["/dev/%s*" % p for p in ( "ttyS", "ttyUSB", "ttyACM", "ttyAMA", "rfcomm", "ttyO")] else: - patterns = ["/dev/tty.*"] + patterns = ["/dev/tty.*", "/dev/cu.*"] for pattern in patterns: for port in glob(pattern): result.append({"port": port, "description": "", "hwid": ""}) From ce72ee04f45da1945a831941ac347fe9ea0eaf39 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Wed, 1 Jun 2016 20:36:13 +0300 Subject: [PATCH 26/39] Link Community Forums FAQ with Docs FAQ --- docs/faq.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/faq.rst b/docs/faq.rst index bf412216..663c108f 100644 --- a/docs/faq.rst +++ b/docs/faq.rst @@ -14,6 +14,10 @@ Frequently Asked Questions ========================== +.. note:: + We have a big database with `Frequently Asked Questions in our Community Forums `_. + Please have a look at it. + .. contents:: General From f3689ac157287cf0f1adb55f4abaf0c311e32d79 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Wed, 1 Jun 2016 21:30:30 +0300 Subject: [PATCH 27/39] Add new articles --- docs/articles.rst | 8 ++++++++ docs/ide/atom.rst | 1 + docs/platforms/espressif_extra.rst | 4 ++++ 3 files changed, 13 insertions(+) diff --git a/docs/articles.rst b/docs/articles.rst index a4244ac0..c11c1657 100644 --- a/docs/articles.rst +++ b/docs/articles.rst @@ -23,6 +23,14 @@ Here are recent articles about PlatformIO: 2016 ^^^^ +* May 30, 2016 - **Ron Moerman** - `IoT Development with PlatformIO `_ +* May 29, 2016 - **Chris Synan** - `Reverse Engineer RF Remote Controller for IoT! `_ +* May 26, 2016 - **Charlie Key** - `7 Best Developer Tools To Build Your NEXT Internet of Things Application `_ +* May 22, 2016 - **Pedro Minatel** - `Estação meteorológica com ESP8266 (Weather station with ESP8266, Portuguese) `_ +* May 16, 2016 - **Pedro Minatel** - `Controle remoto WiFi com ESP8266 (Remote WiFi with ESP8266, Portuguese) `_ +* May 11, 2016 - **Jo Vandeginste** - `Using PlatformIO to compile for Jeelabs' Jeenode Micro `_ +* May 08, 2016 - **Radoslaw Bob** - `Touch controlled buzzer (Nodemcu ESP8266) `_ +* May 06, 2016 - **Jean Roux** - `The IoT building blocks I use for my home-automation projects `_ * May 05, 2016 - **Ivan Kravets, Ph.D. / Eclipse Virtual IoT Meetup** - `PlatformIO: a cross-platform IoT solution to build them all! `_ * May 01, 2016 - **Pedro Minatel** - `PlatformIO – Uma alternativa ao Arduino IDE (PlatformIO - An alternative to the Arduino IDE, Portuguese) `_ * Apr 23, 2016 - **Al Williams** - `Hackaday: Atomic Arduino (and Other) Development `_ diff --git a/docs/ide/atom.rst b/docs/ide/atom.rst index 1f7e5e59..f46d5a2c 100644 --- a/docs/ide/atom.rst +++ b/docs/ide/atom.rst @@ -471,6 +471,7 @@ package and `C/C++ Uncrustify Code Beautifier `_ * May 01, 2016 - **Pedro Minatel** - `PlatformIO – Uma alternativa ao Arduino IDE (PlatformIO - An alternative to the Arduino IDE, Portuguese) `_ * Apr 23, 2016 - **Al Williams** - `Hackaday: Atomic Arduino (and Other) Development `_ * Apr 16, 2016 - **Sathittham Sangthong** - `[PlatformIO] มาลองเล่น PlatformIO แทน Arduino IDE กัน (Let's play together with PlatformIO IDE [alternative to Arduino IDE], Thai) `_ diff --git a/docs/platforms/espressif_extra.rst b/docs/platforms/espressif_extra.rst index c4a32b3f..17e5c7d5 100644 --- a/docs/platforms/espressif_extra.rst +++ b/docs/platforms/espressif_extra.rst @@ -240,6 +240,10 @@ Using Arduino Framework with Staging version Articles -------- +* May 29, 2016 - **Chris Synan** - `Reverse Engineer RF Remote Controller for IoT! `_ +* May 22, 2016 - **Pedro Minatel** - `Estação meteorológica com ESP8266 (Weather station with ESP8266, Portuguese) `_ +* May 16, 2016 - **Pedro Minatel** - `Controle remoto WiFi com ESP8266 (Remote WiFi with ESP8266, Portuguese) `_ +* May 08, 2016 - **Radoslaw Bob** - `Touch controlled buzzer (Nodemcu ESP8266) `_ * Mar 07, 2016 - **Joran Jessurun** - `Nieuwe wereld met PlatformIO (New world with PlatformIO, Dutch) `_ * Feb 25, 2016 - **NutDIY** - `PlatformIO Blink On Nodemcu Dev Kit V1.0 (ESP 12-E) `_ * Feb 23, 2016 - **Ptarmigan Labs** - `ESP8266 Over The Air updating – what are the options? `_ From 406e240de1485175015e3693592666dbadd18904 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Wed, 1 Jun 2016 22:14:37 +0300 Subject: [PATCH 28/39] Update title of the article --- docs/articles.rst | 2 +- docs/platforms/espressif_extra.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/articles.rst b/docs/articles.rst index c11c1657..e844b961 100644 --- a/docs/articles.rst +++ b/docs/articles.rst @@ -27,7 +27,7 @@ Here are recent articles about PlatformIO: * May 29, 2016 - **Chris Synan** - `Reverse Engineer RF Remote Controller for IoT! `_ * May 26, 2016 - **Charlie Key** - `7 Best Developer Tools To Build Your NEXT Internet of Things Application `_ * May 22, 2016 - **Pedro Minatel** - `Estação meteorológica com ESP8266 (Weather station with ESP8266, Portuguese) `_ -* May 16, 2016 - **Pedro Minatel** - `Controle remoto WiFi com ESP8266 (Remote WiFi with ESP8266, Portuguese) `_ +* May 16, 2016 - **Pedro Minatel** - `Controle remoto WiFi com ESP8266 (WiFi remote control using ESP8266, Portuguese) `_ * May 11, 2016 - **Jo Vandeginste** - `Using PlatformIO to compile for Jeelabs' Jeenode Micro `_ * May 08, 2016 - **Radoslaw Bob** - `Touch controlled buzzer (Nodemcu ESP8266) `_ * May 06, 2016 - **Jean Roux** - `The IoT building blocks I use for my home-automation projects `_ diff --git a/docs/platforms/espressif_extra.rst b/docs/platforms/espressif_extra.rst index 17e5c7d5..b9430876 100644 --- a/docs/platforms/espressif_extra.rst +++ b/docs/platforms/espressif_extra.rst @@ -242,7 +242,7 @@ Articles * May 29, 2016 - **Chris Synan** - `Reverse Engineer RF Remote Controller for IoT! `_ * May 22, 2016 - **Pedro Minatel** - `Estação meteorológica com ESP8266 (Weather station with ESP8266, Portuguese) `_ -* May 16, 2016 - **Pedro Minatel** - `Controle remoto WiFi com ESP8266 (Remote WiFi with ESP8266, Portuguese) `_ +* May 16, 2016 - **Pedro Minatel** - `Controle remoto WiFi com ESP8266 (WiFi remote control using ESP8266, Portuguese) `_ * May 08, 2016 - **Radoslaw Bob** - `Touch controlled buzzer (Nodemcu ESP8266) `_ * Mar 07, 2016 - **Joran Jessurun** - `Nieuwe wereld met PlatformIO (New world with PlatformIO, Dutch) `_ * Feb 25, 2016 - **NutDIY** - `PlatformIO Blink On Nodemcu Dev Kit V1.0 (ESP 12-E) `_ From d7ca3f15a4a3c01306cf85a4150adca67c0cd4a7 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Wed, 1 Jun 2016 23:33:15 +0300 Subject: [PATCH 29/39] Use $PROGNAME instead static name when looking for the firmware --- platformio/builder/tools/pioupload.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/platformio/builder/tools/pioupload.py b/platformio/builder/tools/pioupload.py index bbf77d19..89a8d6bc 100644 --- a/platformio/builder/tools/pioupload.py +++ b/platformio/builder/tools/pioupload.py @@ -105,11 +105,13 @@ def AutodetectUploadPort(env): def UploadToDisk(_, target, source, env): # pylint: disable=W0613,W0621 env.AutodetectUploadPort() + progname = env.subst("$PROGNAME") for ext in ("bin", "hex"): - fpath = join(env.subst("$BUILD_DIR"), "firmware.%s" % ext) + fpath = join(env.subst("$BUILD_DIR"), "%s.%s" % (progname, ext)) if not isfile(fpath): continue - copyfile(fpath, join(env.subst("$UPLOAD_PORT"), "firmware.%s" % ext)) + copyfile(fpath, join( + env.subst("$UPLOAD_PORT"), "%s.%s" % (progname, ext))) print("Firmware has been successfully uploaded.\n" "Please restart your board.") From b188a05b695a8b4b6635bd7e963511a25f4bb5d4 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Thu, 2 Jun 2016 00:14:02 +0300 Subject: [PATCH 30/39] Fix PyLint's "misplaced-comparison-constant" --- platformio/util.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/platformio/util.py b/platformio/util.py index 39f3ad06..07966d2c 100644 --- a/platformio/util.py +++ b/platformio/util.py @@ -283,9 +283,9 @@ def exec_command(*args, **kwargs): def get_serialports(use_grep=False): def _grep_serial_ports(): - assert "Windows" != system() + assert system() != "Windows" result = [] - if "Linux" == system(): + if system() == "Linux": patterns = ["/dev/%s*" % p for p in ( "ttyS", "ttyUSB", "ttyACM", "ttyAMA", "rfcomm", "ttyO")] else: @@ -295,7 +295,7 @@ def get_serialports(use_grep=False): result.append({"port": port, "description": "", "hwid": ""}) return result - if use_grep and "Windows" != system(): + if use_grep and system() != "Windows": return _grep_serial_ports() try: @@ -307,7 +307,7 @@ def get_serialports(use_grep=False): for p, d, h in comports(): if not p: continue - if "Windows" == system(): + if system() == "Windows": try: d = unicode(d, errors="ignore") except TypeError: @@ -315,7 +315,7 @@ def get_serialports(use_grep=False): result.append({"port": p, "description": d, "hwid": h}) # fix for PySerial - if not result and "Windows" != system(): + if not result and system() != "Windows": result = _grep_serial_ports() return result From c773c8f5d51b27dfe2d4dfdb19b74de07d321dbc Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Thu, 2 Jun 2016 01:09:05 +0300 Subject: [PATCH 31/39] Minor improvements --- platformio/builder/scripts/atmelavr.py | 4 +--- platformio/builder/scripts/atmelsam.py | 7 ++----- platformio/builder/tools/pioupload.py | 6 ++++-- platformio/util.py | 5 +++-- 4 files changed, 10 insertions(+), 12 deletions(-) diff --git a/platformio/builder/scripts/atmelavr.py b/platformio/builder/scripts/atmelavr.py index daff63af..24c6bd72 100644 --- a/platformio/builder/scripts/atmelavr.py +++ b/platformio/builder/scripts/atmelavr.py @@ -65,13 +65,11 @@ def BeforeUpload(target, source, env): # pylint: disable=W0613,W0621 if not upload_options.get("disable_flushing", False): env.FlushSerialBuffer("$UPLOAD_PORT") - before_ports = [i['port'] for i in get_serialports()] - 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.Replace(UPLOAD_PORT=env.WaitForNewSerialPort()) env = DefaultEnvironment() diff --git a/platformio/builder/scripts/atmelsam.py b/platformio/builder/scripts/atmelsam.py index d91b0bf0..af24f08b 100644 --- a/platformio/builder/scripts/atmelsam.py +++ b/platformio/builder/scripts/atmelsam.py @@ -41,13 +41,11 @@ def BeforeUpload(target, source, env): # pylint: disable=W0613,W0621 if not upload_options.get("disable_flushing", False): env.FlushSerialBuffer("$UPLOAD_PORT") - before_ports = [i['port'] for i in get_serialports()] - 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.Replace(UPLOAD_PORT=env.WaitForNewSerialPort()) # use only port name for BOSSA if "/" in env.subst("$UPLOAD_PORT"): @@ -111,8 +109,7 @@ env.Append( ], CPPDEFINES=[ - "USBCON", - 'USB_MANUFACTURER="PlatformIO"' + "USBCON" ], LINKFLAGS=[ diff --git a/platformio/builder/tools/pioupload.py b/platformio/builder/tools/pioupload.py index 89a8d6bc..e27efd30 100644 --- a/platformio/builder/tools/pioupload.py +++ b/platformio/builder/tools/pioupload.py @@ -47,12 +47,14 @@ def TouchSerialPort(env, port, baudrate): sleep(0.4) -def WaitForNewSerialPort(env, before): +def WaitForNewSerialPort(env): + before = [i['port'] for i in get_serialports(use_grep=True)] + sleep(0.5) new_port = None elapsed = 0 - sleep(0.5) while elapsed < 10: now = [i['port'] for i in get_serialports(use_grep=True)] + print 45, now diff = list(set(now) - set(before)) if diff: new_port = diff[0] diff --git a/platformio/util.py b/platformio/util.py index 07966d2c..2e8e12b2 100644 --- a/platformio/util.py +++ b/platformio/util.py @@ -283,8 +283,9 @@ def exec_command(*args, **kwargs): def get_serialports(use_grep=False): def _grep_serial_ports(): - assert system() != "Windows" result = [] + if system() == "Windows": + return result if system() == "Linux": patterns = ["/dev/%s*" % p for p in ( "ttyS", "ttyUSB", "ttyACM", "ttyAMA", "rfcomm", "ttyO")] @@ -315,7 +316,7 @@ def get_serialports(use_grep=False): result.append({"port": p, "description": d, "hwid": h}) # fix for PySerial - if not result and system() != "Windows": + if not result: result = _grep_serial_ports() return result From 1fdc2e309159d73a57570bd0d33b513b8b2c814d Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Thu, 2 Jun 2016 01:13:34 +0300 Subject: [PATCH 32/39] Remove unused imports --- platformio/builder/scripts/atmelavr.py | 2 -- platformio/builder/scripts/atmelsam.py | 2 -- platformio/builder/tools/pioupload.py | 1 - 3 files changed, 5 deletions(-) diff --git a/platformio/builder/scripts/atmelavr.py b/platformio/builder/scripts/atmelavr.py index 24c6bd72..26370f22 100644 --- a/platformio/builder/scripts/atmelavr.py +++ b/platformio/builder/scripts/atmelavr.py @@ -22,8 +22,6 @@ from time import sleep from SCons.Script import (COMMAND_LINE_TARGETS, AlwaysBuild, Default, DefaultEnvironment, SConscript) -from platformio.util import get_serialports - def BeforeUpload(target, source, env): # pylint: disable=W0613,W0621 diff --git a/platformio/builder/scripts/atmelsam.py b/platformio/builder/scripts/atmelsam.py index af24f08b..7cf50a31 100644 --- a/platformio/builder/scripts/atmelsam.py +++ b/platformio/builder/scripts/atmelsam.py @@ -21,8 +21,6 @@ from os.path import basename, join from SCons.Script import (COMMAND_LINE_TARGETS, AlwaysBuild, Default, DefaultEnvironment, SConscript) -from platformio.util import get_serialports - def BeforeUpload(target, source, env): # pylint: disable=W0613,W0621 env.AutodetectUploadPort() diff --git a/platformio/builder/tools/pioupload.py b/platformio/builder/tools/pioupload.py index e27efd30..cb973b92 100644 --- a/platformio/builder/tools/pioupload.py +++ b/platformio/builder/tools/pioupload.py @@ -54,7 +54,6 @@ def WaitForNewSerialPort(env): elapsed = 0 while elapsed < 10: now = [i['port'] for i in get_serialports(use_grep=True)] - print 45, now diff = list(set(now) - set(before)) if diff: new_port = diff[0] From b3fc6617e5edf6a478ddc0e222494d0d6b4e4973 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Thu, 2 Jun 2016 14:57:44 +0300 Subject: [PATCH 33/39] Implement grep serial ports for Windows --- platformio/util.py | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/platformio/util.py b/platformio/util.py index 2e8e12b2..221c6d9b 100644 --- a/platformio/util.py +++ b/platformio/util.py @@ -285,19 +285,28 @@ def get_serialports(use_grep=False): def _grep_serial_ports(): result = [] if system() == "Windows": - return result - if system() == "Linux": - patterns = ["/dev/%s*" % p for p in ( - "ttyS", "ttyUSB", "ttyACM", "ttyAMA", "rfcomm", "ttyO")] + output = exec_command(["mode"]).get("out", "") + for line in output.split("\n"): + line = line.strip() + if "COM" in line: + result.append({"port": line[line.index("COM"):-1], + "description": "", "hwid": ""}) else: - patterns = ["/dev/tty.*", "/dev/cu.*"] - for pattern in patterns: - for port in glob(pattern): - result.append({"port": port, "description": "", "hwid": ""}) + if system() == "Linux": + patterns = ["/dev/%s*" % p for p in ( + "ttyS", "ttyUSB", "ttyACM", "ttyAMA", "rfcomm", "ttyO")] + else: + patterns = ["/dev/tty.*", "/dev/cu.*"] + for pattern in patterns: + for port in glob(pattern): + result.append( + {"port": port, "description": "", "hwid": ""}) return result - if use_grep and system() != "Windows": - return _grep_serial_ports() + if use_grep: + result = _grep_serial_ports() + if result: + return result try: from serial.tools.list_ports import comports @@ -316,7 +325,7 @@ def get_serialports(use_grep=False): result.append({"port": p, "description": d, "hwid": h}) # fix for PySerial - if not result: + if not result and not use_grep: result = _grep_serial_ports() return result @@ -326,7 +335,7 @@ def get_logicaldisks(): disks = [] if system() == "Windows": result = exec_command( - ["wmic", "logicaldisk", "get", "name,VolumeName"]).get("out") + ["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()) From 03d9351decf474a44084f84124231a1e1bea3f45 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Thu, 2 Jun 2016 16:41:04 +0300 Subject: [PATCH 34/39] Add "stlink" as the default uploader for STM32 Discovery boards // Resolve #665 --- HISTORY.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index 1215c69d..34971927 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -7,16 +7,18 @@ PlatformIO 2.0 2.9.2 (2016-??-??) ~~~~~~~~~~~~~~~~~~ -* Simplified documentation for `Continuous Integration with AppVeyor `__ +* Simplified `Continuous Integration with AppVeyor `__ (`issue #671 `_) * Automatically add source directory to ``CPPPATH`` of Build System * Added support for Silicon Labs SLSTK3401A (Pearl Gecko) and MultiTech mDot F411 ARM mbed based boards * Added support for MightyCore ATmega8535 board (`issue #585 `_) +* Added ``stlink`` as the default uploader for STM32 Discovery boards + (`issue #665 `_) * Use HTTP mirror for Package Manager in a case with SSL errors (`issue #645 `_) -* Improved firmware uploading to Arduino Leonardo based boards +* Improved firmware uploading to Arduino Leonardo/Due based boards * Fixed bug with ``env_default`` when ``pio run -e`` is used * Fixed issue with ``src_filter`` option for Windows OS (`issue #652 `_) From 0c8f4692468d685dd78a2c3996a37823376984e9 Mon Sep 17 00:00:00 2001 From: Valeriy Koval Date: Thu, 2 Jun 2016 17:27:52 +0300 Subject: [PATCH 35/39] Fix multiple definition in mbed framework when using abstract class // Issue #641, #666 --- platformio/builder/scripts/frameworks/mbed.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio/builder/scripts/frameworks/mbed.py b/platformio/builder/scripts/frameworks/mbed.py index 24b04dbe..0f6399e2 100644 --- a/platformio/builder/scripts/frameworks/mbed.py +++ b/platformio/builder/scripts/frameworks/mbed.py @@ -199,7 +199,7 @@ def get_build_flags(data): def _mbed_whole_archive_hook(libs_): if (not isinstance(libs_, list) or - env.get("BOARD_OPTIONS", {}).get("platform") != "ststm32"): + env.get("BOARD_OPTIONS", {}).get("platform") == "nordicnrf51"): return libs_ _dynlibs = [] From 3ad1ad4ef10d9885333e55571be5abf554338e23 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Thu, 2 Jun 2016 20:41:10 +0300 Subject: [PATCH 36/39] List embedded boards in docs --- docs/frameworks/arduino.rst | 2 +- docs/frameworks/cmsis.rst | 2 +- docs/frameworks/energia.rst | 2 +- docs/frameworks/libopencm3.rst | 2 +- docs/frameworks/mbed.rst | 2 +- docs/frameworks/simba.rst | 2 +- docs/frameworks/spl.rst | 2 +- docs/frameworks/wiringpi.rst | 2 +- docs/index.rst | 10 +- docs/platforms/atmelavr.rst | 2 +- docs/platforms/atmelsam.rst | 2 +- docs/platforms/creating_board.rst | 7 +- docs/platforms/creating_platform.rst | 4 +- docs/platforms/embedded_boards.rst | 2670 ++++++++++++++++++++ docs/platforms/espressif.rst | 2 +- docs/platforms/freescalekinetis.rst | 2 +- docs/platforms/index.rst | 15 +- docs/platforms/intel_arc32.rst | 2 +- docs/platforms/lattice_ice40.rst | 2 +- docs/platforms/linux_arm.rst | 2 +- docs/platforms/linux_i686.rst | 2 +- docs/platforms/linux_x86_64.rst | 2 +- docs/platforms/microchippic32.rst | 2 +- docs/platforms/native.rst | 2 +- docs/platforms/nordicnrf51.rst | 2 +- docs/platforms/nxplpc.rst | 2 +- docs/platforms/siliconlabsefm32.rst | 2 +- docs/platforms/ststm32.rst | 2 +- docs/platforms/teensy.rst | 2 +- docs/platforms/timsp430.rst | 2 +- docs/platforms/titiva.rst | 2 +- docs/platforms/windows_x86.rst | 2 +- docs/projectconf.rst | 4 +- docs/userguide/cmd_update.rst | 4 +- docs/userguide/platforms/cmd_install.rst | 5 +- docs/userguide/platforms/cmd_list.rst | 4 +- docs/userguide/platforms/cmd_search.rst | 4 +- docs/userguide/platforms/cmd_show.rst | 4 +- docs/userguide/platforms/cmd_uninstall.rst | 4 +- docs/userguide/platforms/cmd_update.rst | 4 +- scripts/docspregen.py | 63 +- 41 files changed, 2786 insertions(+), 70 deletions(-) create mode 100644 docs/platforms/embedded_boards.rst diff --git a/docs/frameworks/arduino.rst b/docs/frameworks/arduino.rst index 74b7b485..90054e71 100644 --- a/docs/frameworks/arduino.rst +++ b/docs/frameworks/arduino.rst @@ -1,4 +1,4 @@ -.. Copyright 2014-2016 Ivan Kravets +.. Copyright 2014-present Ivan Kravets 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 diff --git a/docs/frameworks/cmsis.rst b/docs/frameworks/cmsis.rst index 8a264924..7520cd94 100644 --- a/docs/frameworks/cmsis.rst +++ b/docs/frameworks/cmsis.rst @@ -1,4 +1,4 @@ -.. Copyright 2014-2016 Ivan Kravets +.. Copyright 2014-present Ivan Kravets 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 diff --git a/docs/frameworks/energia.rst b/docs/frameworks/energia.rst index 7caf06e0..4f9a2594 100644 --- a/docs/frameworks/energia.rst +++ b/docs/frameworks/energia.rst @@ -1,4 +1,4 @@ -.. Copyright 2014-2016 Ivan Kravets +.. Copyright 2014-present Ivan Kravets 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 diff --git a/docs/frameworks/libopencm3.rst b/docs/frameworks/libopencm3.rst index 1f422e82..9822bc97 100644 --- a/docs/frameworks/libopencm3.rst +++ b/docs/frameworks/libopencm3.rst @@ -1,4 +1,4 @@ -.. Copyright 2014-2016 Ivan Kravets +.. Copyright 2014-present Ivan Kravets 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 diff --git a/docs/frameworks/mbed.rst b/docs/frameworks/mbed.rst index 9aa1575b..ca428b05 100644 --- a/docs/frameworks/mbed.rst +++ b/docs/frameworks/mbed.rst @@ -1,4 +1,4 @@ -.. Copyright 2014-2016 Ivan Kravets +.. Copyright 2014-present Ivan Kravets 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 diff --git a/docs/frameworks/simba.rst b/docs/frameworks/simba.rst index e2c12f20..699e38be 100644 --- a/docs/frameworks/simba.rst +++ b/docs/frameworks/simba.rst @@ -1,4 +1,4 @@ -.. Copyright 2014-2016 Ivan Kravets +.. Copyright 2014-present Ivan Kravets 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 diff --git a/docs/frameworks/spl.rst b/docs/frameworks/spl.rst index 03316962..54fbe5e5 100644 --- a/docs/frameworks/spl.rst +++ b/docs/frameworks/spl.rst @@ -1,4 +1,4 @@ -.. Copyright 2014-2016 Ivan Kravets +.. Copyright 2014-present Ivan Kravets 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 diff --git a/docs/frameworks/wiringpi.rst b/docs/frameworks/wiringpi.rst index 46f705f3..c973dbd8 100644 --- a/docs/frameworks/wiringpi.rst +++ b/docs/frameworks/wiringpi.rst @@ -1,4 +1,4 @@ -.. Copyright 2014-2016 Ivan Kravets +.. Copyright 2014-present Ivan Kravets 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 diff --git a/docs/index.rst b/docs/index.rst index be6c83e8..f839bbd8 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,4 +1,4 @@ -.. Copyright 2014-2016 Ivan Kravets +.. Copyright 2014-present Ivan Kravets 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 @@ -57,8 +57,7 @@ Embedded Development. *Easier Than Ever.* * Cloud compiling and :ref:`ci` with *AppVeyor, Circle CI, Drone, Shippable, Travis CI* * Built-in :ref:`Serial Port Monitor ` and configurable build :ref:`-flags/-options ` -* Pre-built toolchains, :ref:`frameworks` for the - :ref:`Development Platforms ` +* Pre-built toolchains, :ref:`frameworks` for the :ref:`platforms` Smart Build System. *Fast and Reliable.* ---------------------------------------- @@ -108,8 +107,11 @@ Contents :caption: Instruments :maxdepth: 3 - Platforms & Boards + platforms/index + platforms/embedded_boards frameworks/index + platforms/creating_platform + platforms/creating_board .. toctree:: :caption: Library Manager diff --git a/docs/platforms/atmelavr.rst b/docs/platforms/atmelavr.rst index 3731e747..30f5aa76 100644 --- a/docs/platforms/atmelavr.rst +++ b/docs/platforms/atmelavr.rst @@ -1,4 +1,4 @@ -.. Copyright 2014-2016 Ivan Kravets +.. Copyright 2014-present Ivan Kravets 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 diff --git a/docs/platforms/atmelsam.rst b/docs/platforms/atmelsam.rst index 9e232616..3ff2a173 100644 --- a/docs/platforms/atmelsam.rst +++ b/docs/platforms/atmelsam.rst @@ -1,4 +1,4 @@ -.. Copyright 2014-2016 Ivan Kravets +.. Copyright 2014-present Ivan Kravets 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 diff --git a/docs/platforms/creating_board.rst b/docs/platforms/creating_board.rst index 60c6e2e5..c55b1649 100644 --- a/docs/platforms/creating_board.rst +++ b/docs/platforms/creating_board.rst @@ -1,4 +1,4 @@ -.. Copyright 2014-2016 Ivan Kravets +.. Copyright 2014-present Ivan Kravets 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 @@ -33,10 +33,9 @@ JSON Structure The key fields: -* ``build`` data will be used by :ref:`Platforms ` and - :ref:`frameworks` builders +* ``build`` data will be used by :ref:`platforms` and :ref:`frameworks` builders * ``frameworks`` is the list with supported :ref:`frameworks` -* ``platform`` main type of :ref:`Platforms ` +* ``platform`` main type of :ref:`platforms` * ``upload`` upload settings which depend on the ``platform`` .. code-block:: json diff --git a/docs/platforms/creating_platform.rst b/docs/platforms/creating_platform.rst index 1b606a40..d4e6d96a 100644 --- a/docs/platforms/creating_platform.rst +++ b/docs/platforms/creating_platform.rst @@ -1,4 +1,4 @@ -.. Copyright 2014-2016 Ivan Kravets +.. Copyright 2014-present Ivan Kravets 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 @@ -27,7 +27,7 @@ different/own build scripts, uploader and etc. .. note:: If you want to change some build flags for the existing - :ref:`Platforms `, you don't need to create (or duplicate) own + :ref:`platforms`, you don't need to create (or duplicate) own development platforms! Please use :ref:`projectconf_build_flags` option. **Step-by-Step Manual** diff --git a/docs/platforms/embedded_boards.rst b/docs/platforms/embedded_boards.rst new file mode 100644 index 00000000..440ddb8c --- /dev/null +++ b/docs/platforms/embedded_boards.rst @@ -0,0 +1,2670 @@ +.. Copyright 2014-present Ivan Kravets + 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. + +.. _embedded_boards: + +Embedded Boards +=============== + +Rapid Embedded Development, Continuous and IDE integration in a few +steps with PlatformIO thanks to built-in project generator for the most +popular embedded boards and IDE. + +* You can list pre-configured boards using :ref:`cmd_boards` command or + `PlatformIO Boards Explorer `_ +* For more detailed ``board`` information please scroll tables below by + horizontal. + +.. contents:: + +4DSystems +~~~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``picadillo_35t`` + - `4DSystems PICadillo 35T `_ + - 32MX795F512L + - 80 MHz + - 512 Kb + - 128 Kb + +96Boards +~~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``b96b_f446ve`` + - `96Boards B96B-F446VE `_ + - STM32F446VET6 + - 168 MHz + - 512 Kb + - 128 Kb + +Adafruit +~~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``bluefruitmicro`` + - `Adafruit Bluefruit Micro `_ + - ATMEGA32U4 + - 8 MHz + - 32 Kb + - 2.5 Kb + + * - ``feather32u4`` + - `Adafruit Feather `_ + - ATMEGA32U4 + - 8 MHz + - 32 Kb + - 2.5 Kb + + * - ``flora8`` + - `Adafruit Flora `_ + - ATMEGA32U4 + - 8 MHz + - 32 Kb + - 2.5 Kb + + * - ``gemma`` + - `Adafruit Gemma `_ + - ATTINY85 + - 8 MHz + - 8 Kb + - 0.5 Kb + + * - ``huzzah`` + - `Adafruit HUZZAH ESP8266 `_ + - ESP8266 + - 80 MHz + - 4096 Kb + - 80 Kb + + * - ``metro`` + - `Adafruit Metro `_ + - ATMEGA328P + - 16 MHz + - 32 Kb + - 2 Kb + + * - ``protrinket3`` + - `Adafruit Pro Trinket 3V/12MHz (USB) `_ + - ATMEGA328P + - 12 MHz + - 32 Kb + - 2 Kb + + * - ``protrinket3ftdi`` + - `Adafruit Pro Trinket 3V/12MHz (FTDI) `_ + - ATMEGA328P + - 16 MHz + - 32 Kb + - 2 Kb + + * - ``protrinket5`` + - `Adafruit Pro Trinket 5V/16MHz (USB) `_ + - ATMEGA328P + - 16 MHz + - 32 Kb + - 2 Kb + + * - ``protrinket5ftdi`` + - `Adafruit Pro Trinket 5V/16MHz (USB) `_ + - ATMEGA328P + - 16 MHz + - 32 Kb + - 2 Kb + + * - ``trinket3`` + - `Adafruit Trinket 3V/8MHz `_ + - ATTINY85 + - 8 MHz + - 8 Kb + - 0.5 Kb + + * - ``trinket5`` + - `Adafruit Trinket 5V/16MHz `_ + - ATTINY85 + - 16 MHz + - 8 Kb + - 0.5 Kb + +Arduino +~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``LilyPadUSB`` + - `Arduino LilyPad USB `_ + - ATMEGA32U4 + - 8 MHz + - 32 Kb + - 2.5 Kb + + * - ``atmegangatmega168`` + - `Arduino NG or older ATmega168 `_ + - ATMEGA168 + - 16 MHz + - 16 Kb + - 1 Kb + + * - ``atmegangatmega8`` + - `Arduino NG or older ATmega8 `_ + - ATMEGA8 + - 16 MHz + - 8 Kb + - 1 Kb + + * - ``btatmega168`` + - `Arduino BT ATmega168 `_ + - ATMEGA168 + - 16 MHz + - 16 Kb + - 1 Kb + + * - ``btatmega328`` + - `Arduino BT ATmega328 `_ + - ATMEGA328P + - 16 MHz + - 32 Kb + - 2 Kb + + * - ``chiwawa`` + - `Arduino Industrial 101 `_ + - ATMEGA32U4 + - 16 MHz + - 32 Kb + - 2.5 Kb + + * - ``diecimilaatmega168`` + - `Arduino Duemilanove or Diecimila ATmega168 `_ + - ATMEGA168 + - 16 MHz + - 16 Kb + - 1 Kb + + * - ``diecimilaatmega328`` + - `Arduino Duemilanove or Diecimila ATmega328 `_ + - ATMEGA328P + - 16 MHz + - 32 Kb + - 2 Kb + + * - ``due`` + - `Arduino Due (Programming Port) `_ + - SAM3X8E + - 84 MHz + - 512 Kb + - 32 Kb + + * - ``dueUSB`` + - `Arduino Due (USB Native Port) `_ + - SAM3X8E + - 84 MHz + - 512 Kb + - 32 Kb + + * - ``esplora`` + - `Arduino Esplora `_ + - ATMEGA32U4 + - 16 MHz + - 32 Kb + - 2.5 Kb + + * - ``ethernet`` + - `Arduino Ethernet `_ + - ATMEGA328P + - 16 MHz + - 32 Kb + - 2 Kb + + * - ``fio`` + - `Arduino Fio `_ + - ATMEGA328P + - 8 MHz + - 32 Kb + - 2 Kb + + * - ``leonardo`` + - `Arduino Leonardo `_ + - ATMEGA32U4 + - 16 MHz + - 32 Kb + - 2.5 Kb + + * - ``leonardoeth`` + - `Arduino Leonardo ETH `_ + - ATMEGA32U4 + - 16 MHz + - 32 Kb + - 2.5 Kb + + * - ``lilypadatmega168`` + - `Arduino LilyPad ATmega168 `_ + - ATMEGA168 + - 8 MHz + - 16 Kb + - 1 Kb + + * - ``lilypadatmega328`` + - `Arduino LilyPad ATmega328 `_ + - ATMEGA328P + - 8 MHz + - 32 Kb + - 2 Kb + + * - ``megaADK`` + - `Arduino Mega ADK `_ + - ATMEGA2560 + - 16 MHz + - 256 Kb + - 8 Kb + + * - ``megaatmega1280`` + - `Arduino Mega or Mega 2560 ATmega1280 `_ + - ATMEGA1280 + - 16 MHz + - 128 Kb + - 8 Kb + + * - ``megaatmega2560`` + - `Arduino Mega or Mega 2560 ATmega2560 (Mega 2560) `_ + - ATMEGA2560 + - 16 MHz + - 256 Kb + - 8 Kb + + * - ``micro`` + - `Arduino Micro `_ + - ATMEGA32U4 + - 16 MHz + - 32 Kb + - 2.5 Kb + + * - ``miniatmega168`` + - `Arduino Mini ATmega168 `_ + - ATMEGA168 + - 16 MHz + - 16 Kb + - 1 Kb + + * - ``miniatmega328`` + - `Arduino Mini ATmega328 `_ + - ATMEGA328P + - 16 MHz + - 32 Kb + - 2 Kb + + * - ``nanoatmega168`` + - `Arduino Nano ATmega168 `_ + - ATMEGA168 + - 16 MHz + - 16 Kb + - 1 Kb + + * - ``nanoatmega328`` + - `Arduino Nano ATmega328 `_ + - ATMEGA328P + - 16 MHz + - 32 Kb + - 2 Kb + + * - ``pro16MHzatmega168`` + - `Arduino Pro or Pro Mini ATmega168 (5V, 16 MHz) `_ + - ATMEGA168 + - 16 MHz + - 16 Kb + - 1 Kb + + * - ``pro16MHzatmega328`` + - `Arduino Pro or Pro Mini ATmega328 (5V, 16 MHz) `_ + - ATMEGA328P + - 16 MHz + - 32 Kb + - 2 Kb + + * - ``pro8MHzatmega168`` + - `Arduino Pro or Pro Mini ATmega168 (3.3V, 8 MHz) `_ + - ATMEGA168 + - 8 MHz + - 16 Kb + - 1 Kb + + * - ``pro8MHzatmega328`` + - `Arduino Pro or Pro Mini ATmega328 (3.3V, 8 MHz) `_ + - ATMEGA328P + - 8 MHz + - 32 Kb + - 2 Kb + + * - ``robotControl`` + - `Arduino Robot Control `_ + - ATMEGA32U4 + - 16 MHz + - 32 Kb + - 2.5 Kb + + * - ``robotMotor`` + - `Arduino Robot Motor `_ + - ATMEGA32U4 + - 16 MHz + - 32 Kb + - 2.5 Kb + + * - ``uno`` + - `Arduino Uno `_ + - ATMEGA328P + - 16 MHz + - 32 Kb + - 2 Kb + + * - ``yun`` + - `Arduino Yun `_ + - ATMEGA32U4 + - 16 MHz + - 32 Kb + - 2.5 Kb + + * - ``yunmini`` + - `Arduino Yun Mini `_ + - ATMEGA32U4 + - 16 MHz + - 32 Kb + - 2.5 Kb + + * - ``zero`` + - `Arduino Zero (Programming Port) `_ + - SAMD21G18A + - 48 MHz + - 256 Kb + - 32 Kb + + * - ``zeroUSB`` + - `Arduino Zero (USB Native Port) `_ + - SAMD21G18A + - 48 MHz + - 256 Kb + - 32 Kb + +Armstrap +~~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``armstrap_eagle1024`` + - `Armstrap Eagle 1024 `_ + - STM32F417VGT6 + - 168 MHz + - 1024 Kb + - 192 Kb + + * - ``armstrap_eagle2048`` + - `Armstrap Eagle 2048 `_ + - STM32F427VIT6 + - 168 MHz + - 2048 Kb + - 256 Kb + + * - ``armstrap_eagle512`` + - `Armstrap Eagle 512 `_ + - STM32F407VET6 + - 168 MHz + - 512 Kb + - 192 Kb + +Atmel +~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``samd21_xpro`` + - `Atmel SAMD21-XPRO `_ + - ATSAMD21J18A + - 48 MHz + - 256 Kb + - 32 Kb + + * - ``saml21_xpro_b`` + - `Atmel SAML21-XPRO-B `_ + - ATSAML21J18B + - 48 MHz + - 256 Kb + - 32 Kb + + * - ``samr21_xpro`` + - `Atmel ATSAMR21-XPRO `_ + - ATSAMR21G18A + - 48 MHz + - 256 Kb + - 32 Kb + +BBC +~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``bbcmicrobit`` + - `BBC micro:bit `_ + - NRF51822 + - 16 MHz + - 256 Kb + - 16 Kb + +BQ +~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``icezum`` + - `BQ IceZUM Alhambra FPGA `_ + - ICE40HX1K + - 12 MHz + - 32 Kb + - 32 Kb + + * - ``zumbt328`` + - `BQ ZUM BT-328 `_ + - ATMEGA328P + - 16 MHz + - 32 Kb + - 2 Kb + +BitWizard +~~~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``raspduino`` + - `BitWizard Raspduino `_ + - ATMEGA328P + - 16 MHz + - 32 Kb + - 2 Kb + +CQ Publishing +~~~~~~~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``lpc11u35_501`` + - `CQ Publishing TG-LPC11U35-501 `_ + - LPC11U35 + - 48 MHz + - 64 Kb + - 10 Kb + +Delta +~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``dfcm_nnn40`` + - `Delta DFCM-NNN40 `_ + - NRF51822 + - 32 MHz + - 256 Kb + - 32 Kb + +Digilent +~~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``cerebot32mx4`` + - `Digilent Cerebot 32MX4 `_ + - 32MX460F512L + - 80 MHz + - 512 Kb + - 32 Kb + + * - ``cerebot32mx7`` + - `Digilent Cerebot 32MX7 `_ + - 32MX795F512L + - 80 MHz + - 512 Kb + - 128 Kb + + * - ``chipkit_cmod`` + - `Digilent chipKIT Cmod `_ + - 32MX150F128D + - 40 MHz + - 128 Kb + - 32 Kb + + * - ``chipkit_dp32`` + - `Digilent chipKIT DP32 `_ + - 32MX250F128B + - 40 MHz + - 128 Kb + - 32 Kb + + * - ``chipkit_mx3`` + - `Digilent chipKIT MX3 `_ + - 32MX320F128H + - 80 MHz + - 128 Kb + - 16 Kb + + * - ``chipkit_pro_mx4`` + - `Digilent chipKIT Pro MX4 `_ + - 32MX460F512L + - 80 MHz + - 512 Kb + - 32 Kb + + * - ``chipkit_pro_mx7`` + - `Digilent chipKIT Pro MX7 `_ + - 32MX795F512L + - 80 MHz + - 512 Kb + - 128 Kb + + * - ``chipkit_uc32`` + - `Digilent chipKIT uC32 `_ + - 32MX340F512H + - 80 MHz + - 512 Kb + - 32 Kb + + * - ``chipkit_wf32`` + - `Digilent chipKIT WF32 `_ + - 32MX695F512L + - 80 MHz + - 512 Kb + - 128 Kb + + * - ``chipkit_wifire`` + - `Digilent chipKIT WiFire `_ + - 32MZ2048ECG100 + - 200 MHz + - 2048 Kb + - 512 Kb + + * - ``mega_pic32`` + - `Digilent chipKIT MAX32 `_ + - 32MX795F512L + - 80 MHz + - 512 Kb + - 128 Kb + + * - ``openscope`` + - `Digilent OpenScope `_ + - 32MZ2048EFG124 + - 200 MHz + - 2048 Kb + - 512 Kb + + * - ``uno_pic32`` + - `Digilent chipKIT UNO32 `_ + - 32MX320F128H + - 80 MHz + - 128 Kb + - 16 Kb + +Digistump +~~~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``digispark-pro`` + - `Digistump Digispark Pro (Default 16 MHz) `_ + - ATTINY167 + - 16 MHz + - 16 Kb + - 0.5 Kb + + * - ``digispark-pro32`` + - `Digistump Digispark Pro (16 MHz) (32 byte buffer) `_ + - ATTINY167 + - 16 MHz + - 16 Kb + - 0.5 Kb + + * - ``digispark-pro64`` + - `Digistump Digispark Pro (16 MHz) (64 byte buffer) `_ + - ATTINY167 + - 16 MHz + - 16 Kb + - 0.5 Kb + + * - ``digispark-tiny`` + - `Digistump Digispark (Default - 16 MHz) `_ + - ATTINY85 + - 16 MHz + - 8 Kb + - 0.5 Kb + + * - ``digix`` + - `Digistump DigiX `_ + - AT91SAM3X8E + - 84 MHz + - 512 Kb + - 28 Kb + +Doit +~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``espduino`` + - `ESPDuino (ESP-13 Module) `_ + - ESP8266 + - 80 MHz + - 4096 Kb + - 80 Kb + +ESPert +~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``espresso_lite_v1`` + - `ESPresso Lite 1.0 `_ + - ESP8266 + - 80 MHz + - 4096 Kb + - 80 Kb + + * - ``espresso_lite_v2`` + - `ESPresso Lite 2.0 `_ + - ESP8266 + - 80 MHz + - 4096 Kb + - 80 Kb + +ESPino +~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``espino`` + - `ESPino `_ + - ESP8266 + - 80 MHz + - 4096 Kb + - 80 Kb + +Embedded Artists +~~~~~~~~~~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``lpc11u35`` + - `Embedded Artists LPC11U35 QuickStart Board `_ + - LPC11U35 + - 48 MHz + - 64 Kb + - 10 Kb + + * - ``lpc4088`` + - `Embedded Artists LPC4088 QuickStart Board `_ + - LPC4088 + - 120 MHz + - 512 Kb + - 96 Kb + + * - ``lpc4088_dm`` + - `Embedded Artists LPC4088 Display Module `_ + - LPC4088 + - 120 MHz + - 512 Kb + - 96 Kb + +Engduino +~~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``engduinov1`` + - `Engduino 1 `_ + - ATMEGA32U4 + - 8 MHz + - 32 Kb + - 2.5 Kb + + * - ``engduinov2`` + - `Engduino 2 `_ + - ATMEGA32U4 + - 8 MHz + - 32 Kb + - 2.5 Kb + + * - ``engduinov3`` + - `Engduino 3 `_ + - ATMEGA32U4 + - 8 MHz + - 32 Kb + - 2.5 Kb + +Espressif +~~~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``esp01`` + - `Espressif Generic ESP8266 ESP-01 512k `_ + - ESP8266 + - 80 MHz + - 512 Kb + - 80 Kb + + * - ``esp01_1m`` + - `Espressif Generic ESP8266 ESP-01 1M `_ + - ESP8266 + - 80 MHz + - 1024 Kb + - 80 Kb + + * - ``esp07`` + - `Espressif Generic ESP8266 ESP-07 `_ + - ESP8266 + - 80 MHz + - 4096 Kb + - 80 Kb + + * - ``esp12e`` + - `Espressif ESP8266 ESP-12E `_ + - ESP8266 + - 80 MHz + - 4096 Kb + - 80 Kb + + * - ``esp_wroom_02`` + - `ESP-WROOM-02 `_ + - ESP8266 + - 80 MHz + - 4096 Kb + - 50 Kb + +Freescale +~~~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``IBMEthernetKit`` + - `Ethernet IoT Starter Kit `_ + - MK64FN1M0VLL12 + - 120 MHz + - 1024 Kb + - 256 Kb + + * - ``frdm_k20d50m`` + - `Freescale Kinetis FRDM-K20D50M `_ + - MK20DX128VLH5 + - 48 MHz + - 128 Kb + - 16 Kb + + * - ``frdm_k22f`` + - `Freescale Kinetis FRDM-K22F `_ + - MK22FN512VLH12 + - 120 MHz + - 512 Kb + - 128 Kb + + * - ``frdm_k64f`` + - `Freescale Kinetis FRDM-K64F `_ + - MK64FN1M0VLL12 + - 120 MHz + - 1024 Kb + - 256 Kb + + * - ``frdm_kl05z`` + - `Freescale Kinetis FRDM-KL05Z `_ + - MKL05Z32VFM4 + - 48 MHz + - 32 Kb + - 4 Kb + + * - ``frdm_kl25z`` + - `Freescale Kinetis FRDM-KL25Z `_ + - MKL25Z128VLK4 + - 48 MHz + - 128 Kb + - 16 Kb + + * - ``frdm_kl46z`` + - `Freescale Kinetis FRDM-KL46Z `_ + - MKL46Z256VLL4 + - 48 MHz + - 256 Kb + - 32 Kb + +Fubarino +~~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``fubarino_mini`` + - `Fubarino Mini `_ + - 32MX250F128D + - 48 MHz + - 128 Kb + - 32 Kb + + * - ``fubarino_sd`` + - `Fubarino SD (1.5) `_ + - 32MX795F512H + - 80 MHz + - 512 Kb + - 128 Kb + +Generic ATTiny +~~~~~~~~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``attiny13`` + - `Generic ATTiny13 `_ + - ATTINY13 + - 9 MHz + - 1 Kb + - 0.0625 Kb + + * - ``attiny24`` + - `Generic ATTiny24 `_ + - ATTINY24 + - 8 MHz + - 2 Kb + - 0.125 Kb + + * - ``attiny25`` + - `Generic ATTiny25 `_ + - ATTINY25 + - 8 MHz + - 2 Kb + - 0.125 Kb + + * - ``attiny44`` + - `Generic ATTiny44 `_ + - ATTINY44 + - 8 MHz + - 4 Kb + - 0.25 Kb + + * - ``attiny45`` + - `Generic ATTiny45 `_ + - ATTINY45 + - 8 MHz + - 4 Kb + - 0.25 Kb + + * - ``attiny84`` + - `Generic ATTiny84 `_ + - ATTINY84 + - 8 MHz + - 8 Kb + - 0.5 Kb + + * - ``attiny85`` + - `Generic ATTiny85 `_ + - ATTINY85 + - 8 MHz + - 8 Kb + - 0.5 Kb + +Intel +~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``genuino101`` + - `Arduino/Genuino 101 `_ + - ARCV2EM + - 32 MHz + - 192 Kb + - 80 Kb + +JKSoft +~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``wallBotBLE`` + - `JKSoft Wallbot BLE `_ + - NRF51822 + - 16 MHz + - 128 Kb + - 16 Kb + +Lattice +~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``icestick`` + - `Lattice iCEstick FPGA Evaluation Kit `_ + - ICE40HX1K + - 12 MHz + - 32 Kb + - 32 Kb + +LightUp +~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``lightup`` + - `LightUp `_ + - ATMEGA32U4 + - 8 MHz + - 32 Kb + - 2.5 Kb + +Linino +~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``one`` + - `Linino One `_ + - ATMEGA32U4 + - 16 MHz + - 32 Kb + - 2.5 Kb + +LowPowerLab +~~~~~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``moteino`` + - `LowPowerLab Moteino `_ + - ATMEGA328P + - 16 MHz + - 32 Kb + - 2 Kb + + * - ``moteinomega`` + - `LowPowerLab MoteinoMEGA `_ + - ATMEGA1284P + - 16 MHz + - 128 Kb + - 16 Kb + +Mcudude +~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``mightycore1284`` + - `MightyCore ATmega1284 `_ + - ATMEGA1284P + - 16 MHz + - 128 Kb + - 16 Kb + + * - ``mightycore16`` + - `MightyCore ATmega16 `_ + - ATMEGA16 + - 16 MHz + - 16 Kb + - 1 Kb + + * - ``mightycore164`` + - `MightyCore ATmega164 `_ + - ATMEGA164P + - 16 MHz + - 16 Kb + - 1 Kb + + * - ``mightycore32`` + - `MightyCore ATmega32 `_ + - ATMEGA32 + - 16 MHz + - 32 Kb + - 2 Kb + + * - ``mightycore324`` + - `MightyCore ATmega324 `_ + - ATMEGA324P + - 16 MHz + - 32 Kb + - 2 Kb + + * - ``mightycore644`` + - `MightyCore ATmega644 `_ + - ATMEGA644P + - 16 MHz + - 64 Kb + - 4 Kb + + * - ``mightycore8535`` + - `MightyCore ATmega8535 `_ + - ATMEGA16 + - 16 MHz + - 8 Kb + - 0.5 Kb + +Microduino +~~~~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``1284p16m`` + - `Microduino Core+ (ATmega1284P@16M,5V) `_ + - ATMEGA1284P + - 16 MHz + - 128 Kb + - 16 Kb + + * - ``1284p8m`` + - `Microduino Core+ (ATmega1284P@8M,3.3V) `_ + - ATMEGA1284P + - 8 MHz + - 128 Kb + - 16 Kb + + * - ``168pa16m`` + - `Microduino Core (Atmega168PA@16M,5V) `_ + - ATMEGA168P + - 16 MHz + - 16 Kb + - 1 Kb + + * - ``168pa8m`` + - `Microduino Core (Atmega168PA@8M,3.3V) `_ + - ATMEGA168P + - 8 MHz + - 16 Kb + - 1 Kb + + * - ``328p16m`` + - `Microduino Core (Atmega328P@16M,5V) `_ + - ATMEGA328P + - 16 MHz + - 32 Kb + - 2 Kb + + * - ``328p8m`` + - `Microduino Core (Atmega328P@8M,3.3V) `_ + - ATMEGA328P + - 8 MHz + - 32 Kb + - 2 Kb + + * - ``32u416m`` + - `Microduino Core USB (ATmega32U4@16M,5V) `_ + - ATMEGA32U4 + - 16 MHz + - 32 Kb + - 2.5 Kb + + * - ``644pa16m`` + - `Microduino Core+ (Atmega644PA@16M,5V) `_ + - ATMEGA644P + - 16 MHz + - 64 Kb + - 4 Kb + + * - ``644pa8m`` + - `Microduino Core+ (Atmega644PA@8M,3.3V) `_ + - ATMEGA644P + - 8 MHz + - 64 Kb + - 4 Kb + +MultiTech +~~~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``mts_mdot_f411re`` + - `MultiTech mDot F411 `_ + - STM32F411RET6 + - 100 MHz + - 512 Kb + - 128 Kb + +NGX Technologies +~~~~~~~~~~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``blueboard_lpc11u24`` + - `NGX Technologies BlueBoard-LPC11U24 `_ + - LPC11U24 + - 48 MHz + - 32 Kb + - 8 Kb + +NXP +~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``lpc11u24`` + - `NXP mbed LPC11U24 `_ + - LPC11U24 + - 48 MHz + - 32 Kb + - 8 Kb + + * - ``lpc1549`` + - `NXP LPCXpresso1549 `_ + - LPC1549 + - 72 MHz + - 256 Kb + - 36 Kb + + * - ``lpc1768`` + - `NXP mbed LPC1768 `_ + - LPC1768 + - 96 MHz + - 512 Kb + - 64 Kb + +NodeMCU +~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``nodemcu`` + - `NodeMCU 0.9 (ESP-12 Module) `_ + - ESP8266 + - 80 MHz + - 4096 Kb + - 80 Kb + + * - ``nodemcuv2`` + - `NodeMCU 1.0 (ESP-12E Module) `_ + - ESP8266 + - 80 MHz + - 4096 Kb + - 80 Kb + +Nordic +~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``nrf51_dk`` + - `Nordic nRF51-DK `_ + - NRF51822 + - 32 MHz + - 256 Kb + - 32 Kb + + * - ``nrf51_dongle`` + - `Nordic nRF51-Dongle `_ + - NRF51822 + - 32 MHz + - 256 Kb + - 32 Kb + + * - ``nrf51_mkit`` + - `Nordic nRF51822-mKIT `_ + - NRF51822 + - 16 MHz + - 128 Kb + - 16 Kb + +Olimex +~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``modwifi`` + - `Olimex MOD-WIFI-ESP8266(-DEV) `_ + - ESP8266 + - 80 MHz + - 2048 Kb + - 80 Kb + + * - ``pinguino32`` + - `Olimex PIC32-PINGUINO `_ + - 32MX440F256H + - 80 MHz + - 256 Kb + - 32 Kb + +OpenBCI +~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``openbci`` + - `OpenBCI 32bit `_ + - 32MX250F128B + - 40 MHz + - 128 Kb + - 32 Kb + +Outrageous Circuits +~~~~~~~~~~~~~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``mbuino`` + - `Outrageous Circuits mBuino `_ + - LPC11U24 + - 48 MHz + - 32 Kb + - 8 Kb + +PONTECH +~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``quick240_usb`` + - `PONTECH quicK240 `_ + - 32MX795F512L + - 80 MHz + - 512 Kb + - 128 Kb + + * - ``usbono_pic32`` + - `PONTECH UAV100 `_ + - 32MX440F512H + - 80 MHz + - 512 Kb + - 32 Kb + +PanStamp +~~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``panStampAVR`` + - `PanStamp AVR `_ + - ATMEGA328P + - 8 MHz + - 32 Kb + - 2 Kb + + * - ``panStampNRG`` + - `PanStamp NRG 1.1 `_ + - CC430F5137 + - 12 MHz + - 32 Kb + - 4 Kb + +Punch Through +~~~~~~~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``lightblue-bean`` + - `LightBlue Bean `_ + - ATMEGA328P + - 8 MHz + - 32 Kb + - 2 Kb + +Quirkbot +~~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``quirkbot`` + - `Quirkbot `_ + - ATMEGA32U4 + - 8 MHz + - 32 Kb + - 2.5 Kb + +RFduino +~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``rfduino`` + - `RFduino `_ + - NRF51822 + - 16 MHz + - 128 Kb + - 8 Kb + +Raspberry Pi +~~~~~~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``raspberrypi_1b`` + - `Raspberry Pi 1 Model B `_ + - BCM2835 + - 700 MHz + - 524288 Kb + - 524288 Kb + + * - ``raspberrypi_2b`` + - `Raspberry Pi 2 Model B `_ + - BCM2836 + - 900 MHz + - 1048576 Kb + - 1048576 Kb + + * - ``raspberrypi_zero`` + - `Raspberry Pi Zero `_ + - BCM2835 + - 1000 MHz + - 524288 Kb + - 524288 Kb + +RedBearLab +~~~~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``blend`` + - `RedBearLab Blend `_ + - ATMEGA32U4 + - 16 MHz + - 32 Kb + - 2.5 Kb + + * - ``blendmicro16`` + - `RedBearLab Blend Micro 3.3V/16MHz (overclock) `_ + - ATMEGA32U4 + - 16 MHz + - 32 Kb + - 2.5 Kb + + * - ``blendmicro8`` + - `RedBearLab Blend Micro 3.3V/8MHz `_ + - ATMEGA32U4 + - 8 MHz + - 32 Kb + - 2.5 Kb + + * - ``redBearLab`` + - `RedBearLab nRF51822 `_ + - NRF51822 + - 16 MHz + - 256 Kb + - 16 Kb + + * - ``redBearLabBLENano`` + - `RedBearLab BLE Nano `_ + - NRF51822 + - 16 MHz + - 256 Kb + - 16 Kb + +RepRap +~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``reprap_rambo`` + - `RepRap RAMBo `_ + - ATMEGA2560 + - 16 MHz + - 256 Kb + - 8 Kb + +ST +~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``disco_f051r8`` + - `ST STM32F0DISCOVERY `_ + - STM32F051R8T6 + - 48 MHz + - 64 Kb + - 8 Kb + + * - ``disco_f100rb`` + - `ST STM32VLDISCOVERY `_ + - STM32F100RBT6 + - 24 MHz + - 128 Kb + - 8 Kb + + * - ``disco_f303vc`` + - `ST STM32F3DISCOVERY `_ + - STM32F303VCT6 + - 72 MHz + - 256 Kb + - 48 Kb + + * - ``disco_f334c8`` + - `ST 32F3348DISCOVERY `_ + - STM32F334C8T6 + - 72 MHz + - 64 Kb + - 12 Kb + + * - ``disco_f401vc`` + - `ST 32F401CDISCOVERY `_ + - STM32F401VCT6 + - 84 MHz + - 256 Kb + - 64 Kb + + * - ``disco_f407vg`` + - `ST STM32F4DISCOVERY `_ + - STM32F407VGT6 + - 168 MHz + - 1024 Kb + - 128 Kb + + * - ``disco_f429zi`` + - `ST 32F429IDISCOVERY `_ + - STM32F429ZIT6 + - 180 MHz + - 2048 Kb + - 256 Kb + + * - ``disco_f469ni`` + - `ST 32F469IDISCOVERY `_ + - STM32F469NIH6 + - 180 MHz + - 1024 Kb + - 384 Kb + + * - ``disco_l053c8`` + - `ST 32L0538DISCOVERY `_ + - STM32L053C8T6 + - 32 MHz + - 64 Kb + - 8 Kb + + * - ``disco_l152rb`` + - `ST STM32LDISCOVERY `_ + - STM32L152RBT6 + - 32 MHz + - 128 Kb + - 16 Kb + + * - ``disco_l476vg`` + - `ST 32L476GDISCOVERY `_ + - STM32L476VGT6 + - 80 MHz + - 1024 Kb + - 128 Kb + + * - ``nucleo_f030r8`` + - `ST Nucleo F030R8 `_ + - STM32F030R8T6 + - 48 MHz + - 64 Kb + - 8 Kb + + * - ``nucleo_f031k6`` + - `ST Nucleo F031K6 `_ + - STM32F031K6T6 + - 48 MHz + - 32 Kb + - 4 Kb + + * - ``nucleo_f042k6`` + - `ST Nucleo F042K6 `_ + - STM32F042K6T6 + - 48 MHz + - 32 Kb + - 6 Kb + + * - ``nucleo_f070rb`` + - `ST Nucleo F070RB `_ + - STM32F070RBT6 + - 48 MHz + - 128 Kb + - 16 Kb + + * - ``nucleo_f072rb`` + - `ST Nucleo F072RB `_ + - STM32F072RBT6 + - 48 MHz + - 128 Kb + - 16 Kb + + * - ``nucleo_f091rc`` + - `ST Nucleo F091RC `_ + - STM32F091RCT6 + - 48 MHz + - 256 Kb + - 32 Kb + + * - ``nucleo_f103rb`` + - `ST Nucleo F103RB `_ + - STM32F103RBT6 + - 72 MHz + - 128 Kb + - 20 Kb + + * - ``nucleo_f302r8`` + - `ST Nucleo F302R8 `_ + - STM32F302R8T6 + - 72 MHz + - 64 Kb + - 16 Kb + + * - ``nucleo_f303k8`` + - `ST Nucleo F303K8 `_ + - STM32F303K8T6 + - 72 MHz + - 64 Kb + - 16 Kb + + * - ``nucleo_f303re`` + - `ST Nucleo F303RE `_ + - STM32F303RET6 + - 72 MHz + - 512 Kb + - 64 Kb + + * - ``nucleo_f334r8`` + - `ST Nucleo F334R8 `_ + - STM32F334R8T6 + - 72 MHz + - 64 Kb + - 16 Kb + + * - ``nucleo_f401re`` + - `ST Nucleo F401RE `_ + - STM32F401RET6 + - 84 MHz + - 512 Kb + - 96 Kb + + * - ``nucleo_f410rb`` + - `ST Nucleo F410RB `_ + - STM32F410RBT6 + - 100 MHz + - 128 Kb + - 32 Kb + + * - ``nucleo_f411re`` + - `ST Nucleo F411RE `_ + - STM32F411RET6 + - 100 MHz + - 512 Kb + - 128 Kb + + * - ``nucleo_f446re`` + - `ST Nucleo F446RE `_ + - STM32F446RET6 + - 180 MHz + - 512 Kb + - 128 Kb + + * - ``nucleo_l053r8`` + - `ST Nucleo L053R8 `_ + - STM32L053R8T6 + - 48 MHz + - 64 Kb + - 8 Kb + + * - ``nucleo_l073rz`` + - `ST Nucleo L073RZ `_ + - STM32L073RZ + - 32 MHz + - 192 Kb + - 20 Kb + + * - ``nucleo_l152re`` + - `ST Nucleo L152RE `_ + - STM32L152RET6 + - 32 MHz + - 512 Kb + - 80 Kb + + * - ``nucleo_l476rg`` + - `ST Nucleo L476RG `_ + - STM32L476RGT6 + - 80 MHz + - 1024 Kb + - 128 Kb + +SainSmart +~~~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``sainSmartDue`` + - `SainSmart Due (Programming Port) `_ + - AT91SAM3X8E + - 84 MHz + - 512 Kb + - 32 Kb + + * - ``sainSmartDueUSB`` + - `SainSmart Due (USB Native Port) `_ + - AT91SAM3X8E + - 84 MHz + - 512 Kb + - 32 Kb + +Sanguino +~~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``sanguino_atmega1284_8m`` + - `Sanguino ATmega1284p (8MHz) `_ + - ATMEGA1284P + - 8 MHz + - 128 Kb + - 16 Kb + + * - ``sanguino_atmega1284p`` + - `Sanguino ATmega1284p (16MHz) `_ + - ATMEGA1284P + - 16 MHz + - 128 Kb + - 16 Kb + + * - ``sanguino_atmega644`` + - `Sanguino ATmega644 or ATmega644A (16 MHz) `_ + - ATMEGA644 + - 16 MHz + - 64 Kb + - 4 Kb + + * - ``sanguino_atmega644_8m`` + - `Sanguino ATmega644 or ATmega644A (8 MHz) `_ + - ATMEGA644 + - 8 MHz + - 64 Kb + - 4 Kb + + * - ``sanguino_atmega644p`` + - `Sanguino ATmega644P or ATmega644PA (16 MHz) `_ + - ATMEGA644P + - 16 MHz + - 64 Kb + - 4 Kb + + * - ``sanguino_atmega644p_8m`` + - `Sanguino ATmega644P or ATmega644PA (8 MHz) `_ + - ATMEGA644P + - 8 MHz + - 64 Kb + - 4 Kb + +SeeedStudio +~~~~~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``cui32stem`` + - `SeeedStudio CUI32stem `_ + - 32MX795F512H + - 80 MHz + - 512 Kb + - 128 Kb + + * - ``seeedArchMax`` + - `SeeedStudio Arch Max `_ + - STM32F407VET6 + - 168 MHz + - 512 Kb + - 192 Kb + + * - ``seeedTinyBLE`` + - `SeeedStudio Seeed Tiny BLE `_ + - NRF51822 + - 16 MHz + - 256 Kb + - 16 Kb + + * - ``seeeduinoArchPro`` + - `SeeedStudio Seeeduino-Arch-Pro `_ + - LPC1768 + - 96 MHz + - 512 Kb + - 64 Kb + +Silicon Labs +~~~~~~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``efm32gg_stk3700`` + - `Silicon Labs EFM32GG-STK3700 (Giant Gecko) `_ + - EFM32GG990F1024 + - 48 MHz + - 1024 Kb + - 128 Kb + + * - ``efm32hg_stk3400`` + - `Silicon Labs SLSTK3400A USB-enabled (Happy Gecko) `_ + - EFM32HG322F64 + - 24 MHz + - 64 Kb + - 8 Kb + + * - ``efm32lg_stk3600`` + - `Silicon Labs EFM32LG-STK3600 (Leopard Gecko) `_ + - EFM32LG990F256 + - 48 MHz + - 256 Kb + - 32 Kb + + * - ``efm32pg_stk3401`` + - `Silicon Labs SLSTK3401A (Pearl Gecko) `_ + - EFM32PG1B200F256 + - 40 MHz + - 256 Kb + - 32 Kb + + * - ``efm32wg_stk3800`` + - `Silicon Labs EFM32WG-STK3800 (Wonder Gecko) `_ + - EFM32WG990F256 + - 48 MHz + - 256 Kb + - 32 Kb + + * - ``efm32zg_stk3200`` + - `Silicon Labs EFM32ZG-STK3200 (Zero Gecko) `_ + - EFM2ZG222F32 + - 24 MHz + - 32 Kb + - 4 Kb + +Solder Splash Labs +~~~~~~~~~~~~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``dipcortexm0`` + - `Solder Splash Labs DipCortex M0 `_ + - LPC11U24 + - 50 MHz + - 32 Kb + - 8 Kb + +SparkFun +~~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``sparkfun_digitalsandbox`` + - `SparkFun Digital Sandbox `_ + - ATMEGA328P + - 16 MHz + - 32 Kb + - 2 Kb + + * - ``sparkfun_fiov3`` + - `SparkFun Fio V3 3.3V/8MHz `_ + - ATMEGA32U4 + - 8 MHz + - 32 Kb + - 2.5 Kb + + * - ``sparkfun_makeymakey`` + - `SparkFun Makey Makey `_ + - ATMEGA32U4 + - 16 MHz + - 32 Kb + - 2.5 Kb + + * - ``sparkfun_megamini`` + - `SparkFun Mega Pro Mini 3.3V `_ + - ATMEGA2560 + - 8 MHz + - 256 Kb + - 8 Kb + + * - ``sparkfun_megapro16MHz`` + - `SparkFun Mega Pro 5V/16MHz `_ + - ATMEGA2560 + - 16 MHz + - 256 Kb + - 8 Kb + + * - ``sparkfun_megapro8MHz`` + - `SparkFun Mega Pro 3.3V/8MHz `_ + - ATMEGA2560 + - 8 MHz + - 256 Kb + - 8 Kb + + * - ``sparkfun_promicro16`` + - `SparkFun Pro Micro 5V/16MHz `_ + - ATMEGA32U4 + - 16 MHz + - 32 Kb + - 2.5 Kb + + * - ``sparkfun_promicro8`` + - `SparkFun Pro Micro 3.3V/8MHz `_ + - ATMEGA32U4 + - 8 MHz + - 32 Kb + - 2.5 Kb + + * - ``sparkfun_redboard`` + - `SparkFun RedBoard `_ + - ATMEGA328P + - 16 MHz + - 32 Kb + - 2 Kb + + * - ``thing`` + - `SparkFun ESP8266 Thing `_ + - ESP8266 + - 80 MHz + - 512 Kb + - 80 Kb + + * - ``thingdev`` + - `SparkFun ESP8266 Thing Dev `_ + - ESP8266 + - 80 MHz + - 512 Kb + - 80 Kb + + * - ``uview`` + - `SparkFun MicroView `_ + - ATMEGA328P + - 16 MHz + - 32 Kb + - 2 Kb + +SweetPea +~~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``esp210`` + - `SweetPea ESP-210 `_ + - ESP8266 + - 80 MHz + - 4096 Kb + - 80 Kb + +Switch Science +~~~~~~~~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``hrm1017`` + - `Switch Science mbed HRM1017 `_ + - NRF51822 + - 16 MHz + - 256 Kb + - 16 Kb + + * - ``lpc1114fn28`` + - `Switch Science mbed LPC1114FN28 `_ + - LPC1114FN28 + - 48 MHz + - 32 Kb + - 4 Kb + +TI +~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``lplm4f120h5qr`` + - `TI LaunchPad (Stellaris) w/ lm4f120 (80MHz) `_ + - LPLM4F120H5QR + - 80 MHz + - 256 Kb + - 32 Kb + + * - ``lpmsp430f5529`` + - `TI LaunchPad w/ msp430f5529 (16MHz) `_ + - MSP430F5529 + - 16 MHz + - 128 Kb + - 1 Kb + + * - ``lpmsp430f5529_25`` + - `TI LaunchPad w/ msp430f5529 (25MHz) `_ + - MSP430F5529 + - 25 MHz + - 128 Kb + - 1 Kb + + * - ``lpmsp430fr4133`` + - `TI LaunchPad w/ msp430fr4133 `_ + - MSP430FR4133 + - 16 MHz + - 16 Kb + - 2 Kb + + * - ``lpmsp430fr5739`` + - `TI FraunchPad w/ msp430fr5739 `_ + - MSP430FR5739 + - 16 MHz + - 16 Kb + - 1 Kb + + * - ``lpmsp430fr5969`` + - `TI LaunchPad w/ msp430fr5969 `_ + - MSP430FR5969 + - 8 MHz + - 64 Kb + - 1 Kb + + * - ``lpmsp430fr6989`` + - `TI LaunchPad w/ msp430fr6989 `_ + - MSP430FR6989 + - 16 MHz + - 128 Kb + - 2 Kb + + * - ``lpmsp430g2231`` + - `TI LaunchPad w/ msp430g2231 (1 MHz) `_ + - MSP430G2231 + - 1 MHz + - 2 Kb + - 0.125 Kb + + * - ``lpmsp430g2452`` + - `TI LaunchPad w/ msp430g2452 (16MHz) `_ + - MSP430G2452 + - 16 MHz + - 8 Kb + - 0.25 Kb + + * - ``lpmsp430g2553`` + - `TI LaunchPad w/ msp430g2553 (16MHz) `_ + - MSP430G2553 + - 16 MHz + - 16 Kb + - 0.5 Kb + + * - ``lptm4c1230c3pm`` + - `TI LaunchPad (Tiva C) w/ tm4c123 (80MHz) `_ + - LPTM4C1230C3PM + - 80 MHz + - 256 Kb + - 32 Kb + + * - ``lptm4c1294ncpdt`` + - `TI LaunchPad (Tiva C) w/ tm4c129 (120MHz) `_ + - LPTM4C1294NCPDT + - 120 MHz + - 1024 Kb + - 256 Kb + +Teensy +~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``teensy20`` + - `Teensy 2.0 `_ + - ATMEGA32U4 + - 16 MHz + - 32 Kb + - 2.5 Kb + + * - ``teensy20pp`` + - `Teensy++ 2.0 `_ + - AT90USB1286 + - 16 MHz + - 128 Kb + - 8 Kb + + * - ``teensy30`` + - `Teensy 3.0 `_ + - MK20DX128 + - 48 MHz + - 128 Kb + - 16 Kb + + * - ``teensy31`` + - `Teensy 3.1 / 3.2 `_ + - MK20DX256 + - 72 MHz + - 256 Kb + - 64 Kb + + * - ``teensylc`` + - `Teensy LC `_ + - MKL26Z64 + - 48 MHz + - 64 Kb + - 8 Kb + +ThaiEasyElec +~~~~~~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``espinotee`` + - `ThaiEasyElec ESPino `_ + - ESP8266 + - 80 MHz + - 4096 Kb + - 80 Kb + +TinyCircuits +~~~~~~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``tinyduino`` + - `TinyCircuits TinyDuino Processor Board `_ + - ATMEGA328P + - 8 MHz + - 32 Kb + - 2 Kb + + * - ``tinylily`` + - `TinyCircuits TinyLily Mini Processor `_ + - ATMEGA328P + - 8 MHz + - 32 Kb + - 2 Kb + +UBW32 +~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``ubw32_mx460`` + - `UBW32 MX460 `_ + - 32MX460F512L + - 80 MHz + - 512 Kb + - 32 Kb + + * - ``ubw32_mx795`` + - `UBW32 MX795 `_ + - 32MX795F512L + - 80 MHz + - 512 Kb + - 128 Kb + +WeMos +~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``d1`` + - `WeMos D1(Retired) `_ + - ESP8266 + - 80 MHz + - 4096 Kb + - 80 Kb + + * - ``d1_mini`` + - `WeMos D1 R2 & mini `_ + - ESP8266 + - 80 MHz + - 4096 Kb + - 80 Kb + +Wicked Device +~~~~~~~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``wildfirev2`` + - `Wicked Device WildFire V2 `_ + - ATMEGA1284P + - 16 MHz + - 128 Kb + - 16 Kb + + * - ``wildfirev3`` + - `Wicked Device WildFire V3 `_ + - ATMEGA1284P + - 16 MHz + - 128 Kb + - 16 Kb + +element14 +~~~~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``chipkit_pi`` + - `Element14 chipKIT Pi `_ + - 32MX250F128B + - 40 MHz + - 128 Kb + - 32 Kb + +u-blox +~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``ubloxc027`` + - `u-blox C027 `_ + - LPC1768 + - 96 MHz + - 512 Kb + - 64 Kb + +ubIQio +~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``ardhat`` + - `ubIQio Ardhat `_ + - ATMEGA328P + - 16 MHz + - 32 Kb + - 2 Kb diff --git a/docs/platforms/espressif.rst b/docs/platforms/espressif.rst index d14329d3..f8333846 100644 --- a/docs/platforms/espressif.rst +++ b/docs/platforms/espressif.rst @@ -1,4 +1,4 @@ -.. Copyright 2014-2016 Ivan Kravets +.. Copyright 2014-present Ivan Kravets 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 diff --git a/docs/platforms/freescalekinetis.rst b/docs/platforms/freescalekinetis.rst index 0e26057c..13e60daf 100644 --- a/docs/platforms/freescalekinetis.rst +++ b/docs/platforms/freescalekinetis.rst @@ -1,4 +1,4 @@ -.. Copyright 2014-2016 Ivan Kravets +.. Copyright 2014-present Ivan Kravets 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 diff --git a/docs/platforms/index.rst b/docs/platforms/index.rst index 01b6df47..f7f68146 100644 --- a/docs/platforms/index.rst +++ b/docs/platforms/index.rst @@ -1,4 +1,4 @@ -.. Copyright 2014-2016 Ivan Kravets +.. Copyright 2014-present Ivan Kravets 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 @@ -11,8 +11,8 @@ .. _platforms: -Platforms & Embedded Boards -=========================== +Development Platforms +===================== *PlatformIO* has pre-built different development platforms for popular OS (*Mac OS X, Linux (+ARM) and Windows*). Each of them include compiler, @@ -54,12 +54,3 @@ Desktop linux_i686 linux_x86_64 windows_x86 - -Custom Platform & Board ------------------------ - -.. toctree:: - :maxdepth: 2 - - creating_platform - creating_board diff --git a/docs/platforms/intel_arc32.rst b/docs/platforms/intel_arc32.rst index 1ff6ea57..c4863e5c 100644 --- a/docs/platforms/intel_arc32.rst +++ b/docs/platforms/intel_arc32.rst @@ -1,4 +1,4 @@ -.. Copyright 2014-2016 Ivan Kravets +.. Copyright 2014-present Ivan Kravets 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 diff --git a/docs/platforms/lattice_ice40.rst b/docs/platforms/lattice_ice40.rst index b21d8bbd..4a836ed3 100644 --- a/docs/platforms/lattice_ice40.rst +++ b/docs/platforms/lattice_ice40.rst @@ -1,4 +1,4 @@ -.. Copyright 2014-2016 Ivan Kravets +.. Copyright 2014-present Ivan Kravets 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 diff --git a/docs/platforms/linux_arm.rst b/docs/platforms/linux_arm.rst index 821a60f6..56783765 100644 --- a/docs/platforms/linux_arm.rst +++ b/docs/platforms/linux_arm.rst @@ -1,4 +1,4 @@ -.. Copyright 2014-2016 Ivan Kravets +.. Copyright 2014-present Ivan Kravets 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 diff --git a/docs/platforms/linux_i686.rst b/docs/platforms/linux_i686.rst index eab273a7..583ad151 100644 --- a/docs/platforms/linux_i686.rst +++ b/docs/platforms/linux_i686.rst @@ -1,4 +1,4 @@ -.. Copyright 2014-2016 Ivan Kravets +.. Copyright 2014-present Ivan Kravets 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 diff --git a/docs/platforms/linux_x86_64.rst b/docs/platforms/linux_x86_64.rst index c368a17d..d770b2e8 100644 --- a/docs/platforms/linux_x86_64.rst +++ b/docs/platforms/linux_x86_64.rst @@ -1,4 +1,4 @@ -.. Copyright 2014-2016 Ivan Kravets +.. Copyright 2014-present Ivan Kravets 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 diff --git a/docs/platforms/microchippic32.rst b/docs/platforms/microchippic32.rst index 5e6a6bfe..7f38d2bb 100644 --- a/docs/platforms/microchippic32.rst +++ b/docs/platforms/microchippic32.rst @@ -1,4 +1,4 @@ -.. Copyright 2014-2016 Ivan Kravets +.. Copyright 2014-present Ivan Kravets 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 diff --git a/docs/platforms/native.rst b/docs/platforms/native.rst index 74d1afd5..68fd805b 100644 --- a/docs/platforms/native.rst +++ b/docs/platforms/native.rst @@ -1,4 +1,4 @@ -.. Copyright 2014-2016 Ivan Kravets +.. Copyright 2014-present Ivan Kravets 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 diff --git a/docs/platforms/nordicnrf51.rst b/docs/platforms/nordicnrf51.rst index fa5c307f..4c4d65fe 100644 --- a/docs/platforms/nordicnrf51.rst +++ b/docs/platforms/nordicnrf51.rst @@ -1,4 +1,4 @@ -.. Copyright 2014-2016 Ivan Kravets +.. Copyright 2014-present Ivan Kravets 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 diff --git a/docs/platforms/nxplpc.rst b/docs/platforms/nxplpc.rst index 129213df..2c94410f 100644 --- a/docs/platforms/nxplpc.rst +++ b/docs/platforms/nxplpc.rst @@ -1,4 +1,4 @@ -.. Copyright 2014-2016 Ivan Kravets +.. Copyright 2014-present Ivan Kravets 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 diff --git a/docs/platforms/siliconlabsefm32.rst b/docs/platforms/siliconlabsefm32.rst index d08cca92..c4829f08 100644 --- a/docs/platforms/siliconlabsefm32.rst +++ b/docs/platforms/siliconlabsefm32.rst @@ -1,4 +1,4 @@ -.. Copyright 2014-2016 Ivan Kravets +.. Copyright 2014-present Ivan Kravets 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 diff --git a/docs/platforms/ststm32.rst b/docs/platforms/ststm32.rst index 0f900362..789d0b6f 100644 --- a/docs/platforms/ststm32.rst +++ b/docs/platforms/ststm32.rst @@ -1,4 +1,4 @@ -.. Copyright 2014-2016 Ivan Kravets +.. Copyright 2014-present Ivan Kravets 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 diff --git a/docs/platforms/teensy.rst b/docs/platforms/teensy.rst index 487e8920..0edcbcd2 100644 --- a/docs/platforms/teensy.rst +++ b/docs/platforms/teensy.rst @@ -1,4 +1,4 @@ -.. Copyright 2014-2016 Ivan Kravets +.. Copyright 2014-present Ivan Kravets 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 diff --git a/docs/platforms/timsp430.rst b/docs/platforms/timsp430.rst index 8b444792..28b25393 100644 --- a/docs/platforms/timsp430.rst +++ b/docs/platforms/timsp430.rst @@ -1,4 +1,4 @@ -.. Copyright 2014-2016 Ivan Kravets +.. Copyright 2014-present Ivan Kravets 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 diff --git a/docs/platforms/titiva.rst b/docs/platforms/titiva.rst index eefbdbed..bf4d6288 100644 --- a/docs/platforms/titiva.rst +++ b/docs/platforms/titiva.rst @@ -1,4 +1,4 @@ -.. Copyright 2014-2016 Ivan Kravets +.. Copyright 2014-present Ivan Kravets 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 diff --git a/docs/platforms/windows_x86.rst b/docs/platforms/windows_x86.rst index 3836a807..6f904a0b 100644 --- a/docs/platforms/windows_x86.rst +++ b/docs/platforms/windows_x86.rst @@ -1,4 +1,4 @@ -.. Copyright 2014-2016 Ivan Kravets +.. Copyright 2014-present Ivan Kravets 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 diff --git a/docs/projectconf.rst b/docs/projectconf.rst index 6ca71ca4..5274ccb4 100644 --- a/docs/projectconf.rst +++ b/docs/projectconf.rst @@ -1,4 +1,4 @@ -.. Copyright 2014-2016 Ivan Kravets +.. Copyright 2014-present Ivan Kravets 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 @@ -194,7 +194,7 @@ General options ``platform`` ^^^^^^^^^^^^ -:ref:`Platform ` type. +:ref:`platforms` type. .. _projectconf_env_framework: diff --git a/docs/userguide/cmd_update.rst b/docs/userguide/cmd_update.rst index 22a65099..d429bb0d 100644 --- a/docs/userguide/cmd_update.rst +++ b/docs/userguide/cmd_update.rst @@ -1,4 +1,4 @@ -.. Copyright 2014-2016 Ivan Kravets +.. Copyright 2014-present Ivan Kravets 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 @@ -27,7 +27,7 @@ Usage Description ----------- -Check or update installed :ref:`Platforms ` and +Check or update installed :ref:`platforms` and :ref:`Libraries ` diff --git a/docs/userguide/platforms/cmd_install.rst b/docs/userguide/platforms/cmd_install.rst index fc36d9ed..03008881 100644 --- a/docs/userguide/platforms/cmd_install.rst +++ b/docs/userguide/platforms/cmd_install.rst @@ -1,4 +1,4 @@ -.. Copyright 2014-2016 Ivan Kravets +.. Copyright 2014-present Ivan Kravets 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 @@ -27,8 +27,7 @@ Usage Description ----------- -Install pre-built development :ref:`Platforms ` with related -packages. +Install pre-built development :ref:`platforms` with related packages. There are several predefined aliases for packages, such as: diff --git a/docs/userguide/platforms/cmd_list.rst b/docs/userguide/platforms/cmd_list.rst index b1b9bb2d..ebc72141 100644 --- a/docs/userguide/platforms/cmd_list.rst +++ b/docs/userguide/platforms/cmd_list.rst @@ -1,4 +1,4 @@ -.. Copyright 2014-2016 Ivan Kravets +.. Copyright 2014-present Ivan Kravets 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 @@ -27,7 +27,7 @@ Usage Description ----------- -List installed :ref:`Platforms ` +List installed :ref:`platforms` Options ~~~~~~~ diff --git a/docs/userguide/platforms/cmd_search.rst b/docs/userguide/platforms/cmd_search.rst index 1f372518..1bb7104d 100644 --- a/docs/userguide/platforms/cmd_search.rst +++ b/docs/userguide/platforms/cmd_search.rst @@ -1,4 +1,4 @@ -.. Copyright 2014-2016 Ivan Kravets +.. Copyright 2014-present Ivan Kravets 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 @@ -27,7 +27,7 @@ Usage Description ----------- -Search for development :ref:`Platforms ` +Search for development :ref:`platforms` Options ~~~~~~~ diff --git a/docs/userguide/platforms/cmd_show.rst b/docs/userguide/platforms/cmd_show.rst index 20f005b0..3f66d3d3 100644 --- a/docs/userguide/platforms/cmd_show.rst +++ b/docs/userguide/platforms/cmd_show.rst @@ -1,4 +1,4 @@ -.. Copyright 2014-2016 Ivan Kravets +.. Copyright 2014-present Ivan Kravets 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 @@ -27,7 +27,7 @@ Usage Description ----------- -Show details about the installed :ref:`Platforms ` +Show details about the installed :ref:`platforms` Examples diff --git a/docs/userguide/platforms/cmd_uninstall.rst b/docs/userguide/platforms/cmd_uninstall.rst index a9e5411a..0a4545a9 100644 --- a/docs/userguide/platforms/cmd_uninstall.rst +++ b/docs/userguide/platforms/cmd_uninstall.rst @@ -1,4 +1,4 @@ -.. Copyright 2014-2016 Ivan Kravets +.. Copyright 2014-present Ivan Kravets 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 @@ -27,7 +27,7 @@ Usage Description ----------- -Uninstall specified :ref:`Platforms ` +Uninstall specified :ref:`platforms` Examples diff --git a/docs/userguide/platforms/cmd_update.rst b/docs/userguide/platforms/cmd_update.rst index f8ba36c9..96e52d68 100644 --- a/docs/userguide/platforms/cmd_update.rst +++ b/docs/userguide/platforms/cmd_update.rst @@ -1,4 +1,4 @@ -.. Copyright 2014-2016 Ivan Kravets +.. Copyright 2014-present Ivan Kravets 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 @@ -27,7 +27,7 @@ Usage Description ----------- -Check or update installed :ref:`Platforms ` +Check or update installed :ref:`platforms` Examples diff --git a/scripts/docspregen.py b/scripts/docspregen.py index 023b9bcb..90fb3455 100644 --- a/scripts/docspregen.py +++ b/scripts/docspregen.py @@ -1,4 +1,4 @@ -# Copyright 2014-2016 Ivan Kravets +# Copyright 2014-present Ivan Kravets # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -35,7 +35,7 @@ def generate_boards(boards): def _round_memory_size(size): if size == 1: - return 1; + return 1 size = ceil(size) for b in (64, 32, 16, 8, 4, 2, 1): @@ -134,7 +134,7 @@ def generate_platform(name): print "Processing platform: %s" % name lines = [] - lines.append(""".. Copyright 2014-2016 Ivan Kravets + lines.append(""".. Copyright 2014-present Ivan Kravets 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 @@ -241,7 +241,7 @@ def generate_framework(type_, data): print "Processing framework: %s" % type_ lines = [] - lines.append(""".. Copyright 2014-2016 Ivan Kravets + lines.append(""".. Copyright 2014-present Ivan Kravets 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 @@ -364,10 +364,65 @@ Packages ) +def update_embedded_boards(): + lines = [] + + lines.append(""".. Copyright 2014-present Ivan Kravets + 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. +""") + + lines.append(".. _embedded_boards:") + lines.append("") + + lines.append("Embedded Boards") + lines.append("===============") + + lines.append(""" +Rapid Embedded Development, Continuous and IDE integration in a few +steps with PlatformIO thanks to built-in project generator for the most +popular embedded boards and IDE. + +* You can list pre-configured boards using :ref:`cmd_boards` command or + `PlatformIO Boards Explorer `_ +* For more detailed ``board`` information please scroll tables below by + horizontal. +""") + + lines.append(".. contents::") + lines.append("") + + vendors = {} + for board, data in util.get_boards().items(): + vendor = data['vendor'] + if vendor in vendors: + vendors[vendor].append({board: data}) + else: + vendors[vendor] = [{board: data}] + + for vendor, boards in sorted(vendors.iteritems()): + lines.append(str(vendor)) + lines.append("~" * len(vendor)) + lines.append(generate_boards(boards)) + + emboards_rst = join(dirname(realpath(__file__)), + "..", "docs", "platforms", "embedded_boards.rst") + with open(emboards_rst, "w") as f: + f.write("\n".join(lines)) + + def main(): update_create_platform_doc() update_platform_docs() update_framework_docs() + update_embedded_boards() if __name__ == "__main__": sys_exit(main()) From 38967eab646f63adda3eebbec619d9de0a8535d8 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Thu, 2 Jun 2016 20:45:43 +0300 Subject: [PATCH 37/39] Fix issue with ARM mbed framework and multiple definition errors on FRDM-KL46Z board // Resolve #641 --- HISTORY.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/HISTORY.rst b/HISTORY.rst index 34971927..af32b711 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -25,6 +25,10 @@ PlatformIO 2.0 * Fixed configuration data for TI LaunchPads based on msp430fr4133 and msp430fr6989 MCUs (`issue #676 `_) +* Fixed issue with ARM mbed framework and multiple definition errors + on FRDM-KL46Z board + (`issue #641 `_) + 2.9.1 (2016-04-30) ~~~~~~~~~~~~~~~~~~ From 0b80ed6c2bee21117cabddf97bded9d9eeff1ad0 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Thu, 2 Jun 2016 20:47:09 +0300 Subject: [PATCH 38/39] Fix issue with ARM mbed framework when abstract class breaks compile for LPC1768 // Resolve #666 --- HISTORY.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/HISTORY.rst b/HISTORY.rst index af32b711..68085ebe 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -28,7 +28,9 @@ PlatformIO 2.0 * Fixed issue with ARM mbed framework and multiple definition errors on FRDM-KL46Z board (`issue #641 `_) - +* Fixed issue with ARM mbed framework when abstract class breaks compile + for LPC1768 + (`issue #666 `_) 2.9.1 (2016-04-30) ~~~~~~~~~~~~~~~~~~ From 331cfb5b54ec344e10820e99cffb4ce084e2a604 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Thu, 2 Jun 2016 20:56:52 +0300 Subject: [PATCH 39/39] Version bump to 2.9.2 (issues #641, #645, #648, #652, #664, #665, #666, #671, #674) --- HISTORY.rst | 2 +- platformio/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index 68085ebe..5aa6b40d 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -4,7 +4,7 @@ Release Notes PlatformIO 2.0 -------------- -2.9.2 (2016-??-??) +2.9.2 (2016-06-02) ~~~~~~~~~~~~~~~~~~ * Simplified `Continuous Integration with AppVeyor `__ diff --git a/platformio/__init__.py b/platformio/__init__.py index d8d22716..e6127e13 100644 --- a/platformio/__init__.py +++ b/platformio/__init__.py @@ -14,7 +14,7 @@ import sys -VERSION = (2, 9, "2.dev0") +VERSION = (2, 9, 2) __version__ = ".".join([str(s) for s in VERSION]) __title__ = "platformio"