+commit 8359fcc23a93a37ee3aee4c5d2ef183f18ea3f27
+Merge: b95d6674 9b62f683
+Author: Bdale Garbee <bdale@gag.com>
+Date: Thu Jul 2 20:20:59 2020 -0600
+
+ Merge branch 'master' into branch-1.9
+
+commit 9b62f683ff770970a87444dc25522fd771079333
+Author: Keith Packard <keithp@keithp.com>
+Date: Thu Jul 2 15:26:10 2020 -0700
+
+ Version 1.9.4
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit f74016150880265b3edb70637a6be3e6499432de
+Author: Keith Packard <keithp@keithp.com>
+Date: Thu Jul 2 15:18:56 2020 -0700
+
+ doc: Doc updates for 1.9.4
+
+ Add release notes
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit b08a793fb6e6167d635bfbd31605a43db1f5ac5d
+Author: Keith Packard <keithp@keithp.com>
+Date: Thu Jul 2 15:24:01 2020 -0700
+
+ altos: Make AO_STORAGE_TEST use a separate buffer
+
+ The storage test code needs a buffer which can hold an entire erase
+ block from memory, which means 256 bytes.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 651c66ce117f479158fb0eebd9af6d73f0d9875a
+Author: Keith Packard <keithp@keithp.com>
+Date: Thu Jul 2 15:11:42 2020 -0700
+
+ altos: Reduce flash temp buffer to make space for Em v1.0 ISR stack
+
+ EasyMini has limited RAM; small enough that increasing the size of the
+ storage buffer from 128 to 256 bytes left too little space at the top
+ of memory for the interrupt stack, causing EasyMini v1.0 to crash at
+ boot.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 35b69569472b00e6937a5d3136d0c400f6b0378f
+Author: Keith Packard <keithp@keithp.com>
+Date: Mon Jun 22 17:33:08 2020 -0700
+
+ Add telemetrum v3.0 firmware to release
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit f337aecd0370f81c84c84857e1b6325350d96a81
+Author: Bdale Garbee <bdale@gag.com>
+Date: Tue Jun 16 12:28:39 2020 -0600
+
+ ao-bringup: first cut at turn-on scripts for EasyTimer v1
+
+commit b95d6674d29534363c1d8f46280c028864bdca10
+Author: Bdale Garbee <bdale@gag.com>
+Date: Mon Jun 15 20:34:50 2020 -0600
+
+ releasing 1.9.3
+
commit f31d842d0e07a1893441cb89fb287b31b86d28c1
Merge: 0fd503fb f615725c
Author: Bdale Garbee <bdale@gag.com>
src/telemega-v2.0/telemega-v2.0-$(VERSION).ihx \
src/telemega-v3.0/telemega-v3.0-$(VERSION).ihx \
src/telemega-v4.0/telemega-v4.0-$(VERSION).ihx \
- src/telemetrum-v2.0/telemetrum-v2.0-$(VERSION).ihx
+ src/telemetrum-v2.0/telemetrum-v2.0-$(VERSION).ihx \
+ src/telemetrum-v3.0/telemetrum-v3.0-$(VERSION).ihx
keithp-fat: fat
ssh keithp.com mkdir -p public_html/altos-$(VERSION)
--- /dev/null
+#!/bin/sh
+
+VERSION=1
+PRODUCT=EasyTimer
+BASE=`echo $PRODUCT | tr 'A-Z' 'a-z'`
+
+echo "$PRODUCT-v$VERSION Test Program"
+echo "Copyright 2020 by Bdale Garbee. Released under GPL v3"
+echo
+echo "Expectations:"
+echo "\t$PRODUCT v$VERSION powered from USB"
+echo
+
+ret=1
+ao-list | while read product serial dev; do
+ case "$product" in
+ "$PRODUCT-v$VERSION")
+
+ echo "Testing $product $serial $dev"
+
+ ./test-igniters $dev 0 1
+ echo""
+
+ case $? in
+ 0)
+ ;;
+ *)
+ echo "failed"
+ exit 1
+ esac
+ echo""
+
+ echo "$PRODUCT-v$VERSION" serial "$serial" is ready to ship
+ echo "\007"
+ ret=0
+ ;;
+ esac
+done
--- /dev/null
+#!/bin/sh
+
+if [ -x /usr/bin/ao-flash-stm ]; then
+ FLASH_STM=/usr/bin/ao-flash-stm
+else
+ echo "Can't find ao-flash-stm! Aborting."
+ exit 1
+fi
+
+if [ -x /usr/bin/ao-usbload ]; then
+ USBLOAD=/usr/bin/ao-usbload
+else
+ echo "Can't find ao-usbload! Aborting."
+ exit 1
+fi
+
+VERSION=1
+REPO=~/altusmetrumllc/Binaries
+PRODUCT=EasyTimer
+
+echo "$PRODUCT v$VERSION Turn-On and Calibration Program"
+echo "Copyright 2020 by Bdale Garbee. Released under GPL v3"
+echo
+echo "Expectations:"
+echo "\t$PRODUCT v$VERSION powered from USB"
+echo "\t\twith ST-Link-V2 cabled to debug header"
+echo
+
+case $# in
+ 1)
+ SERIAL="$1"
+ echo "$PRODUCT-$VERSION serial number: $SERIAL"
+ ;;
+ 0)
+ echo -n "$PRODUCT-$VERSION serial number: "
+ read SERIAL
+ ;;
+ *)
+ echo "Usage: $0 <serial-number>" 1>&2
+ exit 1;
+ ;;
+esac
+
+echo $FLASH_STM
+
+$FLASH_STM $REPO/loaders/easytimer-v$VERSION*.elf
+
+sleep 3
+
+$USBLOAD --serial=$SERIAL --force $REPO/easytimer-v$VERSION*.elf || exit 1
+
+sleep 5
+
+dev=`ao-list | awk '/EasyTimer-v'"$VERSION"'/ { print $3; exit(0); }'`
+
+case "$dev" in
+/dev/tty*)
+ echo "EasyTimer found on $dev"
+ ;;
+*)
+ echo 'No EasyTimer-v'"$VERSION"' found'
+ exit 1
+ ;;
+esac
+
+echo 'E 0' > $dev
+
+failed=1
+while [ $failed = 1 ]; do
+ ../ao-tools/ao-cal-accel/ao-cal-accel $dev
+ failed=$?
+done
+
+echo 'E 1' > $dev
+
+./test-easytimer
+
+exit $?
dnl Process this file with autoconf to create configure.
AC_PREREQ(2.57)
-AC_INIT([altos], 1.9.3)
+AC_INIT([altos], 1.9.4)
ANDROID_VERSION=27
AC_CONFIG_SRCDIR([src/kernel/ao.h])
AM_INIT_AUTOMAKE([foreign dist-bzip2])
AM_MAINTAINER_MODE
-RELEASE_DATE=2020-06-15
+RELEASE_DATE=2020-07-02
AC_SUBST(RELEASE_DATE)
DOC_DATE=`LC_ALL=C date -d $RELEASE_DATE +'%d %b %Y'`
endif
RELNOTES_INC=\
+ release-notes-1.9.4.inc \
release-notes-1.9.3.inc \
release-notes-1.9.2.inc \
release-notes-1.9.1.inc \
[appendix]
== Release Notes
+ :leveloffset: 2
+ include::release-notes-1.9.4.adoc[]
+
+ <<<<
:leveloffset: 2
include::release-notes-1.9.3.adoc[]
--- /dev/null
+= Release Notes for Version 1.9.4
+include::release-head.adoc[]
+:doctype: article
+
+ Version 1.9.4
+
+ == AltOS
+
+ * Fixed firmware for TeleDongle v3.0 and TeleBT v4.0. Version 1.9.3 bricked those
+ devices requiring them to be opened up to get them working again.
+
+ * Fixed firmware for EasyMini v1.0. Changes in the storage
+ code caused it to use significantly more RAM which made the
+ interrupt stack smash into other data structures and cause
+ the device to panic at startup time.
+
+ == AltosUI
+
+ * Add TeleMetrum v3.0 firmware to the Linux and Mac OSX
+ AltosUI packages.
[appendix]
== Release Notes
+ :leveloffset: 2
+ include::release-notes-1.9.4.adoc[]
+
+ <<<<
:leveloffset: 2
include::release-notes-1.9.3.adoc[]
[appendix]
== Release Notes
+ :leveloffset: 2
+ include::release-notes-1.9.4.adoc[]
+
+ <<<<
:leveloffset: 2
include::release-notes-1.9.3.adoc[]
#include <ao.h>
#include <ao_storage.h>
-#define AO_STORAGE_DATA_SIZE 256
+#define AO_STORAGE_DATA_SIZE 128
static uint8_t storage_data[AO_STORAGE_DATA_SIZE];
#if AO_STORAGE_TEST
+#define AO_STORAGE_TEST_SIZE 256
+static uint8_t storage_test[AO_STORAGE_TEST_SIZE];
+
static void
ao_storage_failure(uint32_t pos, char *format, ...)
{
uint32_t offset;
uint32_t byte;
- for (offset = 0; offset < ao_storage_block; offset += sizeof (storage_data)) {
- if (!ao_storage_read(pos + offset, storage_data, sizeof (storage_data))) {
+ for (offset = 0; offset < ao_storage_block; offset += sizeof (storage_test)) {
+ if (!ao_storage_read(pos + offset, storage_test, sizeof (storage_test))) {
ao_storage_failure(pos + offset, "read failed\n");
return 0;
}
- for (byte = 0; byte < sizeof (storage_data); byte++)
- if (storage_data[byte] != value) {
+ for (byte = 0; byte < sizeof (storage_test); byte++)
+ if (storage_test[byte] != value) {
ao_storage_failure(pos + offset + byte,
"want %02x got %02x\n",
- value, storage_data[byte]);
+ value, storage_test[byte]);
return 0;
}
}
uint32_t offset;
uint32_t byte;
- for (byte = 0; byte < sizeof (storage_data); byte++)
- storage_data[byte] = value;
- for (offset = 0; offset < ao_storage_block; offset += sizeof (storage_data)) {
- if (!ao_storage_write(pos + offset, storage_data, sizeof (storage_data))) {
+ for (byte = 0; byte < sizeof (storage_test); byte++)
+ storage_test[byte] = value;
+ for (offset = 0; offset < ao_storage_block; offset += sizeof (storage_test)) {
+ if (!ao_storage_write(pos + offset, storage_test, sizeof (storage_test))) {
ao_storage_failure(pos + offset, "write failed\n");
return 0;
}
uint32_t offset;
uint32_t byte;
- for (offset = 0; offset < ao_storage_block; offset += sizeof (storage_data)) {
- if (!ao_storage_read(pos + offset, storage_data, sizeof (storage_data))) {
+ for (offset = 0; offset < ao_storage_block; offset += sizeof (storage_test)) {
+ if (!ao_storage_read(pos + offset, storage_test, sizeof (storage_test))) {
ao_storage_failure(pos + offset, "read failed\n");
return 0;
}
- for (byte = 0; byte < sizeof (storage_data); byte++) {
+ for (byte = 0; byte < sizeof (storage_test); byte++) {
uint8_t value = offset + byte;
- if (storage_data[byte] != value) {
+ if (storage_test[byte] != value) {
ao_storage_failure(pos + offset + byte,
"want %02x got %02x\n",
- value, storage_data[byte]);
+ value, storage_test[byte]);
return 0;
}
}
uint32_t offset;
uint32_t byte;
- for (offset = 0; offset < ao_storage_block; offset += sizeof (storage_data)) {
- for (byte = 0; byte < sizeof (storage_data); byte++)
- storage_data[byte] = offset + byte;
- if (!ao_storage_write(pos + offset, storage_data, sizeof (storage_data))) {
+ for (offset = 0; offset < ao_storage_block; offset += sizeof (storage_test)) {
+ for (byte = 0; byte < sizeof (storage_test); byte++)
+ storage_test[byte] = offset + byte;
+ if (!ao_storage_write(pos + offset, storage_test, sizeof (storage_test))) {
ao_storage_failure(pos + offset, "write failed\n");
return 0;
}
return;
printf("erase "); flush();
ao_storage_erase(0, ao_storage_log_max);
- for (pos = 0; pos < sizeof (storage_data); pos++)
- storage_data[pos] = (uint8_t) pos;
- for (pos = 0; pos < ao_storage_log_max; pos += sizeof (storage_data)) {
+ for (pos = 0; pos < sizeof (storage_test); pos++)
+ storage_test[pos] = (uint8_t) pos;
+ for (pos = 0; pos < ao_storage_log_max; pos += sizeof (storage_test)) {
if ((pos & 0xffff) == 0) {
printf("Fill 0x%x\n", pos); flush();
}
- ao_storage_write(pos, storage_data, sizeof (storage_data));
+ ao_storage_write(pos, storage_test, sizeof (storage_test));
}
printf("Fill complete\n");
}