summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/ao_data.h9
-rw-r--r--src/drivers/ao_hmc5883.c4
-rw-r--r--src/drivers/ao_hmc5883.h2
-rw-r--r--src/drivers/ao_mma655x.c7
-rw-r--r--src/drivers/ao_mma655x.h1
-rw-r--r--src/drivers/ao_mpu6000.c4
-rw-r--r--src/drivers/ao_mpu6000.h2
-rw-r--r--src/drivers/ao_ms5607.c13
-rw-r--r--src/drivers/ao_ms5607.h2
-rw-r--r--src/megametrum-v0.1/ao_pins.h3
-rw-r--r--src/stm/ao_adc_stm.c17
-rw-r--r--src/stm/ao_spi_stm.c199
12 files changed, 151 insertions, 112 deletions
diff --git a/src/core/ao_data.h b/src/core/ao_data.h
index 86acd48f..6fdd19cb 100644
--- a/src/core/ao_data.h
+++ b/src/core/ao_data.h
@@ -90,14 +90,7 @@ extern volatile __data uint8_t ao_data_count;
/*
* Mark a section of data as ready, check for data complete
*/
-#define AO_DATA_PRESENT(bit) do { \
- if ((ao_data_present |= (bit)) == AO_DATA_ALL) { \
- ao_data_ring[ao_data_head].tick = ao_tick_count; \
- ao_data_head = ao_data_ring_next(ao_data_head); \
- ao_data_present = 0; \
- ao_wakeup((void *) &ao_data_head); \
- } \
- } while (0);
+#define AO_DATA_PRESENT(bit) (ao_data_present |= (bit))
/*
* Wait until it is time to write a sensor sample; this is
diff --git a/src/drivers/ao_hmc5883.c b/src/drivers/ao_hmc5883.c
index ade6c263..059fc2c8 100644
--- a/src/drivers/ao_hmc5883.c
+++ b/src/drivers/ao_hmc5883.c
@@ -123,12 +123,14 @@ ao_hmc5883_setup(void)
return 1;
}
+struct ao_hmc5883_sample ao_hmc5883_current;
+
static void
ao_hmc5883(void)
{
ao_hmc5883_setup();
for (;;) {
- ao_hmc5883_sample((struct ao_hmc5883_sample *) &ao_data_ring[ao_data_head].hmc5883);
+ ao_hmc5883_sample(&ao_hmc5883_current);
ao_arch_critical(
AO_DATA_PRESENT(AO_DATA_HMC5883);
AO_DATA_WAIT();
diff --git a/src/drivers/ao_hmc5883.h b/src/drivers/ao_hmc5883.h
index 55690978..ff2725eb 100644
--- a/src/drivers/ao_hmc5883.h
+++ b/src/drivers/ao_hmc5883.h
@@ -79,6 +79,8 @@ struct ao_hmc5883_sample {
int16_t x, y, z;
};
+extern struct ao_hmc5883_sample ao_hmc5883_current;
+
void
ao_hmc5883_init(void);
diff --git a/src/drivers/ao_mma655x.c b/src/drivers/ao_mma655x.c
index 005bc684..28fe1e08 100644
--- a/src/drivers/ao_mma655x.c
+++ b/src/drivers/ao_mma655x.c
@@ -238,11 +238,12 @@ ao_mma655x_setup(void)
}
+uint16_t ao_mma655x_current;
+
static void
ao_mma655x_dump(void)
{
- ao_mma655x_setup();
- printf ("MMA655X value %d\n", ao_mma655x_value());
+ printf ("MMA655X value %d\n", ao_mma655x_current);
}
__code struct ao_cmds ao_mma655x_cmds[] = {
@@ -255,7 +256,7 @@ ao_mma655x(void)
{
ao_mma655x_setup();
for (;;) {
- ao_data_ring[ao_data_head].mma655x = ao_mma655x_value();
+ ao_mma655x_current = ao_mma655x_value();
ao_arch_critical(
AO_DATA_PRESENT(AO_DATA_MMA655X);
AO_DATA_WAIT();
diff --git a/src/drivers/ao_mma655x.h b/src/drivers/ao_mma655x.h
index 9c0c59dc..2d951e07 100644
--- a/src/drivers/ao_mma655x.h
+++ b/src/drivers/ao_mma655x.h
@@ -78,6 +78,7 @@
#define AO_MMA655X_COUNT 0x15
#define AO_MMA655X_OFFCORR 0x16
+extern uint16_t ao_mma655x_current;
void
ao_mma655x_init(void);
diff --git a/src/drivers/ao_mpu6000.c b/src/drivers/ao_mpu6000.c
index b3e284e0..49596705 100644
--- a/src/drivers/ao_mpu6000.c
+++ b/src/drivers/ao_mpu6000.c
@@ -240,13 +240,15 @@ ao_mpu6000_setup(void)
ao_mpu6000_configured = 1;
}
+struct ao_mpu6000_sample ao_mpu6000_current;
+
static void
ao_mpu6000(void)
{
ao_mpu6000_setup();
for (;;)
{
- ao_mpu6000_sample((struct ao_mpu6000_sample *) &ao_data_ring[ao_data_head].mpu6000);
+ ao_mpu6000_sample(&ao_mpu6000_current);
ao_arch_critical(
AO_DATA_PRESENT(AO_DATA_MPU6000);
AO_DATA_WAIT();
diff --git a/src/drivers/ao_mpu6000.h b/src/drivers/ao_mpu6000.h
index 5c0cee1b..6aada9a9 100644
--- a/src/drivers/ao_mpu6000.h
+++ b/src/drivers/ao_mpu6000.h
@@ -158,6 +158,8 @@ struct ao_mpu6000_sample {
int16_t gyro_z;
};
+extern struct ao_mpu6000_sample ao_mpu6000_current;
+
void
ao_mpu6000_init(void);
diff --git a/src/drivers/ao_ms5607.c b/src/drivers/ao_ms5607.c
index fdd2c31e..077a40e6 100644
--- a/src/drivers/ao_ms5607.c
+++ b/src/drivers/ao_ms5607.c
@@ -170,13 +170,15 @@ ao_ms5607_sample(struct ao_ms5607_sample *sample)
#include "ao_ms5607_convert.c"
#if HAS_TASK
+struct ao_ms5607_sample ao_ms5607_current;
+
static void
ao_ms5607(void)
{
ao_ms5607_setup();
for (;;)
{
- ao_ms5607_sample((struct ao_ms5607_sample *) &ao_data_ring[ao_data_head].ms5607_raw);
+ ao_ms5607_sample(&ao_ms5607_current);
ao_arch_critical(
AO_DATA_PRESENT(AO_DATA_MS5607);
AO_DATA_WAIT();
@@ -202,14 +204,11 @@ ao_ms5607_info(void)
static void
ao_ms5607_dump(void)
{
- struct ao_ms5607_sample sample;
struct ao_ms5607_value value;
- ao_ms5607_setup();
- ao_ms5607_sample(&sample);
- ao_ms5607_convert(&sample, &value);
- printf ("Pressure: %8u %8d\n", sample.pres, value.pres);
- printf ("Temperature: %8u %8d\n", sample.temp, value.temp);
+ ao_ms5607_convert(&ao_ms5607_current, &value);
+ printf ("Pressure: %8u %8d\n", ao_ms5607_current.pres, value.pres);
+ printf ("Temperature: %8u %8d\n", ao_ms5607_current.temp, value.temp);
printf ("Altitude: %ld\n", ao_pa_to_altitude(value.pres));
}
diff --git a/src/drivers/ao_ms5607.h b/src/drivers/ao_ms5607.h
index 5c31fd8b..b2f98a59 100644
--- a/src/drivers/ao_ms5607.h
+++ b/src/drivers/ao_ms5607.h
@@ -56,6 +56,8 @@ struct ao_ms5607_value {
int32_t temp; /* in °C * 100 */
};
+extern struct ao_ms5607_sample ao_ms5607_current;
+
void
ao_ms5607_setup(void);
diff --git a/src/megametrum-v0.1/ao_pins.h b/src/megametrum-v0.1/ao_pins.h
index af8eebae..e4c8c8fb 100644
--- a/src/megametrum-v0.1/ao_pins.h
+++ b/src/megametrum-v0.1/ao_pins.h
@@ -105,8 +105,6 @@
#define HAS_GPS 1
#define HAS_FLIGHT 1
#define HAS_ADC 1
-#define HAS_ACCEL 1
-#define HAS_ACCEL_REF 1
#define HAS_LOG 1
/*
@@ -248,6 +246,7 @@ struct ao_adc {
* Pressure sensor settings
*/
#define HAS_MS5607 1
+#define HAS_MS5611 0
#define AO_MS5607_PRIVATE_PINS 1
#define AO_MS5607_CS_PORT (&stm_gpioc)
#define AO_MS5607_CS_PIN 4
diff --git a/src/stm/ao_adc_stm.c b/src/stm/ao_adc_stm.c
index 18ca6ea0..48fc4262 100644
--- a/src/stm/ao_adc_stm.c
+++ b/src/stm/ao_adc_stm.c
@@ -43,6 +43,23 @@ static void ao_adc_done(int index)
{
AO_DATA_PRESENT(AO_DATA_ADC);
ao_dma_done_transfer(STM_DMA_INDEX(STM_DMA_CHANNEL_ADC1));
+ if (ao_data_present == AO_DATA_ALL) {
+#if HAS_MS5607
+ ao_data_ring[ao_data_head].ms5607_raw = ao_ms5607_current;
+#endif
+#if HAS_MMA655X
+ ao_data_ring[ao_data_head].mma655x = ao_mma655x_current;
+#endif
+#if HAS_HMC5883
+ ao_data_ring[ao_data_head].hmc5883 = ao_hmc5883_current;
+#endif
+#if HAS_MPU6000
+ ao_data_ring[ao_data_head].mpu6000 = ao_mpu6000_current;
+#endif
+ ao_data_ring[ao_data_head].tick = ao_tick_count;
+ ao_data_head = ao_data_ring_next(ao_data_head);
+ ao_wakeup((void *) &ao_data_head);
+ }
ao_adc_ready = 1;
}
diff --git a/src/stm/ao_spi_stm.c b/src/stm/ao_spi_stm.c
index ade86a27..599d7ee0 100644
--- a/src/stm/ao_spi_stm.c
+++ b/src/stm/ao_spi_stm.c
@@ -24,7 +24,7 @@ struct ao_spi_stm_info {
};
static uint8_t ao_spi_mutex[STM_NUM_SPI];
-static uint8_t ao_spi_config[STM_NUM_SPI];
+static uint8_t ao_spi_index[STM_NUM_SPI];
static const struct ao_spi_stm_info ao_spi_stm_info[STM_NUM_SPI] = {
{
@@ -267,97 +267,100 @@ ao_spi_duplex(void *out, void *in, uint16_t len, uint8_t spi_index)
ao_dma_done_transfer(miso_dma_index);
}
-void
-ao_spi_get(uint8_t spi_index, uint32_t speed)
+static void
+ao_spi_disable_index(uint8_t spi_index)
{
- struct stm_spi *stm_spi = ao_spi_stm_info[AO_SPI_INDEX(spi_index)].stm_spi;
- uint8_t config = AO_SPI_CONFIG(spi_index);
-
- ao_mutex_get(&ao_spi_mutex[AO_SPI_INDEX(spi_index)]);
- if (config != ao_spi_config[AO_SPI_INDEX(spi_index)]) {
-
- /* Disable current config
- */
- switch (AO_SPI_INDEX(spi_index)) {
- case STM_SPI_INDEX(1):
- switch (ao_spi_config[AO_SPI_INDEX(spi_index)]) {
- case AO_SPI_1_CONFIG_PA5_PA6_PA7:
- stm_gpio_set(&stm_gpioa, 5, 0);
- stm_moder_set(&stm_gpioa, 5, STM_MODER_OUTPUT);
- stm_moder_set(&stm_gpioa, 6, STM_MODER_INPUT);
- stm_moder_set(&stm_gpioa, 7, STM_MODER_OUTPUT);
- break;
- case AO_SPI_1_CONFIG_PB3_PB4_PB5:
- stm_gpio_set(&stm_gpiob, 3, 0);
- stm_moder_set(&stm_gpiob, 3, STM_MODER_OUTPUT);
- stm_moder_set(&stm_gpiob, 4, STM_MODER_INPUT);
- stm_moder_set(&stm_gpiob, 5, STM_MODER_OUTPUT);
- break;
- case AO_SPI_1_CONFIG_PE13_PE14_PE15:
- stm_gpio_set(&stm_gpioe, 13, 0);
- stm_moder_set(&stm_gpioe, 13, STM_MODER_OUTPUT);
- stm_moder_set(&stm_gpioe, 14, STM_MODER_INPUT);
- stm_moder_set(&stm_gpioe, 15, STM_MODER_OUTPUT);
- break;
- }
+ /* Disable current config
+ */
+ switch (AO_SPI_INDEX(spi_index)) {
+ case STM_SPI_INDEX(1):
+ switch (spi_index) {
+ case AO_SPI_1_PA5_PA6_PA7:
+ stm_gpio_set(&stm_gpioa, 5, 1);
+ stm_moder_set(&stm_gpioa, 5, STM_MODER_OUTPUT);
+ stm_moder_set(&stm_gpioa, 6, STM_MODER_INPUT);
+ stm_moder_set(&stm_gpioa, 7, STM_MODER_OUTPUT);
+ break;
+ case AO_SPI_1_PB3_PB4_PB5:
+ stm_gpio_set(&stm_gpiob, 3, 1);
+ stm_moder_set(&stm_gpiob, 3, STM_MODER_OUTPUT);
+ stm_moder_set(&stm_gpiob, 4, STM_MODER_INPUT);
+ stm_moder_set(&stm_gpiob, 5, STM_MODER_OUTPUT);
break;
- case STM_SPI_INDEX(2):
- switch (ao_spi_config[AO_SPI_INDEX(spi_index)]) {
- case AO_SPI_2_CONFIG_PB13_PB14_PB15:
- stm_gpio_set(&stm_gpiob, 13, 0);
- stm_moder_set(&stm_gpiob, 13, STM_MODER_OUTPUT);
- stm_moder_set(&stm_gpiob, 14, STM_MODER_INPUT);
- stm_moder_set(&stm_gpiob, 15, STM_MODER_OUTPUT);
- break;
- case AO_SPI_2_CONFIG_PD1_PD3_PD4:
- stm_gpio_set(&stm_gpiod, 1, 0);
- stm_moder_set(&stm_gpiod, 1, STM_MODER_OUTPUT);
- stm_moder_set(&stm_gpiod, 3, STM_MODER_INPUT);
- stm_moder_set(&stm_gpiod, 4, STM_MODER_OUTPUT);
- break;
- }
+ case AO_SPI_1_PE13_PE14_PE15:
+ stm_gpio_set(&stm_gpioe, 13, 1);
+ stm_moder_set(&stm_gpioe, 13, STM_MODER_OUTPUT);
+ stm_moder_set(&stm_gpioe, 14, STM_MODER_INPUT);
+ stm_moder_set(&stm_gpioe, 15, STM_MODER_OUTPUT);
break;
}
+ break;
+ case STM_SPI_INDEX(2):
+ switch (spi_index) {
+ case AO_SPI_2_PB13_PB14_PB15:
+ stm_gpio_set(&stm_gpiob, 13, 1);
+ stm_moder_set(&stm_gpiob, 13, STM_MODER_OUTPUT);
+ stm_moder_set(&stm_gpiob, 14, STM_MODER_INPUT);
+ stm_moder_set(&stm_gpiob, 15, STM_MODER_OUTPUT);
+ break;
+ case AO_SPI_2_PD1_PD3_PD4:
+ stm_gpio_set(&stm_gpiod, 1, 1);
+ stm_moder_set(&stm_gpiod, 1, STM_MODER_OUTPUT);
+ stm_moder_set(&stm_gpiod, 3, STM_MODER_INPUT);
+ stm_moder_set(&stm_gpiod, 4, STM_MODER_OUTPUT);
+ break;
+ }
+ break;
+ }
+}
- /* Enable new config
- */
- switch (AO_SPI_INDEX(spi_index)) {
- case 0:
- switch (AO_SPI_CONFIG(spi_index)) {
- case AO_SPI_1_CONFIG_PA5_PA6_PA7:
- stm_afr_set(&stm_gpioa, 5, STM_AFR_AF5);
- stm_afr_set(&stm_gpioa, 6, STM_AFR_AF5);
- stm_afr_set(&stm_gpioa, 7, STM_AFR_AF5);
- break;
- case AO_SPI_1_CONFIG_PB3_PB4_PB5:
- stm_afr_set(&stm_gpiob, 3, STM_AFR_AF5);
- stm_afr_set(&stm_gpiob, 4, STM_AFR_AF5);
- stm_afr_set(&stm_gpiob, 5, STM_AFR_AF5);
- break;
- case AO_SPI_1_CONFIG_PE13_PE14_PE15:
- stm_afr_set(&stm_gpioe, 13, STM_AFR_AF5);
- stm_afr_set(&stm_gpioe, 14, STM_AFR_AF5);
- stm_afr_set(&stm_gpioe, 15, STM_AFR_AF5);
- break;
- }
+static void
+ao_spi_enable_index(uint8_t spi_index)
+{
+ switch (AO_SPI_INDEX(spi_index)) {
+ case STM_SPI_INDEX(1):
+ switch (spi_index) {
+ case AO_SPI_1_PA5_PA6_PA7:
+ stm_afr_set(&stm_gpioa, 5, STM_AFR_AF5);
+ stm_afr_set(&stm_gpioa, 6, STM_AFR_AF5);
+ stm_afr_set(&stm_gpioa, 7, STM_AFR_AF5);
+ break;
+ case AO_SPI_1_PB3_PB4_PB5:
+ stm_afr_set(&stm_gpiob, 3, STM_AFR_AF5);
+ stm_afr_set(&stm_gpiob, 4, STM_AFR_AF5);
+ stm_afr_set(&stm_gpiob, 5, STM_AFR_AF5);
+ break;
+ case AO_SPI_1_PE13_PE14_PE15:
+ stm_afr_set(&stm_gpioe, 13, STM_AFR_AF5);
+ stm_afr_set(&stm_gpioe, 14, STM_AFR_AF5);
+ stm_afr_set(&stm_gpioe, 15, STM_AFR_AF5);
break;
- case 1:
- switch (AO_SPI_CONFIG(spi_index)) {
- case AO_SPI_2_CONFIG_PB13_PB14_PB15:
- stm_afr_set(&stm_gpiob, 13, STM_AFR_AF5);
- stm_afr_set(&stm_gpiob, 14, STM_AFR_AF5);
- stm_afr_set(&stm_gpiob, 15, STM_AFR_AF5);
- break;
- case AO_SPI_2_CONFIG_PD1_PD3_PD4:
- stm_afr_set(&stm_gpiod, 1, STM_AFR_AF5);
- stm_afr_set(&stm_gpiod, 3, STM_AFR_AF5);
- stm_afr_set(&stm_gpiod, 4, STM_AFR_AF5);
- break;
- }
+ }
+ break;
+ case STM_SPI_INDEX(2):
+ switch (spi_index) {
+ case AO_SPI_2_PB13_PB14_PB15:
+ stm_afr_set(&stm_gpiob, 13, STM_AFR_AF5);
+ stm_afr_set(&stm_gpiob, 14, STM_AFR_AF5);
+ stm_afr_set(&stm_gpiob, 15, STM_AFR_AF5);
+ break;
+ case AO_SPI_2_PD1_PD3_PD4:
+ stm_afr_set(&stm_gpiod, 1, STM_AFR_AF5);
+ stm_afr_set(&stm_gpiod, 3, STM_AFR_AF5);
+ stm_afr_set(&stm_gpiod, 4, STM_AFR_AF5);
break;
}
- ao_spi_config[AO_SPI_INDEX(spi_index)] = AO_SPI_CONFIG(spi_index);
+ break;
}
+}
+
+void
+ao_spi_get(uint8_t spi_index, uint32_t speed)
+{
+ uint8_t id = AO_SPI_INDEX(spi_index);
+ struct stm_spi *stm_spi = ao_spi_stm_info[id].stm_spi;
+
+ ao_mutex_get(&ao_spi_mutex[id]);
stm_spi->cr1 = ((0 << STM_SPI_CR1_BIDIMODE) | /* Three wire mode */
(0 << STM_SPI_CR1_BIDIOE) |
(0 << STM_SPI_CR1_CRCEN) | /* CRC disabled */
@@ -372,21 +375,39 @@ ao_spi_get(uint8_t spi_index, uint32_t speed)
(1 << STM_SPI_CR1_MSTR) |
(0 << STM_SPI_CR1_CPOL) | /* Format 0 */
(0 << STM_SPI_CR1_CPHA));
+ if (spi_index != ao_spi_index[id]) {
+
+ /* Disable old config
+ */
+ ao_spi_disable_index(ao_spi_index[id]);
+
+ /* Enable new config
+ */
+ ao_spi_enable_index(spi_index);
+
+ /* Remember current config
+ */
+ ao_spi_index[id] = spi_index;
+ }
}
void
ao_spi_put(uint8_t spi_index)
{
- struct stm_spi *stm_spi = ao_spi_stm_info[AO_SPI_INDEX(spi_index)].stm_spi;
+ uint8_t id = AO_SPI_INDEX(spi_index);
+ struct stm_spi *stm_spi = ao_spi_stm_info[id].stm_spi;
stm_spi->cr1 = 0;
- ao_mutex_put(&ao_spi_mutex[AO_SPI_INDEX(spi_index)]);
+ ao_mutex_put(&ao_spi_mutex[id]);
}
static void
ao_spi_channel_init(uint8_t spi_index)
{
- struct stm_spi *stm_spi = ao_spi_stm_info[AO_SPI_INDEX(spi_index)].stm_spi;
+ uint8_t id = AO_SPI_INDEX(spi_index);
+ struct stm_spi *stm_spi = ao_spi_stm_info[id].stm_spi;
+
+ ao_spi_disable_index(spi_index);
stm_spi->cr1 = 0;
(void) stm_spi->sr;
@@ -412,7 +433,7 @@ ao_spi_init(void)
stm_rcc.ahbenr |= (1 << STM_RCC_AHBENR_GPIOEEN);
# endif
stm_rcc.apb2enr |= (1 << STM_RCC_APB2ENR_SPI1EN);
- ao_spi_config[0] = AO_SPI_CONFIG_NONE;
+ ao_spi_index[0] = AO_SPI_CONFIG_NONE;
ao_spi_channel_init(0);
#endif
@@ -423,10 +444,8 @@ ao_spi_init(void)
# if SPI_2_PD1_PD3_PD4
stm_rcc.ahbenr |= (1 << STM_RCC_AHBENR_GPIODEN);
# endif
-
stm_rcc.apb1enr |= (1 << STM_RCC_APB1ENR_SPI2EN);
- ao_spi_config[1] = AO_SPI_CONFIG_NONE;
-
+ ao_spi_index[1] = AO_SPI_CONFIG_NONE;
ao_spi_channel_init(1);
#endif
}