in common/sensor/dev/adm1278.c [73:150]
uint8_t adm1278_read(uint8_t sensor_num, int *reading)
{
if ((reading == NULL) ||
(sensor_config[SensorNum_SensorCfg_map[sensor_num]].init_args == NULL)) {
return SENSOR_UNSPECIFIED_ERROR;
}
adm1278_init_arg *init_arg =
(adm1278_init_arg *)sensor_config[SensorNum_SensorCfg_map[sensor_num]].init_args;
if (init_arg->is_init == false) {
printk("adm1278_read, device isn't initialized\n");
return SENSOR_UNSPECIFIED_ERROR;
}
if (!init_arg->r_sense) {
printk("adm1278_read, Rsense hasn't given\n");
return SENSOR_UNSPECIFIED_ERROR;
}
float Rsense = init_arg->r_sense;
float val;
uint8_t retry = 5;
I2C_MSG msg;
int ret = 0;
uint8_t offset = sensor_config[SensorNum_SensorCfg_map[sensor_num]].offset;
if (offset != ADM1278_EIN_EXT_OFFSET) {
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.data[0] = offset;
msg.rx_len = 2;
if (i2c_master_read(&msg, retry))
return SENSOR_FAIL_TO_ACCESS;
}
switch (offset) {
case ADM1278_VSOURCE_OFFSET:
// m = +19599, b = 0, R = -2
val = (float)(((msg.data[1] << 8) | msg.data[0]) * 100 / 19599.0);
break;
case ADM1278_CURRENT_OFFSET:
case ADM1278_PEAK_IOUT_OFFSET:
// m = +800 * Rsense(mohm), b = +20475, R = -1
val = (float)(((msg.data[1] << 8) | msg.data[0]) * 10 - 20475) / (800 * Rsense);
break;
case ADM1278_TEMP_OFFSET:
// m = +42, b = +31880, R = -1
val = (float)(((msg.data[1] << 8) | msg.data[0]) * 10 - 31880) / 42;
break;
case ADM1278_POWER_OFFSET:
case ADM1278_PEAK_PIN_OFFSET:
// m = +6123 * Rsense(mohm), b = 0, R = -2
val = (float)(((msg.data[1] << 8) | msg.data[0]) * 100) / (6123 * Rsense);
break;
case ADM1278_EIN_EXT_OFFSET:
ret = adm1278_read_ein_ext(Rsense, &val, sensor_num);
if (ret != 0) {
return SENSOR_UNSPECIFIED_ERROR;
}
break;
default:
printf("Invalid sensor 0x%x\n", sensor_num);
return SENSOR_UNSPECIFIED_ERROR;
}
sensor_val *sval = (sensor_val *)reading;
sval->integer = (int)val & 0xFFFF;
sval->fraction = (val - sval->integer) * 1000;
return SENSOR_READ_SUCCESS;
}