staticint veml6075_request_measurement(struct veml6075_data *data)
{ int ret, conf, int_time;
ret = regmap_read(data->regmap, VEML6075_CMD_CONF, &conf); if (ret < 0) return ret;
/* disable shutdown and trigger measurement */
ret = regmap_write(data->regmap, VEML6075_CMD_CONF,
(conf | VEML6075_CONF_TRIG) & ~VEML6075_CONF_SD); if (ret < 0) return ret;
/* * A measurement requires between 1.30 and 1.40 times the integration * time for all possible configurations. Using a 1.50 factor simplifies * operations and ensures reliability under all circumstances.
*/
int_time = veml6075_it_ms[FIELD_GET(VEML6075_CONF_IT, conf)];
msleep(int_time + (int_time / 2));
/* shutdown again, data registers are still accessible */ return regmap_update_bits(data->regmap, VEML6075_CMD_CONF,
VEML6075_CONF_SD, VEML6075_CONF_SD);
}
staticint veml6075_uva_comp(int raw_uva, int comp1, int comp2)
{ int comp1a_c, comp2a_c, uva_comp;
staticint veml6075_read_int_time_index(struct veml6075_data *data)
{ int ret, conf, int_index;
ret = regmap_read(data->regmap, VEML6075_CMD_CONF, &conf); if (ret < 0) return ret;
int_index = FIELD_GET(VEML6075_CONF_IT, conf); if (int_index >= ARRAY_SIZE(veml6075_it_ms)) return -EINVAL;
return int_index;
}
staticint veml6075_read_int_time_ms(struct veml6075_data *data, int *val)
{ int int_index;
guard(mutex)(&data->lock);
int_index = veml6075_read_int_time_index(data); if (int_index < 0) return int_index;
*val = veml6075_it_ms[int_index];
return IIO_VAL_INT;
}
staticint veml6075_get_uvi_micro(struct veml6075_data *data, int uva_comp, int uvb_comp)
{ int uvia_micro = uva_comp * VEML6075_UVA_RESP; int uvib_micro = uvb_comp * VEML6075_UVB_RESP; int int_index;
int_index = veml6075_read_int_time_index(data); if (int_index < 0) return int_index;
switch (int_index) { case VEML6075_IT_50_MS: return uvia_micro + uvib_micro; case VEML6075_IT_100_MS: case VEML6075_IT_200_MS: case VEML6075_IT_400_MS: case VEML6075_IT_800_MS: return (uvia_micro + uvib_micro) / (2 << int_index); default: return -EINVAL;
}
}
staticint veml6075_read_uvi(struct veml6075_data *data, int *val, int *val2)
{ int ret, c1, c2, uva, uvb, uvi_micro;
guard(mutex)(&data->lock);
ret = veml6075_request_measurement(data); if (ret < 0) return ret;
ret = veml6075_read_comp(data, &c1, &c2); if (ret < 0) return ret;
ret = regmap_read(data->regmap, VEML6075_CMD_UVA, &uva); if (ret < 0) return ret;
ret = regmap_read(data->regmap, VEML6075_CMD_UVB, &uvb); if (ret < 0) return ret;
staticbool veml6075_readable_reg(struct device *dev, unsignedint reg)
{ switch (reg) { case VEML6075_CMD_CONF: case VEML6075_CMD_UVA: case VEML6075_CMD_UVB: case VEML6075_CMD_COMP1: case VEML6075_CMD_COMP2: case VEML6075_CMD_ID: returntrue; default: returnfalse;
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.