blob: d4bcbca027e440ee8fa09ae82ce7fdb48b11414a [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#ifndef __MS5837_H__
#define __MS5837_H__
#include "os/mynewt.h"
#include "sensor/sensor.h"
#define MS5837_I2C_ADDRESS 0x76
#define MS5837_NUMBER_COEFFS 7
#ifdef __cplusplus
extern "C" {
#endif
struct ms5837_pdd {
uint16_t eeprom_coeff[MS5837_NUMBER_COEFFS + 1];
};
struct ms5837_cfg {
uint8_t mc_s_temp_res_osr;
uint8_t mc_s_press_res_osr;
sensor_type_t mc_s_mask;
};
struct ms5837 {
struct os_dev dev;
struct sensor sensor;
struct ms5837_cfg cfg;
struct ms5837_pdd pdd;
os_time_t last_read_time;
};
#define MS5837_RES_OSR_256 0x0
#define MS5837_RES_OSR_512 0x2
#define MS5837_RES_OSR_1024 0x4
#define MS5837_RES_OSR_2048 0x6
#define MS5837_RES_OSR_4096 0x8
#define MS5837_RES_OSR_8192 0xA
/**
* Initialize the ms5837.
*
* @param dev Pointer to the ms5837_dev device descriptor
*
* @return 0 on success, and non-zero error code on failure
*/
int
ms5837_init(struct os_dev *dev, void *arg);
/**
* Reads the temperature ADC value
*
* @param the sensor interface
* @param raw adc temperature value
* @param resolution osr
*
* @return 0 on success, non-zero on failure
*/
int
ms5837_get_rawtemp(struct sensor_itf *itf, uint32_t *rawtemp,
uint8_t res_osr);
/**
* Reads the pressure ADC value
*
* @param the sensor interface
* @param raw adc pressure value
* @param resolution osr
*
* @return 0 on success, non-zero on failure
*/
int
ms5837_get_rawpress(struct sensor_itf *itf, uint32_t *rawpress,
uint8_t res_osr);
/**
* Resets the MS5837 chip
*
* @param The sensor interface
* @return 0 on success, non-zero on failure
*/
int
ms5837_reset(struct sensor_itf *itf);
/**
* Configure MS5837 sensor
*
* @param Sensor device MS5837 structure
* @param Sensor device MS5837 config
*
* @return 0 on success, and non-zero error code on failure
*/
int
ms5837_config(struct ms5837 *ms5837, struct ms5837_cfg *cfg);
/**
* crc4 check for MS5837 EEPROM
*
* @param buffer containing EEPROM coefficients
* @param crc to compare with
*
* return 0 on success (CRC is OK), non-zero on failure
*/
int
ms5837_crc_check(uint16_t *prom, uint8_t crc);
/**
* Reads the ms5837 EEPROM coefficients for computation and
* does a CRC check on them
*
* @param the sensor interface
* @param buffer to fill up the coefficients
*
* @return 0 on success, non-zero on failure
*/
int
ms5837_read_eeprom(struct sensor_itf *itf, uint16_t *coeff);
/**
* Compensate for pressure using coefficients from the EEPROM
*
* @param ptr to coefficients
* @param first order compensated temperature
* @param raw pressure
* @param deltat temperature
*
* @return second order temperature compensated pressure
*/
float
ms5837_compensate_pressure(uint16_t *coeffs, int32_t temp,
uint32_t rawpress, int32_t deltat);
/**
* Compensate for temperature using coefficients from the EEPROM
*
* @param ptr to coefficients
* @param compensated temperature
* @param raw temperature
* @param optional ptr to fill up first order compensated temperature
* @param optional ptr to fill up delta temperature
*
* @return second order temperature compensated temperature
*/
float
ms5837_compensate_temperature(uint16_t *coeffs, uint32_t rawtemp,
int32_t *comptemp, int32_t *deltat);
#ifdef __cplusplus
}
#endif
#endif /* __MS5837_H__ */