altos: Add TelePyro v0.1 support
authorKeith Packard <keithp@keithp.com>
Wed, 21 Sep 2011 18:30:43 +0000 (11:30 -0700)
committerKeith Packard <keithp@keithp.com>
Wed, 21 Sep 2011 18:45:05 +0000 (11:45 -0700)
Signed-off-by: Keith Packard <keithp@keithp.com>
src/Makefile
src/avr/ao_adc_avr.c
src/avr/ao_pins.h
src/core/ao.h
src/drivers/ao_pyro_slave.c [new file with mode: 0644]
src/product/ao_telepyro.c [new file with mode: 0644]
src/telepyro-v0.1/Makefile [new file with mode: 0644]

index 9ef5ae0a9fd2870a7ffa3912c7e9987e6d3962b5..91d3f03568de7c0020573e78714c1fc62c769e67 100644 (file)
@@ -19,7 +19,7 @@ SUBDIRS=\
        telebt-v0.0 telebt-v0.1 \
        telemetrum-v0.1-sky telemetrum-v0.1-sirf \
        telelaunch-v0.1 \
-       tidongle test telescience-v0.1
+       tidongle test telescience-v0.1 telepyro-v0.1
 
 all: all-local all-recursive
 
index 5afced74a936acc4e9e911e76f999a7d3accbb52..9f45acaf04f8a5fc40aacd66a994537999b1fbae 100644 (file)
@@ -20,6 +20,7 @@
 volatile __xdata struct ao_adc ao_adc_ring[AO_ADC_RING];
 volatile __data uint8_t                ao_adc_head;
 
