diff options
| author | Bdale Garbee <bdale@gag.com> | 2013-05-16 00:36:23 -0600 | 
|---|---|---|
| committer | Bdale Garbee <bdale@gag.com> | 2013-05-16 00:36:23 -0600 | 
| commit | 02d111b1b53ef01fc6e9ab6c4bc60b8af1be0067 (patch) | |
| tree | 8356f4a019969ee99a45e264c87d38555cf316cc /src/drivers/ao_ms5607.c | |
| parent | 7a2e1f05adad990a6b161865267abf07ffec7a7e (diff) | |
| parent | 7699a55aed3a9a7daeb4c6a5a9a280f43edf455f (diff) | |
Merge branch 'branch-1.2' into debian
Diffstat (limited to 'src/drivers/ao_ms5607.c')
| -rw-r--r-- | src/drivers/ao_ms5607.c | 105 | 
1 files changed, 45 insertions, 60 deletions
diff --git a/src/drivers/ao_ms5607.c b/src/drivers/ao_ms5607.c index 704b4583..bd57400e 100644 --- a/src/drivers/ao_ms5607.c +++ b/src/drivers/ao_ms5607.c @@ -17,9 +17,9 @@  #include <ao.h>  #include <ao_exti.h> -#include "ao_ms5607.h" +#include <ao_ms5607.h> -#if HAS_MS5607 +#if HAS_MS5607 || HAS_MS5611  static struct ao_ms5607_prom	ms5607_prom;  static uint8_t	  		ms5607_configured; @@ -27,12 +27,12 @@ static uint8_t	  		ms5607_configured;  static void  ao_ms5607_start(void) {  	ao_spi_get(AO_MS5607_SPI_INDEX,AO_SPI_SPEED_FAST); -	stm_gpio_set(AO_MS5607_CS_PORT, AO_MS5607_CS_PIN, 0); +	ao_gpio_set(AO_MS5607_CS_PORT, AO_MS5607_CS_PIN, AO_MS5607_CS, 0);  }  static void  ao_ms5607_stop(void) { -	stm_gpio_set(AO_MS5607_CS_PORT, AO_MS5607_CS_PIN, 1); +	ao_gpio_set(AO_MS5607_CS_PORT, AO_MS5607_CS_PIN, AO_MS5607_CS, 1);  	ao_spi_put(AO_MS5607_SPI_INDEX);  } @@ -53,7 +53,6 @@ ao_ms5607_crc(uint8_t *prom)  	uint8_t		crc_byte = prom[15];  	uint8_t 	cnt;  	uint16_t	n_rem = 0; -	uint16_t	crc_read;  	uint8_t		n_bit;  	prom[15] = 0; @@ -89,10 +88,12 @@ ao_ms5607_prom_read(struct ao_ms5607_prom *prom)  	}  	crc = ao_ms5607_crc((uint8_t *) prom);  	if (crc != (((uint8_t *) prom)[15] & 0xf)) { +#if HAS_TASK  		printf ("MS5607 PROM CRC error (computed %x actual %x)\n",  			crc, (((uint8_t *) prom)[15] & 0xf));  		flush(); -//		ao_panic(AO_PANIC_SELF_TEST_MS5607); +#endif +		ao_panic(AO_PANIC_SELF_TEST_MS5607);  	}  #if __BYTE_ORDER == __LITTLE_ENDIAN @@ -105,7 +106,7 @@ ao_ms5607_prom_read(struct ao_ms5607_prom *prom)  #endif  } -static void +void  ao_ms5607_setup(void)  {  	if (ms5607_configured) @@ -115,34 +116,35 @@ ao_ms5607_setup(void)  	ao_ms5607_prom_read(&ms5607_prom);  } -static uint8_t	ao_ms5607_done; +static volatile uint8_t	ao_ms5607_done;  static void  ao_ms5607_isr(void)  {  	ao_exti_disable(AO_MS5607_MISO_PORT, AO_MS5607_MISO_PIN);  	ao_ms5607_done = 1; -	ao_wakeup(&ao_ms5607_done); +	ao_wakeup((void *) &ao_ms5607_done);  }  static uint32_t  ao_ms5607_get_sample(uint8_t cmd) {  	uint8_t	reply[3];  	uint8_t read; -	uint16_t now;  	ao_ms5607_done = 0;  	ao_ms5607_start();  	ao_spi_send(&cmd, 1, AO_MS5607_SPI_INDEX); +  	ao_exti_enable(AO_MS5607_MISO_PORT, AO_MS5607_MISO_PIN); +  #if AO_MS5607_PRIVATE_PINS  	ao_spi_put(AO_MS5607_SPI_INDEX);  #endif -	cli(); +	ao_arch_block_interrupts();  	while (!ao_ms5607_done) -		ao_sleep(&ao_ms5607_done); -	sei(); +		ao_sleep((void *) &ao_ms5607_done); +	ao_arch_release_interrupts();  #if AO_MS5607_PRIVATE_PINS  	stm_gpio_set(AO_MS5607_CS_PORT, AO_MS5607_CS_PIN, 1);  #else @@ -158,50 +160,31 @@ ao_ms5607_get_sample(uint8_t cmd) {  	return ((uint32_t) reply[0] << 16) | ((uint32_t) reply[1] << 8) | (uint32_t) reply[2];  } +#ifndef AO_MS5607_BARO_OVERSAMPLE +#define AO_MS5607_BARO_OVERSAMPLE	2048 +#endif + +#ifndef AO_MS5607_TEMP_OVERSAMPLE +#define AO_MS5607_TEMP_OVERSAMPLE	AO_MS5607_BARO_OVERSAMPLE +#endif + +#define token_paster(x,y)	x ## y +#define token_evaluator(x,y)	token_paster(x,y) + +#define AO_CONVERT_D1	token_evaluator(AO_MS5607_CONVERT_D1_, AO_MS5607_BARO_OVERSAMPLE) +#define AO_CONVERT_D2	token_evaluator(AO_MS5607_CONVERT_D2_, AO_MS5607_TEMP_OVERSAMPLE) +  void  ao_ms5607_sample(struct ao_ms5607_sample *sample)  { -	sample->pres = ao_ms5607_get_sample(AO_MS5607_CONVERT_D1_2048); -	sample->temp = ao_ms5607_get_sample(AO_MS5607_CONVERT_D2_2048); +	sample->pres = ao_ms5607_get_sample(AO_CONVERT_D1); +	sample->temp = ao_ms5607_get_sample(AO_CONVERT_D2);  } -void -ao_ms5607_convert(struct ao_ms5607_sample *sample, struct ao_ms5607_value *value) -{ -	uint8_t	addr; -	int32_t	dT; -	int32_t TEMP; -	int64_t OFF; -	int64_t SENS; -	int32_t P; - -	dT = sample->temp - ((int32_t) ms5607_prom.tref << 8); -	 -	TEMP = 2000 + (((int64_t) dT * ms5607_prom.tempsens) >> 23); - -	OFF = ((int64_t) ms5607_prom.off << 17) + (((int64_t) ms5607_prom.tco * dT) >> 6); - -	SENS = ((int64_t) ms5607_prom.sens << 16) + (((int64_t) ms5607_prom.tcs * dT) >> 7); - -	if (TEMP < 2000) { -		int32_t	T2 = ((int64_t) dT * (int64_t) dT) >> 31; -		int32_t TEMPM = TEMP - 2000; -		int64_t OFF2 = (61 * (int64_t) TEMPM * (int64_t) TEMPM) >> 4; -		int64_t SENS2 = 2 * (int64_t) TEMPM * (int64_t) TEMPM; -		if (TEMP < 1500) { -			int32_t TEMPP = TEMP + 1500; -			int64_t TEMPP2 = TEMPP * TEMPP; -			OFF2 = OFF2 + 15 * TEMPP2; -			SENS2 = SENS2 + 8 * TEMPP2; -		} -		TEMP -= T2; -		OFF -= OFF2; -		SENS -= SENS2; -	} +#include "ao_ms5607_convert.c" -	value->pres = ((((int64_t) sample->pres * SENS) >> 21) - OFF) >> 15; -	value->temp = TEMP; -} +#if HAS_TASK +struct ao_ms5607_sample	ao_ms5607_current;  static void  ao_ms5607(void) @@ -209,7 +192,7 @@ 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(); @@ -235,14 +218,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));  } @@ -250,15 +230,18 @@ __code struct ao_cmds ao_ms5607_cmds[] = {  	{ ao_ms5607_dump,	"B\0Display MS5607 data" },  	{ 0, NULL },  }; +#endif /* HAS_TASK */  void  ao_ms5607_init(void)  {  	ms5607_configured = 0; -	ao_cmd_register(&ao_ms5607_cmds[0]);  	ao_spi_init_cs(AO_MS5607_CS_PORT, (1 << AO_MS5607_CS_PIN)); -//	ao_add_task(&ao_ms5607_task, ao_ms5607, "ms5607"); +#if HAS_TASK +	ao_cmd_register(&ao_ms5607_cmds[0]); +	ao_add_task(&ao_ms5607_task, ao_ms5607, "ms5607"); +#endif  	/* Configure the MISO pin as an interrupt; when the  	 * conversion is complete, the MS5607 will raise this @@ -269,12 +252,14 @@ ao_ms5607_init(void)  		      AO_EXTI_MODE_RISING,  		      ao_ms5607_isr); +#ifdef STM_MODER_ALTERNATE  	/* Reset the pin from INPUT to ALTERNATE so that SPI works  	 * This needs an abstraction at some point...  	 */  	stm_moder_set(AO_MS5607_MISO_PORT,  		      AO_MS5607_MISO_PIN,  		      STM_MODER_ALTERNATE); +#endif  }  #endif  | 
