common/sensor/dev/ltc2482.c (54 lines of code) (raw):
#include <stdio.h>
#include <string.h>
#include "sensor.h"
#include "hal_i2c.h"
#include "sensor_def.h"
uint8_t ltc4282_read(uint8_t sensor_num, int *reading)
{
if ((reading == NULL) ||
(sensor_config[SensorNum_SensorCfg_map[sensor_num]].init_args == NULL)) {
return SENSOR_UNSPECIFIED_ERROR;
}
ltc4282_init_arg *init_arg =
(ltc4282_init_arg *)sensor_config[SensorNum_SensorCfg_map[sensor_num]].init_args;
if (!init_arg->r_sense) {
printf("%s, Rsense hasn't given\n", __func__);
return SENSOR_UNSPECIFIED_ERROR;
}
float Rsense = init_arg->r_sense;
uint8_t retry = 5;
double val = 0;
I2C_MSG msg = { 0 };
sensor_cfg *cfg = &sensor_config[SensorNum_SensorCfg_map[sensor_num]];
msg.bus = cfg->port;
msg.slave_addr = cfg->slave_addr;
msg.tx_len = 1;
msg.data[0] = cfg->offset;
msg.rx_len = 2;
if (i2c_master_read(&msg, retry) != 0)
return SENSOR_FAIL_TO_ACCESS;
switch (cfg->offset) {
case LTC4282_VSENSE_OFFSET:
val = (((msg.data[0] << 8) | msg.data[1]) * 0.4 / 65535 / Rsense);
break;
case LTC4282_POWER_OFFSET:
val = (((msg.data[0] << 8) | msg.data[1]) * 16.64 * 0.4 / 65535 / Rsense);
break;
case LTC4282_VSOURCE_OFFSET:
val = (((msg.data[0] << 8) | msg.data[1]) * 16.64 / 65535);
break;
default:
printf("Invalid sensor 0x%x offset 0x%x\n", sensor_num, cfg->offset);
return SENSOR_NOT_FOUND;
}
sensor_val *sval = (sensor_val *)reading;
memset(sval, 0, sizeof(*sval));
sval->integer = (int)val & 0xFFFF;
sval->fraction = (val - sval->integer) * 1000;
return SENSOR_READ_SUCCESS;
}
uint8_t ltc4282_init(uint8_t sensor_num)
{
sensor_config[SensorNum_SensorCfg_map[sensor_num]].read = ltc4282_read;
return SENSOR_INIT_SUCCESS;
}