Project import
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..8d8fd09
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,104 @@
+#
+# Copyright (c) 2010-2015 Nest Labs, Inc.
+# All rights reserved.
+#
+# This document is the property of Nest. It is considered
+# confidential and proprietary information.
+#
+# This document may not be reproduced or transmitted in any form,
+# in whole or in part, without the express written permission of
+# Nest.
+#
+# Description:
+# This file is the makefile for the STM32 flash utility.
+#
+
+BuildConfigSpecialized := No
+BuildProductSpecialized := No
+
+include pre.mak
+
+PackageRoot := .
+
+PackageName := stm32flash
+
+PackageExtension := tar.gz
+PackageSeparator :=
+
+PackagePatchArgs := -p1
+
+PackageArchive := $(PackageName).$(PackageExtension)
+PackageSourceDir := $(PackageRoot)/$(PackageName)
+
+PackageBuildMakefile = $(call GenerateBuildPaths,Makefile)
+
+LicenseSourceFile := $(PackageSourceDir)/gpl-2.0.txt
+
+CleanPaths += $(PackageLicenseFile)
+
+ExecutableName := $(PackageName)
+
+all: $(PackageDefaultGoal)
+
+# Generate the package license contents.
+
+$(LicenseSourceFile): source
+
+$(PackageLicenseFile): $(LicenseSourceFile)
+ $(copy-result)
+
+# Extract the source from the archive and apply patches, if any.
+
+$(PackageSourceDir): $(PackageArchive) $(PackagePatchPaths)
+ echo $(PackageArchive) $(PackagePatchPaths)
+ $(expand-and-patch-package)
+
+# Prepare the sources.
+
+.PHONY: source
+source: | $(PackageSourceDir)
+
+# Patch the sources, if necessary.
+
+.PHONY: patch
+patch: source
+
+# Generate the package build makefile.
+
+$(PackageBuildMakefile): | $(PackageSourceDir) $(BuildDirectory)
+ $(call create-links,$(CURDIR)/$(PackageSourceDir),$(BuildDirectory))
+
+# Configure the source for building.
+
+.PHONY: configure
+configure: source $(PackageBuildMakefile)
+
+# Build the source.
+#
+# We have to unset MAKEFLAGS since they confuse the package build otherwise.
+
+.PHONY: build
+build: configure
+ $(Verbose)unset MAKEFLAGS && \
+ $(MAKE) $(JOBSFLAG) -C $(BuildDirectory) \
+ INSTALL="$(INSTALL) $(INSTALLFLAGS)" \
+ CC="$(CC)" CXX="$(CXX)" AR=$(AR) NM=$(NM) RANLIB=$(RANLIB) STRIP=$(STRIP) \
+ all
+
+# Stage the build to a temporary installation area.
+#
+# We have to unset MAKEFLAGS since they confuse the package build otherwise.
+
+.PHONY: stage
+stage: build | $(ResultDirectory)
+ $(Verbose)unset MAKEFLAGS && \
+ $(MAKE) $(JOBSFLAG) -C $(BuildDirectory) \
+ INSTALL="$(INSTALL) $(INSTALLFLAGS)" \
+ DESTDIR=$(ResultDirectory) \
+ install
+
+clean:
+ $(Verbose)$(RM) $(RMFLAGS) -r $(BuildDirectory)
+ $(Verbose)$(RM) $(RMFLAGS) -r $(ResultDirectory)
+
+include post.mak
diff --git a/stm32flash.patches/stm32flash-50.description b/stm32flash.patches/stm32flash-50.description
new file mode 100644
index 0000000..4c15407
--- /dev/null
+++ b/stm32flash.patches/stm32flash-50.description
@@ -0,0 +1,7 @@
+sw/tps/stm32flash-0.4/stm32flash/dev_table.c
+ Minor tweaks to Diamond MCU entries in devices[].
+sw/tps/stm32flash-0.4/stm32flash/stm32.c
+ Detect MCUs that do not support mass erase and erase the whole flash before writing image.
+ Only Diamond MCUs are flagged as incapable of mass erase for now.
+sw/tps/stm32flash-0.4/stm32flash/stm32.h
+ Prototype change for stm32_erase_memory().
diff --git a/stm32flash.patches/stm32flash-50.patch b/stm32flash.patches/stm32flash-50.patch
new file mode 100644
index 0000000..e0f95ba
--- /dev/null
+++ b/stm32flash.patches/stm32flash-50.patch
@@ -0,0 +1,86 @@
+diff -aruN stm32flash.orig/dev_table.c stm32flash/dev_table.c
+--- stm32flash.orig/dev_table.c 2014-10-03 14:35:08.000000000 -0700
++++ stm32flash/dev_table.c 2015-02-02 17:25:20.752854394 -0800
+@@ -57,9 +57,10 @@
+ /* L0 */
+ {0x417, "L05xxx/06xxx" , 0x20001000, 0x20002000, 0x08000000, 0x08010000, 32, 128, 0x1FF80000, 0x1FF8000F, 0x1FF00000, 0x1FF01000},
+ /* L1 */
+- {0x416, "L1xxx6(8/B)" , 0x20000800, 0x20004000, 0x08000000, 0x08020000, 16, 256, 0x1FF80000, 0x1FF8000F, 0x1FF00000, 0x1FF01000},
+- {0x429, "L1xxx6(8/B)A" , 0x20001000, 0x20008000, 0x08000000, 0x08020000, 16, 256, 0x1FF80000, 0x1FF8000F, 0x1FF00000, 0x1FF01000},
+- {0x427, "L1xxxC" , 0x20001000, 0x20008000, 0x08000000, 0x08020000, 16, 256, 0x1FF80000, 0x1FF8000F, 0x1FF00000, 0x1FF02000},
++ {0x416, "Medium-density ULP", 0x20000800, 0x20004000, 0x08000000, 0x08020000, 16, 256, 0x1FF80000, 0x1FF8000F, 0x1FF00000, 0x1FF01000},
++ {0x429, "Medium-density ULP Shrink", 0x20000800, 0x20004000, 0x08000000, 0x08020000, 16, 256, 0x1FF80000, 0x1FF8000F, 0x1FF00000, 0x1FF01000},
++ {0x427, "Medium+-density ULP", 0x20001000, 0x20008000, 0x08000000, 0x08040000, 16, 256, 0x1FF80000, 0x1FF8000F, 0x1FF00000, 0x1FF01000},
++
+ {0x436, "L1xxxD" , 0x20001000, 0x2000C000, 0x08000000, 0x08060000, 16, 256, 0x1ff80000, 0x1ff8000F, 0x1FF00000, 0x1FF02000},
+ {0x437, "L1xxxE" , 0x20001000, 0x20014000, 0x08000000, 0x08060000, 16, 256, 0x1ff80000, 0x1ff8000F, 0x1FF00000, 0x1FF02000},
+ /* These are not (yet) in AN2606: */
+diff -aruN stm32flash.orig/stm32.c stm32flash/stm32.c
+--- stm32flash.orig/stm32.c 2014-10-02 00:20:26.000000000 -0700
++++ stm32flash/stm32.c 2015-02-02 17:25:20.752854394 -0800
+@@ -96,6 +96,7 @@
+ static const uint32_t stm_reset_code_length = sizeof(stm_reset_code);
+
+ extern const stm32_dev_t devices[];
++extern char reset_flag;
+
+ static void stm32_warn_stretching(const char *f)
+ {
+@@ -698,7 +699,16 @@
+ return STM32_ERR_OK;
+ }
+
+-stm32_err_t stm32_erase_memory(const stm32_t *stm, uint8_t spage, uint8_t pages)
++int supports_mass_erase(uint16_t chip_id)
++{
++ int retval = 1;
++ if(chip_id == 0x416 || chip_id == 0x417 || chip_id == 0x427 || chip_id == 0x429) {
++ retval = 0;
++ }
++ return retval;
++}
++
++stm32_err_t stm32_erase_memory(const stm32_t *stm, uint16_t spage, uint16_t pages)
+ {
+ struct port_interface *port = stm->port;
+ stm32_err_t s_err;
+@@ -725,8 +735,11 @@
+ /* Currently known as not supporting mass erase is the Ultra Low Power STM32L15xx range */
+ /* So if someone has not overridden the default, but uses one of these chips, take it out of */
+ /* mass erase mode, so it will be done page by page. This maximum might not be correct either! */
+- if (stm->pid == 0x416 && pages == 0xFF)
++
++ if (!supports_mass_erase(stm->pid) && pages == 0xFF) {
+ pages = 0xF8; /* works for the STM32L152RB with 128Kb flash */
++ reset_flag = 1; /* To mimic earlier behavior*/
++ }
+
+ if (pages == 0xFF) {
+ uint8_t buf[3];
+@@ -756,6 +769,12 @@
+ uint8_t *buf;
+ int i = 0;
+
++ if (pages == 0xF8) {
++ /* Erase the whole flash */
++ pages = (stm->dev->fl_end - stm->dev->fl_start) / stm->dev->fl_ps;
++ fprintf(stderr, "Erase 0x%x pages\n", pages);
++ }
++
+ buf = malloc(2 + 2 * pages + 1);
+ if (!buf)
+ return STM32_ERR_UNKNOWN;
+diff -aruN stm32flash.orig/stm32.h stm32flash/stm32.h
+--- stm32flash.orig/stm32.h 2014-10-02 00:20:26.000000000 -0700
++++ stm32flash/stm32.h 2015-02-02 17:25:20.752854394 -0800
+@@ -68,8 +68,8 @@
+ const uint8_t data[], unsigned int len);
+ stm32_err_t stm32_wunprot_memory(const stm32_t *stm);
+ stm32_err_t stm32_wprot_memory(const stm32_t *stm);
+-stm32_err_t stm32_erase_memory(const stm32_t *stm, uint8_t spage,
+- uint8_t pages);
++stm32_err_t stm32_erase_memory(const stm32_t *stm, uint16_t spage,
++ uint16_t pages);
+ stm32_err_t stm32_go(const stm32_t *stm, uint32_t address);
+ stm32_err_t stm32_reset_device(const stm32_t *stm);
+ stm32_err_t stm32_readprot_memory(const stm32_t *stm);
diff --git a/stm32flash.tar.gz b/stm32flash.tar.gz
new file mode 100644
index 0000000..b7ff44f
--- /dev/null
+++ b/stm32flash.tar.gz
Binary files differ
diff --git a/stm32flash.url b/stm32flash.url
new file mode 100644
index 0000000..deed025
--- /dev/null
+++ b/stm32flash.url
@@ -0,0 +1 @@
+http://releases.stm32flash.googlecode.com/git/stm32flash-0.4.tar.gz
diff --git a/stm32flash.version b/stm32flash.version
new file mode 100644
index 0000000..bd73f47
--- /dev/null
+++ b/stm32flash.version
@@ -0,0 +1 @@
+0.4