Merge branch 'master' into mm-ms5611
authorKeith Packard <keithp@keithp.com>
Thu, 18 Oct 2012 22:18:52 +0000 (15:18 -0700)
committerKeith Packard <keithp@keithp.com>
Thu, 18 Oct 2012 22:18:52 +0000 (15:18 -0700)
Signed-off-by: Keith Packard <keithp@keithp.com>
12 files changed:
src/core/ao_data.h
src/drivers/ao_hmc5883.c
src/drivers/ao_hmc5883.h
src/drivers/ao_mma655x.c
src/drivers/ao_mma655x.h
src/drivers/ao_mpu6000.c
src/drivers/ao_mpu6000.h
src/drivers/ao_ms5607.c
src/drivers/ao_ms5607.h
src/megametrum-v0.1/ao_pins.h
src/stm/ao_adc_stm.c
src/stm/ao_spi_stm.c

index 86acd48fa8c94fe92e076bf7aa15da771c219910..6fdd19cb9b7ca88cc72d1b6fd52073cd3ac032a2 100644 (file)
@@ -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
index ade6c263d84236823d7d366cdb1c42b8b18348c8..059fc2c8d5fb85d75872d9325e34f341f50a5991 100644 (file)
@@ -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();
index 556909784040f9be4fd5979d793d189f5b1ec7ec..ff2725ebdaa6820a10476452576fe25569b3e19b 100644 (file)
@@ -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);
 
index 005bc68461bb27d8fa146e51aa6b05970937e8c4..28fe1e08b1d28b46354ce0200d2954aaacb826d3 100644 (file)
@@ -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();
index 9c0c59dc10d0933bb44a3f4f5d9ab44009c053d4..2d951e07a4a110b01b2cf87b8ebaa0e66c6c82ce 100644 (file)
@@ -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);
index b3e284e0bfb2988f0ff7e40e525c4a892a736704..495967057336ef8930263467cb3cbdfc15850e4f 100644 (file)
@@ -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();
index 5c0cee1b1184e02dcfdcf340e815ae3f4a75cac5..6aada9a927b9ac8da07165667fdab817cfb3b951 100644 (file)
@@ -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);
 
index fdd2c31e5992e4c96e1120d313bb13ba186978b7..077a40e6a02e6b4478e39b9923e021df99d1f00e 100644 (file)
@@ -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));
 }
 
index 5c31fd8b54cae35ab1999dea002bef1a23244b51..b2f98a59d9677397fa60e6a0fa42b94c5c6a8ded 100644 (file)
@@ -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);
 
index af8eebae2e6e4d2f3fe9681d64165a26d579663a..724878b51c6bcfee669cfc7f9d8264f9e1a1a92c 100644 (file)
@@ -18,6 +18,8 @@
 #ifndef _AO_PINS_H_
 #define _AO_PINS_H_
 
+#define HAS_MS5611             1
+
 /* 8MHz High speed external crystal */
 #define AO_HSE                 8000000
 
 #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
 
 /*
index 18ca6ea01885770a2cb18190f3ad20c2481becff..48fc4262f7cb822f298168e7f55d5a9478c757b9 100644 (file)
@@ -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;
 }
 
index ade86a2720c024f59029e8d37f511f9fef19baf8..599d7ee09981694ac4dabea3e695028ec30718be 100644 (file)
@@ -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
 }