staticint zopt2201_set_resolution(struct zopt2201_data *data, u8 res)
{ int ret;
ret = i2c_smbus_write_byte_data(data->client, ZOPT2201_LS_MEAS_RATE,
(res << ZOPT2201_MEAS_RES_SHIFT) |
data->rate); if (ret < 0) return ret;
data->res = res;
return0;
}
staticint zopt2201_write_resolution(struct zopt2201_data *data, int val, int val2)
{ int i, ret;
if (val != 0) return -EINVAL;
for (i = 0; i < ARRAY_SIZE(zopt2201_resolution); i++) if (val2 == zopt2201_resolution[i].us) {
mutex_lock(&data->lock);
ret = zopt2201_set_resolution(data, i);
mutex_unlock(&data->lock); return ret;
}
return -EINVAL;
}
staticint zopt2201_set_gain(struct zopt2201_data *data, u8 gain)
{ int ret;
ret = i2c_smbus_write_byte_data(data->client, ZOPT2201_LS_GAIN, gain); if (ret < 0) return ret;
data->gain = gain;
return0;
}
staticint zopt2201_write_scale_by_idx(struct zopt2201_data *data, int idx, conststruct zopt2201_scale *zopt2201_scale_array)
{ int ret;
mutex_lock(&data->lock);
ret = zopt2201_set_resolution(data, zopt2201_scale_array[idx].res); if (ret < 0) goto unlock;
ret = zopt2201_set_gain(data, zopt2201_scale_array[idx].gain);
unlock:
mutex_unlock(&data->lock); return ret;
}
staticint zopt2201_write_scale_als(struct zopt2201_data *data, int val, int val2)
{ int i;
for (i = 0; i < ARRAY_SIZE(zopt2201_scale_als); i++) if (val == zopt2201_scale_als[i].scale &&
val2 == zopt2201_scale_als[i].uscale) return zopt2201_write_scale_by_idx(data, i, zopt2201_scale_als);
return -EINVAL;
}
staticint zopt2201_write_scale_uvb(struct zopt2201_data *data, int val, int val2)
{ int i;
for (i = 0; i < ARRAY_SIZE(zopt2201_scale_uvb); i++) if (val == zopt2201_scale_uvb[i].scale &&
val2 == zopt2201_scale_uvb[i].uscale) return zopt2201_write_scale_by_idx(data, i, zopt2201_scale_uvb);
return -EINVAL;
}
staticint zopt2201_write_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int val, int val2, long mask)
{ struct zopt2201_data *data = iio_priv(indio_dev);
switch (mask) { case IIO_CHAN_INFO_INT_TIME: return zopt2201_write_resolution(data, val, val2); case IIO_CHAN_INFO_SCALE: switch (chan->address) { case ZOPT2201_ALS_DATA: return zopt2201_write_scale_als(data, val, val2); case ZOPT2201_UVB_DATA: return zopt2201_write_scale_uvb(data, val, val2); default: return -EINVAL;
}
}
return -EINVAL;
}
static ssize_t zopt2201_show_int_time_available(struct device *dev, struct device_attribute *attr, char *buf)
{
size_t len = 0; int i;
for (i = 0; i < ARRAY_SIZE(zopt2201_resolution); i++)
len += scnprintf(buf + len, PAGE_SIZE - len, "0.%06lu ",
zopt2201_resolution[i].us);
buf[len - 1] = '\n';
MODULE_AUTHOR("Peter Meerwald-Stadler <pmeerw@pmeerw.net>");
MODULE_DESCRIPTION("IDT ZOPT2201 ambient light and UV B sensor driver");
MODULE_LICENSE("GPL");
Messung V0.5 in Prozent
¤ 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.0.10Bemerkung:
(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.