/* Consume left-over completion from a previous timeout */
try_wait_for_completion(&gpadc->complete);
/* Check for actual completion */
wait_for_completion_timeout(&gpadc->complete, msecs_to_jiffies(5));
/* Read result and status from device */
da9150_bulk_read(gpadc->da9150, DA9150_GPADC_RES_A, 2, result_regs);
mutex_unlock(&gpadc->lock);
/* Check to make sure device really has completed reading */ if (result_regs[1] & DA9150_GPADC_RUN_MASK) {
dev_err(gpadc->dev, "Timeout on channel %d of GPADC\n",
hw_chan); return -ETIMEDOUT;
}
staticint da9150_gpadc_read_processed(struct da9150_gpadc *gpadc, int channel, int hw_chan, int *val)
{ int raw_val;
raw_val = da9150_gpadc_read_adc(gpadc, hw_chan); if (raw_val < 0) return raw_val;
switch (channel) { case DA9150_GPADC_CHAN_GPIOA: case DA9150_GPADC_CHAN_GPIOB: case DA9150_GPADC_CHAN_GPIOC: case DA9150_GPADC_CHAN_GPIOD:
*val = da9150_gpadc_gpio_6v_voltage_now(raw_val); break; case DA9150_GPADC_CHAN_IBUS:
*val = da9150_gpadc_ibus_current_avg(raw_val); break; case DA9150_GPADC_CHAN_VBUS:
*val = da9150_gpadc_vbus_21v_voltage_now(raw_val); break; case DA9150_GPADC_CHAN_VSYS:
*val = da9150_gpadc_vsys_6v_voltage_now(raw_val); break; default: /* No processing for other channels so return raw value */
*val = raw_val; break;
}
return IIO_VAL_INT;
}
staticint da9150_gpadc_read_scale(int channel, int *val, int *val2)
{ switch (channel) { case DA9150_GPADC_CHAN_VBAT:
*val = 2932;
*val2 = 1000; return IIO_VAL_FRACTIONAL; case DA9150_GPADC_CHAN_TJUNC_CORE: case DA9150_GPADC_CHAN_TJUNC_OVP:
*val = 1000000;
*val2 = 4420; return IIO_VAL_FRACTIONAL; default: return -EINVAL;
}
}
staticint da9150_gpadc_read_offset(int channel, int *val)
{ switch (channel) { case DA9150_GPADC_CHAN_VBAT:
*val = 1500000 / 2932; return IIO_VAL_INT; case DA9150_GPADC_CHAN_TJUNC_CORE: case DA9150_GPADC_CHAN_TJUNC_OVP:
*val = -144; return IIO_VAL_INT; default: return -EINVAL;
}
}
staticint da9150_gpadc_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int *val, int *val2, long mask)
{ struct da9150_gpadc *gpadc = iio_priv(indio_dev);
if ((chan->channel < DA9150_GPADC_CHAN_GPIOA) ||
(chan->channel > DA9150_GPADC_CHAN_TJUNC_OVP)) return -EINVAL;
switch (mask) { case IIO_CHAN_INFO_RAW: case IIO_CHAN_INFO_PROCESSED: return da9150_gpadc_read_processed(gpadc, chan->channel,
chan->address, val); case IIO_CHAN_INFO_SCALE: return da9150_gpadc_read_scale(chan->channel, val, val2); case IIO_CHAN_INFO_OFFSET: return da9150_gpadc_read_offset(chan->channel, val); 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.