summaryrefslogtreecommitdiff
path: root/src/cc1111
diff options
context:
space:
mode:
Diffstat (limited to 'src/cc1111')
-rw-r--r--src/cc1111/Makefile.cc11115
-rw-r--r--src/cc1111/ao_adc.c20
-rw-r--r--src/cc1111/ao_aes.c4
-rw-r--r--src/cc1111/ao_arch.h12
-rw-r--r--src/cc1111/ao_arch_funcs.h10
-rw-r--r--src/cc1111/ao_launch.c3
-rw-r--r--src/cc1111/ao_pins.h12
-rw-r--r--src/cc1111/ao_radio.c66
-rw-r--r--src/cc1111/ao_serial.c46
-rw-r--r--src/cc1111/ao_spi.c172
10 files changed, 262 insertions, 88 deletions
diff --git a/src/cc1111/Makefile.cc1111 b/src/cc1111/Makefile.cc1111
index f7ecce33..0e19603b 100644
--- a/src/cc1111/Makefile.cc1111
+++ b/src/cc1111/Makefile.cc1111
@@ -2,7 +2,7 @@ CC=sdcc
CFLAGS=--model-small --debug --opt-code-speed -DCODESIZE=$(CODESIZE)
-CFLAGS += $(PRODUCT_DEF) -I. -I.. -I../core -I../cc1111 -I../driver -I../product
+CFLAGS += $(PRODUCT_DEF) -I. -I.. -I../core -I../cc1111 -I../drivers -I../product
CODESIZE ?= 0x8000
@@ -33,3 +33,6 @@ clean-cc1111:
rm -f $(PROGNAME)-*
rm -f ao_product.h
rm -f ../$(PROGNAME)-*
+
+../ao_kalman.h:
+ +(cd .. && make ao_kalman.h)
diff --git a/src/cc1111/ao_adc.c b/src/cc1111/ao_adc.c
index ce827e25..f7b52281 100644
--- a/src/cc1111/ao_adc.c
+++ b/src/cc1111/ao_adc.c
@@ -140,6 +140,15 @@ ao_adc_isr(void) __interrupt 1
}
#endif /* telemini || telenano */
+#ifdef TELEFIRE_V_0_1
+ a = (uint8_t __xdata *) (&ao_data_ring[ao_data_head].adc.sense[0] + sequence);
+ a[0] = ADCL;
+ a[1] = ADCH;
+ if (sequence < 5)
+ ADCCON3 = ADCCON3_EREF_VDD | ADCCON3_EDIV_512 | (sequence + 1);
+#define GOT_ADC
+#endif /* TELEFIRE_V_0_1 */
+
#ifndef GOT_ADC
#error No known ADC configuration set
#endif
@@ -157,9 +166,13 @@ ao_adc_dump(void) __reentrant
{
static __xdata struct ao_data packet;
ao_data_get(&packet);
+#ifndef AO_ADC_DUMP
printf("tick: %5u accel: %5d pres: %5d temp: %5d batt: %5d drogue: %5d main: %5d\n",
packet.tick, packet.adc.accel, packet.adc.pres, packet.adc.temp,
packet.adc.v_batt, packet.adc.sense_d, packet.adc.sense_m);
+#else
+ AO_ADC_DUMP(&packet);
+#endif
}
__code struct ao_cmds ao_adc_cmds[] = {
@@ -170,6 +183,11 @@ __code struct ao_cmds ao_adc_cmds[] = {
void
ao_adc_init(void)
{
+#ifdef AO_ADC_PINS
+ ADCCFG = AO_ADC_PINS;
+
+#else
+
#if IGNITE_ON_P2
/* TeleMetrum configuration */
ADCCFG = ((1 << 0) | /* acceleration */
@@ -190,6 +208,8 @@ ao_adc_init(void)
(1 << 3)); /* battery voltage */
#endif
+#endif /* else AO_ADC_PINS */
+
/* enable interrupts */
ADCIF = 0;
IEN0 |= IEN0_ADCIE;
diff --git a/src/cc1111/ao_aes.c b/src/cc1111/ao_aes.c
index d50fecfb..0e32abf6 100644
--- a/src/cc1111/ao_aes.c
+++ b/src/cc1111/ao_aes.c
@@ -136,7 +136,11 @@ void
ao_aes_init(void)
{
ao_aes_dma_in = ao_dma_alloc(&ao_aes_dma_in_done);
+#if DMA_SHARE_AES_RADIO
+ ao_aes_dma_out = ao_radio_dma;
+#else
ao_aes_dma_out = ao_dma_alloc(&ao_aes_dma_out_done);
+#endif
S0CON = 0;
ENCIE = 1;
}
diff --git a/src/cc1111/ao_arch.h b/src/cc1111/ao_arch.h
index 06b04b93..a97515a7 100644
--- a/src/cc1111/ao_arch.h
+++ b/src/cc1111/ao_arch.h
@@ -200,18 +200,6 @@ extern AO_ROMCONFIG_SYMBOL(0x00a6) uint32_t ao_radio_cal;
#define ao_arch_critical(b) __critical { b }
-struct ao_adc {
- int16_t accel; /* accelerometer */
- int16_t pres; /* pressure sensor */
- int16_t temp; /* temperature sensor */
- int16_t v_batt; /* battery voltage */
- int16_t sense_d; /* drogue continuity sense */
- int16_t sense_m; /* main continuity sense */
-#if HAS_ACCEL_REF
- uint16_t accel_ref; /* acceleration reference */
-#endif
-};
-
#define AO_DATA_RING 32
/* ao_button.c */
diff --git a/src/cc1111/ao_arch_funcs.h b/src/cc1111/ao_arch_funcs.h
index 0737e7ab..5e2fc13d 100644
--- a/src/cc1111/ao_arch_funcs.h
+++ b/src/cc1111/ao_arch_funcs.h
@@ -29,6 +29,15 @@ extern __xdata uint8_t ao_spi_mutex;
UxGCR_ORDER_MSB | \
((speed) << UxGCR_BAUD_E_SHIFT)))
+#define ao_spi_get_slave(bus) do { \
+ ao_mutex_get(&ao_spi_mutex); \
+ ao_spi_set_speed(AO_SPI_SPEED_FAST); \
+ } while (0)
+
+#define ao_spi_put_slave(bus) do { \
+ ao_mutex_put(&ao_spi_mutex); \
+ } while (0)
+
#define ao_spi_get_mask(reg,mask,bus,speed) do { \
ao_mutex_get(&ao_spi_mutex); \
ao_spi_set_speed(speed); \
@@ -88,3 +97,4 @@ ao_spi_init(void);
#define token_paster(x,y) x ## y
#define token_evaluator(x,y) token_paster(x,y)
#define ao_enable_output(port,bit,pin,v) cc1111_enable_output(port,token_evaluator(port,DIR), token_evaluator(port,SEL), pin, bit, v)
+#define ao_gpio_set(port, bit, pin, v) ((pin) = (v))
diff --git a/src/cc1111/ao_launch.c b/src/cc1111/ao_launch.c
index a593d0b2..420f7568 100644
--- a/src/cc1111/ao_launch.c
+++ b/src/cc1111/ao_launch.c
@@ -15,7 +15,8 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-#include "ao.h"
+#include <ao.h>
+#include <ao_radio_cmac.h>
__xdata uint16_t ao_launch_ignite;
diff --git a/src/cc1111/ao_pins.h b/src/cc1111/ao_pins.h
index fc6ed3ec..2f0e2884 100644
--- a/src/cc1111/ao_pins.h
+++ b/src/cc1111/ao_pins.h
@@ -560,4 +560,16 @@
#define AO_IGNITER_FIRE_TIME AO_MS_TO_TICKS(50)
#define AO_IGNITER_CHARGE_TIME AO_MS_TO_TICKS(2000)
+struct ao_adc {
+ int16_t accel; /* accelerometer */
+ int16_t pres; /* pressure sensor */
+ int16_t temp; /* temperature sensor */
+ int16_t v_batt; /* battery voltage */
+ int16_t sense_d; /* drogue continuity sense */
+ int16_t sense_m; /* main continuity sense */
+#if HAS_ACCEL_REF
+ uint16_t accel_ref; /* acceleration reference */
+#endif
+};
+
#endif /* _AO_PINS_H_ */
diff --git a/src/cc1111/ao_radio.c b/src/cc1111/ao_radio.c
index 2071c47a..cb2c2fdd 100644
--- a/src/cc1111/ao_radio.c
+++ b/src/cc1111/ao_radio.c
@@ -16,6 +16,9 @@
*/
#include "ao.h"
+#if HAS_PAD
+#include <ao_pad.h>
+#endif
/* Values from SmartRF® Studio for:
*
@@ -467,8 +470,44 @@ ao_radio_rdf_abort(void)
/* Output carrier */
+
+static __xdata ao_radio_test_on;
+
void
-ao_radio_test(void)
+ao_radio_test(uint8_t on)
+{
+ if (on) {
+ if (!ao_radio_test_on) {
+#if HAS_MONITOR
+ ao_monitor_disable();
+#endif
+#if PACKET_HAS_SLAVE
+ ao_packet_slave_stop();
+#endif
+#if HAS_PAD
+ ao_pad_disable();
+#endif
+ ao_radio_get(0xff);
+ RFST = RFST_STX;
+ ao_radio_test_on = 1;
+ }
+ } else {
+ if (ao_radio_test_on) {
+ ao_radio_idle();
+ ao_radio_put();
+ ao_radio_test_on = 0;
+#if HAS_MONITOR
+ ao_monitor_enable();
+#endif
+#if HAS_PAD
+ ao_pad_enable();
+#endif
+ }
+ }
+}
+
+static void
+ao_radio_test_cmd(void)
{
uint8_t mode = 2;
static __xdata radio_on;
@@ -478,34 +517,19 @@ ao_radio_test(void)
mode = (uint8_t) ao_cmd_lex_u32;
}
mode++;
- if ((mode & 2) && !radio_on) {
-#if HAS_MONITOR
- ao_monitor_disable();
-#endif
-#if PACKET_HAS_SLAVE
- ao_packet_slave_stop();
-#endif
- ao_radio_get(0xff);
- RFST = RFST_STX;
- radio_on = 1;
- }
+ if ((mode & 2))
+ ao_radio_test(1);
if (mode == 3) {
printf ("Hit a character to stop..."); flush();
getchar();
putchar('\n');
}
- if ((mode & 1) && radio_on) {
- ao_radio_idle();
- ao_radio_put();
- radio_on = 0;
-#if HAS_MONITOR
- ao_monitor_enable();
-#endif
- }
+ if ((mode & 1))
+ ao_radio_test(0);
}
__code struct ao_cmds ao_radio_cmds[] = {
- { ao_radio_test, "C <1 start, 0 stop, none both>\0Radio carrier test" },
+ { ao_radio_test_cmd, "C <1 start, 0 stop, none both>\0Radio carrier test" },
{ 0, NULL },
};
diff --git a/src/cc1111/ao_serial.c b/src/cc1111/ao_serial.c
index 00c85ff3..48383802 100644
--- a/src/cc1111/ao_serial.c
+++ b/src/cc1111/ao_serial.c
@@ -17,6 +17,25 @@
#include "ao.h"
+const __code struct ao_serial_speed ao_serial_speeds[] = {
+ /* [AO_SERIAL_SPEED_4800] = */ {
+ /* .baud = */ 163,
+ /* .gcr = */ (7 << UxGCR_BAUD_E_SHIFT) | UxGCR_ORDER_LSB
+ },
+ /* [AO_SERIAL_SPEED_9600] = */ {
+ /* .baud = */ 163,
+ /* .gcr = */ (8 << UxGCR_BAUD_E_SHIFT) | UxGCR_ORDER_LSB
+ },
+ /* [AO_SERIAL_SPEED_19200] = */ {
+ /* .baud = */ 163,
+ /* .gcr = */ (9 << UxGCR_BAUD_E_SHIFT) | UxGCR_ORDER_LSB
+ },
+ /* [AO_SERIAL_SPEED_57600] = */ {
+ /* .baud = */ 59,
+ /* .gcr = */ (11 << UxGCR_BAUD_E_SHIFT) | UxGCR_ORDER_LSB
+ },
+};
+
#if HAS_SERIAL_0
volatile __xdata struct ao_fifo ao_serial0_rx_fifo;
@@ -116,7 +135,7 @@ ao_serial1_rx_isr(void) __interrupt 3
if (!ao_fifo_full(ao_serial1_rx_fifo))
ao_fifo_insert(ao_serial1_rx_fifo, U1DBUF);
ao_wakeup(&ao_serial1_rx_fifo);
-#if USE_SERIAL1_STDIN
+#if USE_SERIAL_1_STDIN
ao_wakeup(&ao_stdin_ready);
#endif
}
@@ -181,25 +200,6 @@ ao_serial1_drain(void) __critical
ao_sleep(&ao_serial1_tx_fifo);
}
-const __code struct ao_serial_speed ao_serial_speeds[] = {
- /* [AO_SERIAL_SPEED_4800] = */ {
- /* .baud = */ 163,
- /* .gcr = */ (7 << UxGCR_BAUD_E_SHIFT) | UxGCR_ORDER_LSB
- },
- /* [AO_SERIAL_SPEED_9600] = */ {
- /* .baud = */ 163,
- /* .gcr = */ (8 << UxGCR_BAUD_E_SHIFT) | UxGCR_ORDER_LSB
- },
- /* [AO_SERIAL_SPEED_19200] = */ {
- /* .baud = */ 163,
- /* .gcr = */ (9 << UxGCR_BAUD_E_SHIFT) | UxGCR_ORDER_LSB
- },
- /* [AO_SERIAL_SPEED_57600] = */ {
- /* .baud = */ 59,
- /* .gcr = */ (11 << UxGCR_BAUD_E_SHIFT) | UxGCR_ORDER_LSB
- },
-};
-
void
ao_serial1_set_speed(uint8_t speed)
{
@@ -236,9 +236,9 @@ ao_serial_init(void)
(P2SEL_PRI3P1_USART0 | P2SEL_PRI0P1_USART0);
/* Make the USART pins be controlled by the USART */
- P1SEL |= (1 << 2) | (1 << 3);
-#if HAS_SERIAL_0_HW_FLOW
P1SEL |= (1 << 5) | (1 << 4);
+#if HAS_SERIAL_0_HW_FLOW
+ P1SEL |= (1 << 3) | (1 << 2);
#endif
#endif
@@ -292,8 +292,10 @@ ao_serial_init(void)
/* Make the USART pins be controlled by the USART */
P1SEL |= (1 << 6) | (1 << 7);
+#if HAS_SERIAL_1_HW_FLOW
P1SEL |= (1 << 5) | (1 << 4);
#endif
+#endif
/* UART mode with receiver enabled */
U1CSR = (UxCSR_MODE_UART | UxCSR_RE);
diff --git a/src/cc1111/ao_spi.c b/src/cc1111/ao_spi.c
index 1bf5e155..2b4fd186 100644
--- a/src/cc1111/ao_spi.c
+++ b/src/cc1111/ao_spi.c
@@ -17,6 +17,109 @@
#include "ao.h"
+/* Default pin usage for existing Altus Metrum devices */
+#if !HAS_SPI_0 && !HAS_SPI_1
+#define HAS_SPI_0 1
+#define SPI_0_ALT_2 1
+#endif
+
+#ifndef SPI_CONST
+#define SPI_CONST 0xff
+#endif
+
+/*
+ * USART0 SPI config alt 1
+ *
+ * MO P0_3
+ * MI P0_2
+ * CLK P0_5
+ * SS P0_4
+ *
+ * USART0 SPI config alt 2
+ *
+ * MO P1_5
+ * MI P1_4
+ * CLK P1_3
+ * CSS P1_2
+ *
+ * USART1 SPI config alt 1
+ *
+ * MO P0_4
+ * MI P0_5
+ * CLK P0_3
+ * SS P0_2
+ *
+ * USART1 SPI config alt 2
+ *
+ * MO P1_6
+ * MI P1_7
+ * CLK P1_5
+ * SS P1_4
+ *
+ *
+ * Chip select is the responsibility of the caller in master mode
+ */
+
+#if HAS_SPI_0
+#define SPI_CSR U0CSR
+#define SPI_BUF U0DBUFXADDR
+#define SPI_BAUD U0BAUD
+#define SPI_GCR U0GCR
+#define SPI_CFG_MASK PERCFG_U0CFG_ALT_MASK
+#define SPI_DMA_TX DMA_CFG0_TRIGGER_UTX0
+#define SPI_DMA_RX DMA_CFG0_TRIGGER_URX0
+
+#if SPI_0_ALT_1
+#define SPI_CFG PERCFG_U0CFG_ALT_1
+#define SPI_SEL P0SEL
+#define SPI_BITS (1 << 3) | (1 << 2) | (1 << 5)
+#define SPI_CSS_BIT (1 << 4)
+#endif
+
+#if SPI_0_ALT_2
+#define SPI_CFG PERCFG_U0CFG_ALT_2
+#define SPI_SEL P1SEL
+#define SPI_PRI P2SEL_PRI3P1_USART0
+#define SPI_BITS (1 << 5) | (1 << 4) | (1 << 3)
+#define SPI_CSS_BIT (1 << 2)
+#endif
+
+#endif
+
+#if HAS_SPI_1
+#define SPI_CSR U1CSR
+#define SPI_BUF U1DBUFXADDR
+#define SPI_BAUD U1BAUD
+#define SPI_GCR U1GCR
+#define SPI_CFG_MASK PERCFG_U1CFG_ALT_MASK
+#define SPI_DMA_TX DMA_CFG0_TRIGGER_UTX1
+#define SPI_DMA_RX DMA_CFG0_TRIGGER_URX1
+
+#if SPI_1_ALT_1
+#define SPI_CFG PERCFG_U1CFG_ALT_1
+#define SPI_SEL P0SEL
+#define SPI_BITS (1 << 4) | (1 << 5) | (1 << 3)
+#define SPI_CSS_BIT (1 << 2)
+#endif
+
+#if SPI_1_ALT_2
+#define SPI_CFG PERCFG_U1CFG_ALT_2
+#define SPI_SEL P1SEL
+#define SPI_PRI P2SEL_PRI3P1_USART1
+#define SPI_BITS (1 << 6) | (1 << 7) | (1 << 5)
+#define SPI_CSS_BIT (1 << 4)
+#endif
+
+#endif
+
+#if AO_SPI_SLAVE
+#define CSS SPI_CSS_BIT
+#define UxCSR_DIRECTION UxCSR_SLAVE
+#else
+#define CSS 0
+#define UxCSR_DIRECTION UxCSR_MASTER
+#endif
+
/* Shared mutex to protect SPI bus, must cover the entire
* operation, from CS low to CS high. This means that any SPI
* user must protect the SPI bus with this mutex
@@ -40,35 +143,45 @@ static __xdata uint8_t ao_spi_const;
void
ao_spi_send_bus(void __xdata *block, uint16_t len) __reentrant
{
+#if !AO_SPI_SLAVE
ao_dma_set_transfer(ao_spi_dma_in_id,
- &U0DBUFXADDR,
+ &SPI_BUF,
&ao_spi_const,
len,
DMA_CFG0_WORDSIZE_8 |
DMA_CFG0_TMODE_SINGLE |
- DMA_CFG0_TRIGGER_URX0,
+ SPI_DMA_RX,
DMA_CFG1_SRCINC_0 |
DMA_CFG1_DESTINC_0 |
DMA_CFG1_PRIORITY_NORMAL);
-
+#endif
ao_dma_set_transfer(ao_spi_dma_out_id,
block,
- &U0DBUFXADDR,
+ &SPI_BUF,
len,
DMA_CFG0_WORDSIZE_8 |
DMA_CFG0_TMODE_SINGLE |
- DMA_CFG0_TRIGGER_UTX0,
+ SPI_DMA_TX,
DMA_CFG1_SRCINC_1 |
DMA_CFG1_DESTINC_0 |
DMA_CFG1_PRIORITY_NORMAL);
+#if !AO_SPI_SLAVE
ao_dma_start(ao_spi_dma_in_id);
+#endif
ao_dma_start(ao_spi_dma_out_id);
ao_dma_trigger(ao_spi_dma_out_id);
+#if AO_SPI_SLAVE
+ __critical while (!ao_spi_dma_out_done)
+ ao_sleep(&ao_spi_dma_out_done);
+#else
__critical while (!ao_spi_dma_in_done)
ao_sleep(&ao_spi_dma_in_done);
+#endif
}
+
+
/* Receive bytes over SPI.
*
* This sets up tow DMA engines, one reading the data and another
@@ -79,59 +192,56 @@ void
ao_spi_recv_bus(void __xdata *block, uint16_t len) __reentrant
{
ao_dma_set_transfer(ao_spi_dma_in_id,
- &U0DBUFXADDR,
+ &SPI_BUF,
block,
len,
DMA_CFG0_WORDSIZE_8 |
DMA_CFG0_TMODE_SINGLE |
- DMA_CFG0_TRIGGER_URX0,
+ SPI_DMA_RX,
DMA_CFG1_SRCINC_0 |
DMA_CFG1_DESTINC_1 |
DMA_CFG1_PRIORITY_NORMAL);
- ao_spi_const = 0xff;
+ ao_spi_const = SPI_CONST;
+#if !AO_SPI_SLAVE
ao_dma_set_transfer(ao_spi_dma_out_id,
&ao_spi_const,
- &U0DBUFXADDR,
+ &SPI_BUF,
len,
DMA_CFG0_WORDSIZE_8 |
DMA_CFG0_TMODE_SINGLE |
- DMA_CFG0_TRIGGER_UTX0,
+ SPI_DMA_TX,
DMA_CFG1_SRCINC_0 |
DMA_CFG1_DESTINC_0 |
DMA_CFG1_PRIORITY_NORMAL);
+#endif
ao_dma_start(ao_spi_dma_in_id);
+#if !AO_SPI_SLAVE
ao_dma_start(ao_spi_dma_out_id);
ao_dma_trigger(ao_spi_dma_out_id);
+#endif
__critical while (!ao_spi_dma_in_done)
ao_sleep(&ao_spi_dma_in_done);
}
-/*
- * Initialize USART0 for SPI using config alt 2
- *
- * MO P1_5
- * MI P1_4
- * CLK P1_3
- *
- * Chip select is the responsibility of the caller
- */
void
ao_spi_init(void)
{
/* Set up the USART pin assignment */
- PERCFG = (PERCFG & ~PERCFG_U0CFG_ALT_MASK) | PERCFG_U0CFG_ALT_2;
+ PERCFG = (PERCFG & ~SPI_CFG_MASK) | SPI_CFG;
- /* Ensure that USART0 takes precidence over USART1 for pins that
- * they share
+ /* Ensure that SPI USART takes precidence over the other USART
+ * for pins that they share
*/
- P2SEL = (P2SEL & ~P2SEL_PRI3P1_MASK) | P2SEL_PRI3P1_USART0;
+#ifdef SPI_PRI
+ P2SEL = (P2SEL & ~P2SEL_PRI3P1_MASK) | SPI_PRI;
+#endif
/* Make the SPI pins be controlled by the USART peripheral */
- P1SEL |= ((1 << 5) | (1 << 4) | (1 << 3));
+ SPI_SEL |= SPI_BITS | CSS;
/* Set up OUT DMA */
ao_spi_dma_out_id = ao_dma_alloc(&ao_spi_dma_out_done);
@@ -141,9 +251,9 @@ ao_spi_init(void)
/* Set up the USART.
*
- * SPI master mode
+ * SPI master/slave mode
*/
- U0CSR = (UxCSR_MODE_SPI | UxCSR_RE | UxCSR_MASTER);
+ SPI_CSR = (UxCSR_MODE_SPI | UxCSR_RE | UxCSR_DIRECTION);
/* Set the baud rate and signal parameters
*
@@ -151,9 +261,9 @@ ao_spi_init(void)
* Every peripheral I've ever seen goes faster than that,
* so set the clock to 3MHz (BAUD_E 17, BAUD_M 0)
*/
- U0BAUD = 0;
- U0GCR = (UxGCR_CPOL_NEGATIVE |
- UxGCR_CPHA_FIRST_EDGE |
- UxGCR_ORDER_MSB |
- (17 << UxGCR_BAUD_E_SHIFT));
+ SPI_BAUD = 0;
+ SPI_GCR = (UxGCR_CPOL_NEGATIVE |
+ UxGCR_CPHA_FIRST_EDGE |
+ UxGCR_ORDER_MSB |
+ (17 << UxGCR_BAUD_E_SHIFT));
}