X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fdrivers%2Fao_ms5607.c;h=46da4e837fa1e1afa3a5cbdd688d95e60a358b02;hb=79613a403cbb545672afc7b169b3a833d587903a;hp=4bfc17db8016f1adaeb0f7d2cc2eaf842e7f30c8;hpb=6023ff81f1bbd240169b9548209133d3b02d475f;p=fw%2Faltos diff --git a/src/drivers/ao_ms5607.c b/src/drivers/ao_ms5607.c index 4bfc17db..46da4e83 100644 --- a/src/drivers/ao_ms5607.c +++ b/src/drivers/ao_ms5607.c @@ -22,21 +22,19 @@ #if HAS_MS5607 || HAS_MS5611 -__xdata struct ao_ms5607_prom ao_ms5607_prom; -static __xdata uint8_t ms5607_configured; +struct ao_ms5607_prom ao_ms5607_prom; +static uint8_t ms5607_configured; -#ifndef AO_MS5607_SPI_SPEED -#define AO_MS5607_SPI_SPEED AO_SPI_SPEED_FAST -#endif +#define AO_MS5607_SPI_SPEED ao_spi_speed(20000000) static void ao_ms5607_start(void) { - ao_spi_get_bit(AO_MS5607_CS_PORT, AO_MS5607_CS_PIN, AO_MS5607_CS, AO_MS5607_SPI_INDEX, AO_MS5607_SPI_SPEED); + ao_spi_get_bit(AO_MS5607_CS_PORT, AO_MS5607_CS_PIN, AO_MS5607_SPI_INDEX, AO_MS5607_SPI_SPEED); } static void ao_ms5607_stop(void) { - ao_spi_put_bit(AO_MS5607_CS_PORT, AO_MS5607_CS_PIN, AO_MS5607_CS, AO_MS5607_SPI_INDEX); + ao_spi_put_bit(AO_MS5607_CS_PORT, AO_MS5607_CS_PIN, AO_MS5607_SPI_INDEX); } static void @@ -61,20 +59,20 @@ ao_ms5607_crc(uint8_t *prom) prom[15] = 0; for (cnt = 0; cnt < 16; cnt++) { - n_rem ^= *p++; + n_rem ^= (uint16_t) *p++; for (n_bit = 8; n_bit > 0; n_bit--) { if (n_rem & 0x8000) - n_rem = (n_rem << 1) ^ 0x3000; + n_rem = (uint16_t) ((n_rem << 1) ^ 0x3000U); else n_rem = (n_rem << 1); } } n_rem = (n_rem >> 12) & 0xf; prom[15] = crc_byte; - return n_rem; + return (uint8_t) n_rem; } -static int +static bool ao_ms5607_prom_valid(uint8_t *prom) { uint8_t crc; @@ -87,22 +85,22 @@ ao_ms5607_prom_valid(uint8_t *prom) if (*p++ + 1 > 1) break; if (i == 16) - return FALSE; + return false; crc = ao_ms5607_crc(prom); if (crc != (prom[15] & 0xf)) - return FALSE; + return false; - return TRUE; + return true; } static void -ao_ms5607_prom_read(__xdata struct ao_ms5607_prom *prom) +ao_ms5607_prom_read(struct ao_ms5607_prom *prom) { uint8_t addr; uint16_t *r; - r = (__xdata uint16_t *) prom; + r = (uint16_t *) prom; for (addr = 0; addr < 8; addr++) { uint8_t cmd = AO_MS5607_PROM_READ(addr); ao_ms5607_start(); @@ -112,8 +110,14 @@ ao_ms5607_prom_read(__xdata struct ao_ms5607_prom *prom) r++; } - if (!ao_ms5607_prom_valid((uint8_t *) prom)) + + if (!ao_ms5607_prom_valid((uint8_t *) prom)) { +#if HAS_SENSOR_ERRORS + AO_SENSOR_ERROR(AO_DATA_MS5607); +#else ao_panic(AO_PANIC_SELF_TEST_MS5607); +#endif + } #if __BYTE_ORDER == __LITTLE_ENDIAN /* Byte swap */ @@ -138,20 +142,20 @@ ao_ms5607_setup(void) ao_ms5607_prom_read(&ao_ms5607_prom); } -static __xdata volatile 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((__xdata void *) &ao_ms5607_done); + ao_wakeup((void *) &ao_ms5607_done); } static uint32_t ao_ms5607_get_sample(uint8_t cmd) { - __xdata uint8_t reply[3]; - __xdata uint8_t read; + uint8_t reply[3]; + uint8_t read; ao_ms5607_done = 0; @@ -164,12 +168,12 @@ ao_ms5607_get_sample(uint8_t cmd) { ao_spi_put(AO_MS5607_SPI_INDEX); #endif ao_arch_block_interrupts(); - while (!ao_gpio_get(AO_MS5607_MISO_PORT, AO_MS5607_MISO_PIN, AO_MS5607_MISO) && + while (!ao_gpio_get(AO_MS5607_MISO_PORT, AO_MS5607_MISO_PIN) && !ao_ms5607_done) 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); + ao_gpio_set(AO_MS5607_CS_PORT, AO_MS5607_CS_PIN, 1); #else ao_ms5607_stop(); #endif @@ -198,7 +202,7 @@ ao_ms5607_get_sample(uint8_t cmd) { #define AO_CONVERT_D2 token_evaluator(AO_MS5607_CONVERT_D2_, AO_MS5607_TEMP_OVERSAMPLE) void -ao_ms5607_sample(__xdata struct ao_ms5607_sample *sample) +ao_ms5607_sample(struct ao_ms5607_sample *sample) { sample->pres = ao_ms5607_get_sample(AO_CONVERT_D1); sample->temp = ao_ms5607_get_sample(AO_CONVERT_D2); @@ -214,7 +218,7 @@ ao_ms5607_sample(__xdata struct ao_ms5607_sample *sample) #define HAS_MS5607_TASK HAS_TASK #endif -__xdata struct ao_ms5607_sample ao_ms5607_current; +struct ao_ms5607_sample ao_ms5607_current; #if HAS_MS5607_TASK static void @@ -233,13 +237,16 @@ ao_ms5607(void) } } -__xdata struct ao_task ao_ms5607_task; +struct ao_task ao_ms5607_task; #endif #if HAS_TASK void ao_ms5607_info(void) { +#if !HAS_MS5607_TASK + ao_ms5607_setup(); +#endif printf ("ms5607 reserved: %u\n", ao_ms5607_prom.reserved); printf ("ms5607 sens: %u\n", ao_ms5607_prom.sens); printf ("ms5607 off: %u\n", ao_ms5607_prom.off); @@ -253,15 +260,18 @@ ao_ms5607_info(void) static void ao_ms5607_dump(void) { - __xdata struct ao_ms5607_value value; + struct ao_ms5607_value value; +#if !HAS_MS5607_TASK + ao_ms5607_sample(&ao_ms5607_current); +#endif ao_ms5607_convert(&ao_ms5607_current, &value); printf ("Pressure: %8lu %8ld\n", ao_ms5607_current.pres, value.pres); printf ("Temperature: %8lu %8ld\n", ao_ms5607_current.temp, value.temp); printf ("Altitude: %ld\n", ao_pa_to_altitude(value.pres)); } -__code struct ao_cmds ao_ms5607_cmds[] = { +const struct ao_cmds ao_ms5607_cmds[] = { { ao_ms5607_dump, "B\0Display MS5607 data" }, { 0, NULL }, };