+#ifdef TELESCIENCE
 const uint8_t  adc_channels[AO_LOG_TELESCIENCE_NUM_ADC] = {
        0x00,
        0x01,
@@ -34,6 +35,22 @@ const uint8_t        adc_channels[AO_LOG_TELESCIENCE_NUM_ADC] = {
        0x24,
        0x25,
 };
+#endif
+
+#ifdef TELEPYRO
+const uint8_t  adc_channels[AO_TELEPYRO_NUM_ADC] = {
+       0x00,   /* ADC0  v_batt */
+       0x04,   /* ADC4  sense_a */
+       0x05,   /* ADC5  sense_b */
+       0x06,   /* ADC6  sense_c */
+       0x07,   /* ADC7  sense_d */
+       0x23,   /* ADC11 sense_e */
+       0x22,   /* ADC10 sense_f */
+       0x21,   /* ADC9 sense_g */
+};
+#endif
+
+#define NUM_ADC        (sizeof (adc_channels) / sizeof (adc_channels[0]))
 
 static uint8_t ao_adc_channel;
 
@@ -75,7 +92,7 @@ ISR(ADC_vect)
        value = ADCL;
        value |= (ADCH << 8);
        ao_adc_ring[ao_adc_head].adc[ao_adc_channel] = value;
-       if (++ao_adc_channel < AO_TELESCIENCE_NUM_ADC)
+       if (++ao_adc_channel < NUM_ADC)
                ao_adc_start();
        else {
                ADCSRA = ADCSRA_INIT;
@@ -108,7 +125,7 @@ ao_adc_dump(void) __reentrant
        uint8_t i;
        ao_adc_get(&packet);
        printf("tick: %5u",  packet.tick);
-       for (i = 0; i < AO_TELESCIENCE_NUM_ADC; i++)
+       for (i = 0; i < NUM_ADC; i++)
                printf (" %2d: %5u", i, packet.adc[i]);
        printf ("\n");
 }
index 88f03829ec74b9e2108c59fb5f43f2693391ed7e..6b72530b93c180ae69c9d6b19fd80f17c48995ee 100644 (file)
        #define SPI_SLAVE_PIN_2_5       0
 #endif
 
+#ifdef TELEPYRO
+       #define LEDS_AVAILABLE          0
+       #define HAS_USB                 1
+       #define HAS_LOG                 0
+       #define TEENSY                  0
+       #define USE_SERIAL_STDIN        1
+       #define HAS_SERIAL_1            1
+       #define HAS_USB                 1
+       #define HAS_ADC                 1
+       #define PACKET_HAS_SLAVE        0
+       #define HAS_BEEP                0
+
+       #define AVR_VCC_5V              0
+       #define AVR_VCC_3V3             1
+       #define AVR_CLOCK               8000000UL
+
+       #define SPI_SLAVE_CS_PORT       PORTB
+       #define SPI_SLAVE_CS_PIN        PINB
+       #define SPI_SLAVE_CS_PIN_NO     PINB0
+
+       #define SPI_SLAVE_PIN_0_3       1
+       #define SPI_SLAVE_PIN_2_5       0
+#endif
+
 #endif /* _AO_PINS_H_ */
index c28c4549067fbb638417298b9095161f8541ceeb..04610fea4324de241af45de38527eea21c5e8e87 100644 (file)
@@ -1811,4 +1811,10 @@ ao_log_single_init(void);
 void
 ao_log_single(void);
 
+/*
+ * ao_pyro_slave.c
+ */
+
+#define AO_TELEPYRO_NUM_ADC    9
+
 #endif /* _AO_H_ */
diff --git a/src/drivers/ao_pyro_slave.c b/src/drivers/ao_pyro_slave.c
new file mode 100644 (file)
index 0000000..e6c73a3
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * Copyright © 2011 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#include "ao.h"
+#include "ao_product.h"
+
+struct ao_companion_command    ao_companion_command;
+
+static const struct ao_companion_setup ao_telepyro_setup = {
+       .board_id               = AO_idProduct_NUMBER,
+       .board_id_inverse       = ~AO_idProduct_NUMBER,
+       .update_period          = 50,
+       .channels               = AO_TELEPYRO_NUM_ADC,
+};
+
+void ao_spi_slave(void)
+{
+       if (!ao_spi_read((uint8_t *) &ao_companion_command,
+                        sizeof (ao_companion_command)))
+               return;
+
+       /* Figure out the outbound data */
+       switch (ao_companion_command.command) {
+       case AO_COMPANION_SETUP:
+               ao_spi_write((uint8_t *) &ao_telepyro_setup,
+                            sizeof (ao_telepyro_setup));
+               break;
+       case AO_COMPANION_FETCH:
+               ao_spi_write((uint8_t *) &ao_adc_ring[ao_adc_ring_prev(ao_adc_head)].adc,
+                            AO_TELEPYRO_NUM_ADC * sizeof (uint16_t));
+               break;
+       case AO_COMPANION_NOTIFY:
+               break;
+       default:
+               return;
+       }
+}
diff --git a/src/product/ao_telepyro.c b/src/product/ao_telepyro.c
new file mode 100644 (file)
index 0000000..a2b8f83
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright © 2011 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#include "ao.h"
+
+int
+main(void)
+{
+       ao_clock_init();
+
+       PORTE |= (1 << 6);
+       DDRE |= (1 << 6);
+
+       ao_avr_stdio_init();
+       ao_timer_init();
+       ao_cmd_init();
+       ao_spi_slave_init();
+       ao_usb_init();
+       ao_adc_init();
+       ao_start_scheduler();
+       return 0;
+}
diff --git a/src/telepyro-v0.1/Makefile b/src/telepyro-v0.1/Makefile
new file mode 100644 (file)
index 0000000..2f664fc
--- /dev/null
@@ -0,0 +1,101 @@
+#
+# AltOS build
+#
+#
+vpath % ..:../core:../product:../drivers:../avr
+vpath ao-make-product.5c ../util
+
+MCU=atmega32u4
+DUDECPUTYPE=m32u4
+#PROGRAMMER=stk500v2 -P usb
+PROGRAMMER=usbtiny
+LOADCMD=avrdude
+LOADARG=-p $(DUDECPUTYPE) -c $(PROGRAMMER) -e -U flash:w:
+CC=avr-gcc
+OBJCOPY=avr-objcopy
+
+ifndef VERSION
+include ../Version
+endif
+
+INC = \
+       ao.h \
+       ao_usb.h \
+       ao_pins.h \
+       altitude.h
+
+ALTOS_SRC = \
+       ao_clock.c \
+       ao_cmd.c \
+       ao_mutex.c \
+       ao_panic.c \
+       ao_product.c \
+       ao_stdio.c \
+       ao_task.c \
+       ao_timer.c \
+       ao_led.c \
+       ao_avr_stdio.c \
+       ao_romconfig.c \
+       ao_usb_avr.c \
+       ao_adc_avr.c \
+       ao_pyro_slave.c \
+       ao_spi_slave.c
+
+PRODUCT=TelePyro-v0.1
+MCU=atmega32u4
+PRODUCT_DEF=-DTELEPYRO
+IDPRODUCT=0x0011
+CFLAGS = $(PRODUCT_DEF) -I. -I../avr -I../core -I..
+CFLAGS += -g -mmcu=$(MCU) -Wall -Wstrict-prototypes -O3 -mcall-prologues -DAVR
+
+NICKLE=nickle
+
+PROG=telepyro-v0.1
+
+SRC=$(ALTOS_SRC) ao_telepyro.c
+OBJ=$(SRC:.c=.o)
+
+V=0
+# The user has explicitly enabled quiet compilation.
+ifeq ($(V),0)
+quiet = @printf "  $1 $2 $@\n"; $($1)
+endif
+# Otherwise, print the full command line.
+quiet ?= $($1)
+
+all: $(PROG)
+
+CHECK=sh ../util/check-avr-mem
+
+$(PROG): Makefile $(OBJ)
+       $(call quiet,CC) $(LDFLAGS) $(CFLAGS) -o $(PROG) $(OBJ)
+       $(call quiet,CHECK) $(PROG) || ($(RM) -f $(PROG); exit 1)
+
+$(PROG).hex: $(PROG)
+       avr-size $(PROG)
+       $(OBJCOPY) -R .eeprom -O ihex $(PROG) $@
+
+
+load: $(PROG).hex
+       $(LOADCMD) $(LOADARG)$(PROG).hex
+
+../altitude.h: make-altitude
+       nickle $< > $@
+
+ao_product.h: ao-make-product.5c ../Version
+       $(call quiet,NICKLE,$<) $< -m altusmetrum.org -i $(IDPRODUCT) -p $(PRODUCT) -v $(VERSION) > $@
+
+ao_product.rel: ao_product.c ao_product.h
+       $(call quiet,CC) -c $(CFLAGS) -D PRODUCT_DEFS='\"ao_product.h\"' -o$@ $<
+
+distclean:     clean
+
+clean:
+       rm -f $(OBJ)
+       rm -f ao_product.h
+
+install:
+
+uninstall:
+
+$(OBJ): ao.h ao_product.h ao_usb.h