/* Disable and reset device */
chip->regs_cmd = CM3232_CMD_ALS_DISABLE | CM3232_CMD_ALS_RESET;
ret = i2c_smbus_write_byte_data(client, CM3232_REG_ADDR_CMD,
chip->regs_cmd); if (ret < 0) {
dev_err(&chip->client->dev, "Error writing reg_cmd\n"); return ret;
}
/* Identify device */
ret = i2c_smbus_read_word_data(client, CM3232_REG_ADDR_ID); if (ret < 0) {
dev_err(&chip->client->dev, "Error reading addr_id\n"); return ret;
}
if ((ret & 0xFF) != chip->als_info->hw_id) return -ENODEV;
/* Register default value */
chip->regs_cmd = chip->als_info->regs_cmd_default;
/* Configure register */
ret = i2c_smbus_write_byte_data(client, CM3232_REG_ADDR_CMD,
chip->regs_cmd); if (ret < 0)
dev_err(&chip->client->dev, "Error writing reg_cmd\n");
return ret;
}
/** * cm3232_read_als_it() - Get sensor integration time * @chip: pointer of struct cm3232_chip * @val: pointer of int to load the integration (sec). * @val2: pointer of int to load the integration time (microsecond). * * Report the current integration time. * * Return: IIO_VAL_INT_PLUS_MICRO for success, otherwise -EINVAL.
*/ staticint cm3232_read_als_it(struct cm3232_chip *chip, int *val, int *val2)
{
u16 als_it; int i;
als_it = chip->regs_cmd;
als_it &= CM3232_CMD_ALS_IT_MASK;
als_it >>= CM3232_CMD_ALS_IT_SHIFT; for (i = 0; i < ARRAY_SIZE(cm3232_als_it_scales); i++) { if (als_it == cm3232_als_it_scales[i].it) {
*val = cm3232_als_it_scales[i].val;
*val2 = cm3232_als_it_scales[i].val2; return IIO_VAL_INT_PLUS_MICRO;
}
}
return -EINVAL;
}
/** * cm3232_write_als_it() - Write sensor integration time * @chip: pointer of struct cm3232_chip. * @val: integration time in second. * @val2: integration time in microsecond. * * Convert integration time to sensor value. * * Return: i2c_smbus_write_byte_data command return value.
*/ staticint cm3232_write_als_it(struct cm3232_chip *chip, int val, int val2)
{ struct i2c_client *client = chip->client;
u16 als_it, cmd; int i;
s32 ret;
for (i = 0; i < ARRAY_SIZE(cm3232_als_it_scales); i++) { if (val == cm3232_als_it_scales[i].val &&
val2 == cm3232_als_it_scales[i].val2) {
/** * cm3232_get_lux() - report current lux value * @chip: pointer of struct cm3232_chip. * * Convert sensor data to lux. It depends on integration * time and calibscale variable. * * Return: Zero or positive value is lux, otherwise error code.
*/ staticint cm3232_get_lux(struct cm3232_chip *chip)
{ struct i2c_client *client = chip->client; conststruct cm3232_als_info *als_info = chip->als_info; int ret; int val, val2; int als_it;
u64 lux;
/* Calculate mlux per bit based on als_it */
ret = cm3232_read_als_it(chip, &val, &val2); if (ret < 0) return -EINVAL;
als_it = val * 1000000 + val2;
lux = (__force u64)als_info->mlux_per_bit;
lux *= als_info->mlux_per_bit_base_it;
lux = div_u64(lux, als_it);
ret = i2c_smbus_read_word_data(client, CM3232_REG_ADDR_ALS); if (ret < 0) {
dev_err(&client->dev, "Error reading reg_addr_als\n"); return ret;
}
staticint cm3232_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int *val, int *val2, long mask)
{ struct cm3232_chip *chip = iio_priv(indio_dev); int ret;
switch (mask) { case IIO_CHAN_INFO_PROCESSED:
ret = cm3232_get_lux(chip); if (ret < 0) return ret;
*val = ret; return IIO_VAL_INT; case IIO_CHAN_INFO_CALIBSCALE:
*val = chip->calibscale; return IIO_VAL_INT; case IIO_CHAN_INFO_INT_TIME: return cm3232_read_als_it(chip, val, val2);
}
return -EINVAL;
}
staticint cm3232_write_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int val, int val2, long mask)
{ struct cm3232_chip *chip = iio_priv(indio_dev);
switch (mask) { case IIO_CHAN_INFO_CALIBSCALE:
chip->calibscale = val; return 0; case IIO_CHAN_INFO_INT_TIME: return cm3232_write_als_it(chip, val, val2);
}
return -EINVAL;
}
/** * cm3232_get_it_available() - Get available ALS IT value * @dev: pointer of struct device. * @attr: pointer of struct device_attribute. * @buf: pointer of return string buffer. * * Display the available integration time in second. * * Return: string length.
*/ static ssize_t cm3232_get_it_available(struct device *dev, struct device_attribute *attr, char *buf)
{ int i, len;
for (i = 0, len = 0; i < ARRAY_SIZE(cm3232_als_it_scales); i++)
len += scnprintf(buf + len, PAGE_SIZE - len, "%u.%06u ",
cm3232_als_it_scales[i].val,
cm3232_als_it_scales[i].val2); return len + scnprintf(buf + len, PAGE_SIZE - len, "\n");
}
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.