diff options
Diffstat (limited to 'src/drivers')
| -rw-r--r-- | src/drivers/ao_ms5607.c | 40 | ||||
| -rw-r--r-- | src/drivers/ao_ms5607.h | 2 | ||||
| -rw-r--r-- | src/drivers/ao_ms5607_convert_8051.c | 60 | 
3 files changed, 83 insertions, 19 deletions
diff --git a/src/drivers/ao_ms5607.c b/src/drivers/ao_ms5607.c index 8f1dcbe1..5259b265 100644 --- a/src/drivers/ao_ms5607.c +++ b/src/drivers/ao_ms5607.c @@ -21,7 +21,7 @@  #if HAS_MS5607 || HAS_MS5611 -static struct ao_ms5607_prom	ms5607_prom; +static __xdata struct ao_ms5607_prom	ms5607_prom;  static uint8_t	  		ms5607_configured;  static void @@ -40,7 +40,7 @@ ao_ms5607_reset(void) {  	cmd = AO_MS5607_RESET;  	ao_ms5607_start(); -	ao_spi_send(&cmd, 1, AO_MS5607_SPI_INDEX); +	ao_spi_send(DATA_TO_XDATA(&cmd), 1, AO_MS5607_SPI_INDEX);  	ao_delay(AO_MS_TO_TICKS(10));  	ao_ms5607_stop();  } @@ -69,17 +69,17 @@ ao_ms5607_crc(uint8_t *prom)  }  static void -ao_ms5607_prom_read(struct ao_ms5607_prom *prom) +ao_ms5607_prom_read(__xdata struct ao_ms5607_prom *prom)  { -	uint8_t		addr; -	uint8_t		crc; -	uint16_t	*r; +	uint8_t			addr; +	uint8_t			crc; +	__xdata uint16_t	*r; -	r = (uint16_t *) prom; +	r = (__xdata uint16_t *) prom;  	for (addr = 0; addr < 8; addr++) {  		uint8_t	cmd = AO_MS5607_PROM_READ(addr);  		ao_ms5607_start(); -		ao_spi_send(&cmd, 1, AO_MS5607_SPI_INDEX); +		ao_spi_send(DATA_TO_XDATA(&cmd), 1, AO_MS5607_SPI_INDEX);  		ao_spi_recv(r, 2, AO_MS5607_SPI_INDEX);  		ao_ms5607_stop();  		r++; @@ -114,25 +114,25 @@ ao_ms5607_setup(void)  	ao_ms5607_prom_read(&ms5607_prom);  } -static volatile uint8_t	ao_ms5607_done; +static __xdata 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((void *) &ao_ms5607_done); +	ao_wakeup((__xdata void *) &ao_ms5607_done);  }  static uint32_t  ao_ms5607_get_sample(uint8_t cmd) { -	uint8_t	reply[3]; -	uint8_t read; +	__xdata uint8_t	reply[3]; +	__xdata uint8_t read;  	ao_ms5607_done = 0;  	ao_ms5607_start(); -	ao_spi_send(&cmd, 1, AO_MS5607_SPI_INDEX); +	ao_spi_send(DATA_TO_XDATA(&cmd), 1, AO_MS5607_SPI_INDEX);  	ao_exti_enable(AO_MS5607_MISO_PORT, AO_MS5607_MISO_PIN); @@ -179,10 +179,14 @@ ao_ms5607_sample(struct ao_ms5607_sample *sample)  	sample->temp = ao_ms5607_get_sample(AO_CONVERT_D2);  } +#ifdef _CC1111_H_ +#include "ao_ms5607_convert_8051.c" +#else  #include "ao_ms5607_convert.c" +#endif  #if HAS_TASK -struct ao_ms5607_sample	ao_ms5607_current; +__xdata struct ao_ms5607_sample	ao_ms5607_current;  static void  ao_ms5607(void) @@ -191,10 +195,10 @@ ao_ms5607(void)  	for (;;)  	{  		ao_ms5607_sample(&ao_ms5607_current); -		ao_arch_critical( -			AO_DATA_PRESENT(AO_DATA_MS5607); -			AO_DATA_WAIT(); -			); +		ao_arch_block_interrupts(); +		AO_DATA_PRESENT(AO_DATA_MS5607); +		AO_DATA_WAIT(); +		ao_arch_release_interrupts();  	}  } diff --git a/src/drivers/ao_ms5607.h b/src/drivers/ao_ms5607.h index b2f98a59..3fd43fd4 100644 --- a/src/drivers/ao_ms5607.h +++ b/src/drivers/ao_ms5607.h @@ -56,7 +56,7 @@ struct ao_ms5607_value {  	int32_t		temp;	/* in °C * 100 */  }; -extern struct ao_ms5607_sample	ao_ms5607_current; +extern __xdata struct ao_ms5607_sample	ao_ms5607_current;  void  ao_ms5607_setup(void); diff --git a/src/drivers/ao_ms5607_convert_8051.c b/src/drivers/ao_ms5607_convert_8051.c new file mode 100644 index 00000000..f47972c9 --- /dev/null +++ b/src/drivers/ao_ms5607_convert_8051.c @@ -0,0 +1,60 @@ +/* + * Copyright © 2012 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +#include <ao_ms5607.h> + +void +ao_ms5607_convert(struct ao_ms5607_sample *sample, struct ao_ms5607_value *value) +{ +#if 0 +	int32_t	dT; +	int32_t TEMP; +	int64_t OFF; +	int64_t SENS; + +	dT = sample->temp - ((int32_t) ms5607_prom.tref << 8); +	 +	TEMP = 2000 + (((int64_t) dT * ms5607_prom.tempsens) >> 23); + +#if HAS_MS5611 +	OFF = ((int64_t) ms5607_prom.off << 16) + (((int64_t) ms5607_prom.tco * dT) >> 7); +	SENS = ((int64_t) ms5607_prom.sens << 15) + (((int64_t) ms5607_prom.tcs * dT) >> 8); +#else +	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); +#endif + +	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; +	} + +	value->pres = ((((int64_t) sample->pres * SENS) >> 21) - OFF) >> 15; +	value->temp = TEMP; +#endif +}  | 
