common/sensor/dev/isl69259.c (43 lines of code) (raw):
#include <stdio.h>
#include <string.h>
#include "sensor.h"
#include "hal_i2c.h"
uint8_t isl69259_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)) {
/* read fail */
return SENSOR_FAIL_TO_ACCESS;
}
uint8_t offset = sensor_config[SensorNum_SensorCfg_map[sensor_num]].offset;
if (offset == PMBUS_READ_VOUT) {
/* 1 mV/LSB, unsigned integer */
sval->integer = ((msg.data[1] << 8) | msg.data[0]) / 1000;
sval->fraction = ((msg.data[1] << 8) | msg.data[0]) % 1000;
} else if (offset == PMBUS_READ_IOUT) {
/* 0.1 A/LSB, 2's complement */
sval->integer = (int16_t)((msg.data[1] << 8) | msg.data[0]) / 10;
sval->fraction =
(int16_t)(((msg.data[1] << 8) | msg.data[0]) - (sval->integer * 10)) * 100;
} else if (offset == PMBUS_READ_TEMPERATURE_1) {
/* 1 Degree C/LSB, 2's complement */
sval->integer = ((msg.data[1] << 8) | msg.data[0]);
} else if (offset == PMBUS_READ_POUT) {
/* 1 Watt/LSB, 2's complement */
sval->integer = ((msg.data[1] << 8) | msg.data[0]);
} else {
return SENSOR_FAIL_TO_ACCESS;
}
return SENSOR_READ_SUCCESS;
}
uint8_t isl69259_init(uint8_t sensor_num)
{
sensor_config[SensorNum_SensorCfg_map[sensor_num]].read = isl69259_read;
return SENSOR_INIT_SUCCESS;
}