X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=src%2Fdrivers%2Fao_ms5607.c;h=4bfc17db8016f1adaeb0f7d2cc2eaf842e7f30c8;hp=ef31882ef4ff818628f27e66c458922fdf536140;hb=6023ff81f1bbd240169b9548209133d3b02d475f;hpb=cfb91ec7ef6ef485d813af96a0f206bb7a2204dd diff --git a/src/drivers/ao_ms5607.c b/src/drivers/ao_ms5607.c index ef31882e..4bfc17db 100644 --- a/src/drivers/ao_ms5607.c +++ b/src/drivers/ao_ms5607.c @@ -3,7 +3,8 @@ * * 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. + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of @@ -44,7 +45,7 @@ ao_ms5607_reset(void) { cmd = AO_MS5607_RESET; ao_ms5607_start(); - ao_spi_send(DATA_TO_XDATA(&cmd), 1, AO_MS5607_SPI_INDEX); + ao_spi_send(&cmd, 1, AO_MS5607_SPI_INDEX); ao_delay(AO_MS_TO_TICKS(10)); ao_ms5607_stop(); } @@ -56,10 +57,11 @@ ao_ms5607_crc(uint8_t *prom) uint8_t cnt; uint16_t n_rem = 0; uint8_t n_bit; + uint8_t *p = prom; prom[15] = 0; for (cnt = 0; cnt < 16; cnt++) { - n_rem ^= prom[cnt]; + n_rem ^= *p++; for (n_bit = 8; n_bit > 0; n_bit--) { if (n_rem & 0x8000) n_rem = (n_rem << 1) ^ 0x3000; @@ -72,38 +74,56 @@ ao_ms5607_crc(uint8_t *prom) return n_rem; } +static int +ao_ms5607_prom_valid(uint8_t *prom) +{ + uint8_t crc; + int i; + uint8_t *p; + + /* Look for a value other than 0x0000 or 0xffff */ + p = prom; + for (i = 0; i < 16; i++) + if (*p++ + 1 > 1) + break; + if (i == 16) + return FALSE; + + crc = ao_ms5607_crc(prom); + if (crc != (prom[15] & 0xf)) + return FALSE; + + return TRUE; +} + static void ao_ms5607_prom_read(__xdata struct ao_ms5607_prom *prom) { - uint8_t addr; - uint8_t crc; - __xdata uint16_t *r; + uint8_t addr; + uint16_t *r; 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(DATA_TO_XDATA(&cmd), 1, AO_MS5607_SPI_INDEX); + ao_spi_send(&cmd, 1, AO_MS5607_SPI_INDEX); ao_spi_recv(r, 2, AO_MS5607_SPI_INDEX); ao_ms5607_stop(); r++; } - 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(); -#endif + + if (!ao_ms5607_prom_valid((uint8_t *) prom)) ao_panic(AO_PANIC_SELF_TEST_MS5607); - } #if __BYTE_ORDER == __LITTLE_ENDIAN /* Byte swap */ r = (uint16_t *) prom; for (addr = 0; addr < 8; addr++) { - uint16_t t = *r; - *r++ = (t << 8) | (t >> 8); + uint8_t *t = (uint8_t *) r; + uint8_t a = t[0]; + t[0] = t[1]; + t[1] = a; + r++; } #endif } @@ -136,7 +156,7 @@ ao_ms5607_get_sample(uint8_t cmd) { ao_ms5607_done = 0; ao_ms5607_start(); - ao_spi_send(DATA_TO_XDATA(&cmd), 1, AO_MS5607_SPI_INDEX); + ao_spi_send(&cmd, 1, AO_MS5607_SPI_INDEX); ao_exti_enable(AO_MS5607_MISO_PORT, AO_MS5607_MISO_PIN); @@ -190,17 +210,23 @@ ao_ms5607_sample(__xdata struct ao_ms5607_sample *sample) #include "ao_ms5607_convert.c" #endif -#if HAS_TASK +#ifndef HAS_MS5607_TASK +#define HAS_MS5607_TASK HAS_TASK +#endif + __xdata struct ao_ms5607_sample ao_ms5607_current; +#if HAS_MS5607_TASK static void ao_ms5607(void) { + struct ao_ms5607_sample sample; ao_ms5607_setup(); for (;;) { - ao_ms5607_sample(&ao_ms5607_current); + ao_ms5607_sample(&sample); ao_arch_block_interrupts(); + ao_ms5607_current = sample; AO_DATA_PRESENT(AO_DATA_MS5607); AO_DATA_WAIT(); ao_arch_release_interrupts(); @@ -208,7 +234,9 @@ ao_ms5607(void) } __xdata struct ao_task ao_ms5607_task; +#endif +#if HAS_TASK void ao_ms5607_info(void) { @@ -247,6 +275,8 @@ ao_ms5607_init(void) #if HAS_TASK ao_cmd_register(&ao_ms5607_cmds[0]); +#endif +#if HAS_MS5607_TASK ao_add_task(&ao_ms5607_task, ao_ms5607, "ms5607"); #endif