uint8_t adm1278_read()

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;
}