diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/ao_data.h | 9 | ||||
| -rw-r--r-- | src/drivers/ao_hmc5883.c | 4 | ||||
| -rw-r--r-- | src/drivers/ao_hmc5883.h | 2 | ||||
| -rw-r--r-- | src/drivers/ao_mma655x.c | 7 | ||||
| -rw-r--r-- | src/drivers/ao_mma655x.h | 1 | ||||
| -rw-r--r-- | src/drivers/ao_mpu6000.c | 4 | ||||
| -rw-r--r-- | src/drivers/ao_mpu6000.h | 2 | ||||
| -rw-r--r-- | src/drivers/ao_ms5607.c | 13 | ||||
| -rw-r--r-- | src/drivers/ao_ms5607.h | 2 | ||||
| -rw-r--r-- | src/megametrum-v0.1/ao_pins.h | 4 | ||||
| -rw-r--r-- | src/stm/ao_adc_stm.c | 17 | ||||
| -rw-r--r-- | src/stm/ao_spi_stm.c | 199 | 
12 files changed, 152 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..724878b5 100644 --- a/src/megametrum-v0.1/ao_pins.h +++ b/src/megametrum-v0.1/ao_pins.h @@ -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 @@ -105,8 +107,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  /* 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  } | 
