/* Default scale is set to the minimum of 0.03125 or 1 / (1 << 5) lux */ #define MAX44000_ALS_TO_LUX_DEFAULT_FRACTION_LOG2 5
/* Scale can be multiplied by up to 128x via ALSPGA for measurement gain */ staticconstint max44000_alspga_shift[] = {0, 2, 4, 7}; #define MAX44000_ALSPGA_MAX_SHIFT 7
staticint max44000_write_led_current_raw(struct max44000_data *data, int val)
{ /* Maybe we should clamp the value instead? */ if (val < 0 || val > MAX44000_LED_CURRENT_MAX) return -ERANGE; if (val >= 8)
val += 4; return regmap_write_bits(data->regmap, MAX44000_REG_CFG_TX,
MAX44000_LED_CURRENT_MASK, val);
}
staticint max44000_read_led_current_raw(struct max44000_data *data)
{ unsignedint regval; int ret;
ret = regmap_read(data->regmap, MAX44000_REG_CFG_TX, ®val); if (ret < 0) return ret;
regval &= MAX44000_LED_CURRENT_MASK; if (regval >= 8)
regval -= 4; return regval;
}
staticint max44000_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int *val, int *val2, long mask)
{ struct max44000_data *data = iio_priv(indio_dev); int alstim, alspga; unsignedint regval; int ret;
switch (mask) { case IIO_CHAN_INFO_RAW: switch (chan->type) { case IIO_LIGHT:
mutex_lock(&data->lock);
ret = max44000_read_alsval(data);
mutex_unlock(&data->lock); if (ret < 0) return ret;
*val = ret; return IIO_VAL_INT;
case IIO_PROXIMITY:
mutex_lock(&data->lock);
ret = regmap_read(data->regmap, MAX44000_REG_PRX_DATA, ®val);
mutex_unlock(&data->lock); if (ret < 0) return ret;
*val = regval; return IIO_VAL_INT;
case IIO_CURRENT:
mutex_lock(&data->lock);
ret = max44000_read_led_current_raw(data);
mutex_unlock(&data->lock); if (ret < 0) return ret;
*val = ret; return IIO_VAL_INT;
default: return -EINVAL;
}
case IIO_CHAN_INFO_SCALE: switch (chan->type) { case IIO_CURRENT: /* Output register is in 10s of miliamps */
*val = 10; return IIO_VAL_INT;
case IIO_LIGHT:
mutex_lock(&data->lock);
alspga = ret = max44000_read_alspga(data);
mutex_unlock(&data->lock); if (ret < 0) return ret;
staticbool max44000_readable_reg(struct device *dev, unsignedint reg)
{ switch (reg) { case MAX44000_REG_STATUS: case MAX44000_REG_CFG_MAIN: case MAX44000_REG_CFG_RX: case MAX44000_REG_CFG_TX: case MAX44000_REG_ALS_DATA_HI: case MAX44000_REG_ALS_DATA_LO: case MAX44000_REG_PRX_DATA: case MAX44000_REG_ALS_UPTHR_HI: case MAX44000_REG_ALS_UPTHR_LO: case MAX44000_REG_ALS_LOTHR_HI: case MAX44000_REG_ALS_LOTHR_LO: case MAX44000_REG_PST: case MAX44000_REG_PRX_IND: case MAX44000_REG_PRX_THR: case MAX44000_REG_TRIM_GAIN_GREEN: case MAX44000_REG_TRIM_GAIN_IR: returntrue; default: returnfalse;
}
}
staticbool max44000_writeable_reg(struct device *dev, unsignedint reg)
{ switch (reg) { case MAX44000_REG_CFG_MAIN: case MAX44000_REG_CFG_RX: case MAX44000_REG_CFG_TX: case MAX44000_REG_ALS_UPTHR_HI: case MAX44000_REG_ALS_UPTHR_LO: case MAX44000_REG_ALS_LOTHR_HI: case MAX44000_REG_ALS_LOTHR_LO: case MAX44000_REG_PST: case MAX44000_REG_PRX_IND: case MAX44000_REG_PRX_THR: case MAX44000_REG_TRIM_GAIN_GREEN: case MAX44000_REG_TRIM_GAIN_IR: returntrue; default: returnfalse;
}
}
staticbool max44000_volatile_reg(struct device *dev, unsignedint reg)
{ switch (reg) { case MAX44000_REG_STATUS: case MAX44000_REG_ALS_DATA_HI: case MAX44000_REG_ALS_DATA_LO: case MAX44000_REG_PRX_DATA: returntrue; default: returnfalse;
}
}
/* Reset ALS scaling bits */
ret = regmap_write(data->regmap, MAX44000_REG_CFG_RX,
MAX44000_REG_CFG_RX_DEFAULT); if (ret < 0) {
dev_err(&client->dev, "failed to write default CFG_RX: %d\n",
ret); return ret;
}
/* *BydefaulttheLEDpulseusedfortheproximitysensorisdisabled. *Setamiddlevaluesothatwegetsomesortofvaliddatabydefault.
*/
ret = max44000_write_led_current_raw(data, MAX44000_LED_CURRENT_DEFAULT); if (ret < 0) {
dev_err(&client->dev, "failed to write init config: %d\n", ret); return ret;
}
/* Reset CFG bits to ALS_PRX mode which allows easy reading of both values. */
reg = MAX44000_CFG_TRIM | MAX44000_CFG_MODE_ALS_PRX;
ret = regmap_write(data->regmap, MAX44000_REG_CFG_MAIN, reg); if (ret < 0) {
dev_err(&client->dev, "failed to write init config: %d\n", ret); return ret;
}
/* Read status at least once to clear any stale interrupt bits. */
ret = regmap_read(data->regmap, MAX44000_REG_STATUS, ®); if (ret < 0) {
dev_err(&client->dev, "failed to read init status: %d\n", ret); return ret;
}
MODULE_AUTHOR("Crestez Dan Leonard <leonard.crestez@intel.com>");
MODULE_DESCRIPTION("MAX44000 Ambient and Infrared Proximity Sensor");
MODULE_LICENSE("GPL v2");
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet am 2026-09-28)
¤
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.