blob: 9bb1b6db40621cf825f35b6bca2174182681ed85 [file] [log] [blame]
/*
* Copyright (c) 2023 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_DRIVERS_SENSOR_AKM09918C_AKM09918C_H_
#define ZEPHYR_DRIVERS_SENSOR_AKM09918C_AKM09918C_H_
#include <zephyr/device.h>
#include <zephyr/drivers/sensor.h>
#include "akm09918c_reg.h"
/* Time it takes to get a measurement in single-measure mode */
#define AKM09918C_MEASURE_TIME_US 9000
/* Conversion values */
#define AKM09918C_MICRO_GAUSS_PER_BIT INT64_C(500)
struct akm09918c_data {
int16_t x_sample;
int16_t y_sample;
int16_t z_sample;
uint8_t mode;
};
struct akm09918c_config {
struct i2c_dt_spec i2c;
};
static inline uint8_t akm09918c_hz_to_reg(const struct sensor_value *val)
{
if (val->val1 >= 100) {
return AKM09918C_CNTL2_CONTINUOUS_4;
} else if (val->val1 >= 50) {
return AKM09918C_CNTL2_CONTINUOUS_3;
} else if (val->val1 >= 20) {
return AKM09918C_CNTL2_CONTINUOUS_2;
} else if (val->val1 > 0) {
return AKM09918C_CNTL2_CONTINUOUS_1;
} else {
return AKM09918C_CNTL2_PWR_DOWN;
}
}
static inline void akm09918c_reg_to_hz(uint8_t reg, struct sensor_value *val)
{
val->val1 = 0;
val->val2 = 0;
switch (reg) {
case AKM09918C_CNTL2_CONTINUOUS_1:
val->val1 = 10;
break;
case AKM09918C_CNTL2_CONTINUOUS_2:
val->val1 = 20;
break;
case AKM09918C_CNTL2_CONTINUOUS_3:
val->val1 = 50;
break;
case AKM09918C_CNTL2_CONTINUOUS_4:
val->val1 = 100;
break;
}
}
#endif /* ZEPHYR_DRIVERS_SENSOR_AKM09918C_AKM09918C_H_ */