common/sensor/dev/tps53689.c (45 lines of code) (raw):

#include <stdio.h> #include <string.h> #include "sensor.h" #include "hal_i2c.h" #include "util_pmbus.h" uint8_t tps53689_read(uint8_t sensor_num, int *reading) { if (reading == NULL) { return SENSOR_UNSPECIFIED_ERROR; } uint8_t retry = 5; sensor_val *sval = (sensor_val *)reading; I2C_MSG msg; memset(sval, 0, sizeof(sensor_val)); msg.bus = sensor_config[SensorNum_SensorCfg_map[sensor_num]].port; msg.slave_addr = sensor_config[SensorNum_SensorCfg_map[sensor_num]].slave_addr; msg.tx_len = 1; msg.rx_len = 2; msg.data[0] = sensor_config[SensorNum_SensorCfg_map[sensor_num]].offset; if (i2c_master_read(&msg, retry)) return SENSOR_FAIL_TO_ACCESS; uint8_t offset = sensor_config[SensorNum_SensorCfg_map[sensor_num]].offset; if (offset == PMBUS_READ_VOUT) { /* ULINEAR16, get exponent from VOUT_MODE */ float exponent; if (!get_exponent_from_vout_mode(sensor_num, &exponent)) return SENSOR_FAIL_TO_ACCESS; float actual_value = ((msg.data[1] << 8) | msg.data[0]) * exponent; sval->integer = actual_value; sval->fraction = (actual_value - sval->integer) * 1000; } else if (offset == PMBUS_READ_IOUT || offset == PMBUS_READ_TEMPERATURE_1 || offset == PMBUS_READ_POUT) { /* SLINEAR11 */ uint16_t read_value = (msg.data[1] << 8) | msg.data[0]; float actual_value = slinear11_to_float(read_value); sval->integer = actual_value; sval->fraction = (actual_value - sval->integer) * 1000; } else { return SENSOR_FAIL_TO_ACCESS; } return SENSOR_READ_SUCCESS; } uint8_t tps53689_init(uint8_t sensor_num) { sensor_config[SensorNum_SensorCfg_map[sensor_num]].read = tps53689_read; return SENSOR_INIT_SUCCESS; }