blob: 97f45fc353e6211bafc06cd28a11bc5ac088175c [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 __MS5840_H__
#define __MS5840_H__
#include <os/os.h>
#include "os/os_dev.h"
#include "sensor/sensor.h"
#define MS5840_I2C_ADDRESS 0x76
#define MS5840_NUMBER_COEFFS 7
#ifdef __cplusplus
extern "C" {
#endif
struct ms5840_pdd {
uint16_t eeprom_coeff[MS5840_NUMBER_COEFFS + 1];
};
struct ms5840_cfg {
uint8_t mc_s_temp_res_osr;
uint8_t mc_s_press_res_osr;
sensor_type_t mc_s_mask;
};
struct ms5840 {
struct os_dev dev;
struct sensor sensor;
struct ms5840_cfg cfg;
struct ms5840_pdd pdd;
os_time_t last_read_time;
};
#define MS5840_RES_OSR_256 0x0
#define MS5840_RES_OSR_512 0x2
#define MS5840_RES_OSR_1024 0x4
#define MS5840_RES_OSR_2048 0x6
#define MS5840_RES_OSR_4096 0x8
#define MS5840_RES_OSR_8192 0xA
/**
* Initialize the ms5840.
*
* @param dev Pointer to the ms5840_dev device descriptor
*
* @return 0 on success, and non-zero error code on failure
*/
int
ms5840_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
ms5840_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
ms5840_get_rawpress(struct sensor_itf *itf, uint32_t *rawpress,
uint8_t res_osr);
/**
* Resets the MS5840 chip
*
* @param The sensor interface
* @return 0 on success, non-zero on failure
*/
int
ms5840_reset(struct sensor_itf *itf);
/**
* Configure MS5840 sensor
*
* @param Sensor device MS5840 structure
* @param Sensor device MS5840 config
*
* @return 0 on success, and non-zero error code on failure
*/
int
ms5840_config(struct ms5840 *ms5840, struct ms5840_cfg *cfg);
/**
* crc4 check for MS5840 EEPROM
*
* @param buffer containing EEPROM coefficients
* @param crc to compare with
*
* return 0 on success (CRC is OK), non-zero on failure
*/
int
ms5840_crc_check(uint16_t *prom, uint8_t crc);
/**
* Reads the ms5840 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
ms5840_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
ms5840_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
ms5840_compensate_temperature(uint16_t *coeffs, uint32_t rawtemp,
int32_t *comptemp, int32_t *deltat);
#ifdef __cplusplus
}
#endif
#endif /* __MS5840_H__ */