staticint tcs3414_req_data(struct tcs3414_data *data)
{ int tries = 25; int ret;
ret = i2c_smbus_write_byte_data(data->client, TCS3414_CONTROL,
data->control | TCS3414_CONTROL_ADC_EN); if (ret < 0) return ret;
while (tries--) {
ret = i2c_smbus_read_byte_data(data->client, TCS3414_CONTROL); if (ret < 0) return ret; if (ret & TCS3414_CONTROL_ADC_VALID) break;
msleep(20);
}
ret = i2c_smbus_write_byte_data(data->client, TCS3414_CONTROL,
data->control); if (ret < 0) return ret;
if (tries < 0) {
dev_err(&data->client->dev, "data not ready\n"); return -EIO;
}
return 0;
}
staticint tcs3414_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int *val, int *val2, long mask)
{ struct tcs3414_data *data = iio_priv(indio_dev); int i, ret;
switch (mask) { case IIO_CHAN_INFO_RAW: if (!iio_device_claim_direct(indio_dev)) return -EBUSY;
ret = tcs3414_req_data(data); if (ret < 0) {
iio_device_release_direct(indio_dev); return ret;
}
ret = i2c_smbus_read_word_data(data->client, chan->address);
iio_device_release_direct(indio_dev); if (ret < 0) return ret;
*val = ret; return IIO_VAL_INT; case IIO_CHAN_INFO_SCALE:
i = (data->gain & TCS3414_GAIN_MASK) >> TCS3414_GAIN_SHIFT;
*val = tcs3414_scales[i][0];
*val2 = tcs3414_scales[i][1]; return IIO_VAL_INT_PLUS_MICRO; case IIO_CHAN_INFO_INT_TIME:
*val = 0;
*val2 = tcs3414_times[data->timing & TCS3414_INTEG_MASK] * 1000; return IIO_VAL_INT_PLUS_MICRO;
} return -EINVAL;
}
staticint tcs3414_write_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int val, int val2, long mask)
{ struct tcs3414_data *data = iio_priv(indio_dev); int i;
switch (mask) { case IIO_CHAN_INFO_SCALE: for (i = 0; i < ARRAY_SIZE(tcs3414_scales); i++) { if (val == tcs3414_scales[i][0] &&
val2 == tcs3414_scales[i][1]) {
data->gain &= ~TCS3414_GAIN_MASK;
data->gain |= i << TCS3414_GAIN_SHIFT; return i2c_smbus_write_byte_data(
data->client, TCS3414_GAIN,
data->gain);
}
} return -EINVAL; case IIO_CHAN_INFO_INT_TIME: if (val != 0) return -EINVAL; for (i = 0; i < ARRAY_SIZE(tcs3414_times); i++) { if (val2 == tcs3414_times[i] * 1000) {
data->timing &= ~TCS3414_INTEG_MASK;
data->timing |= i; return i2c_smbus_write_byte_data(
data->client, TCS3414_TIMING,
data->timing);
}
} return -EINVAL; default: return -EINVAL;
}
}
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.