/* * Plays similar role to iio_demux_table in subsystem core; except allocated * in a fixed 8-element array.
*/ struct dln2_adc_demux_table { unsignedint from; unsignedint to; unsignedint length;
};
ret = dln2_transfer_tx(dln2->pdev, DLN2_ADC_SET_RESOLUTION,
&port_chan, sizeof(port_chan)); if (ret < 0)
dev_dbg(&dln2->pdev->dev, "Problem in %s\n", __func__);
ret = dln2_transfer_tx(dln2->pdev, DLN2_ADC_CHANNEL_SET_CFG,
&set_cfg, sizeof(set_cfg)); if (ret < 0)
dev_dbg(&dln2->pdev->dev, "Problem in %s\n", __func__);
return ret;
}
staticint dln2_adc_read(struct dln2_adc *dln2, unsignedint channel)
{ int ret, i;
u16 conflict;
__le16 value; int olen = sizeof(value); struct dln2_adc_port_chan port_chan = {
.port = dln2->port,
.chan = channel,
};
ret = dln2_adc_set_chan_enabled(dln2, channel, true); if (ret < 0) return ret;
ret = dln2_adc_set_port_enabled(dln2, true, &conflict); if (ret < 0) { if (conflict) {
dev_err(&dln2->pdev->dev, "ADC pins conflict with mask %04X\n",
(int)conflict);
ret = -EBUSY;
} goto disable_chan;
}
/* * Call GET_VAL twice due to initial zero-return immediately after * enabling channel.
*/ for (i = 0; i < 2; ++i) {
ret = dln2_transfer(dln2->pdev, DLN2_ADC_CHANNEL_GET_VAL,
&port_chan, sizeof(port_chan),
&value, &olen); if (ret < 0) {
dev_dbg(&dln2->pdev->dev, "Problem in %s\n", __func__); goto disable_port;
} if (olen < sizeof(value)) {
ret = -EPROTO; goto disable_port;
}
}
staticint dln2_adc_read_all(struct dln2_adc *dln2, struct dln2_adc_get_all_vals *get_all_vals)
{ int ret;
__u8 port = dln2->port; int olen = sizeof(*get_all_vals);
ret = dln2_transfer(dln2->pdev, DLN2_ADC_CHANNEL_GET_ALL_VAL,
&port, sizeof(port), get_all_vals, &olen); if (ret < 0) {
dev_dbg(&dln2->pdev->dev, "Problem in %s\n", __func__); return ret;
} if (olen < sizeof(*get_all_vals)) return -EPROTO;
return ret;
}
staticint dln2_adc_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int *val, int *val2, long mask)
{ int ret; unsignedint microhertz; struct dln2_adc *dln2 = iio_priv(indio_dev);
switch (mask) { case IIO_CHAN_INFO_RAW: if (!iio_device_claim_direct(indio_dev)) return -EBUSY;
mutex_lock(&dln2->mutex);
ret = dln2_adc_read(dln2, chan->channel);
mutex_unlock(&dln2->mutex);
iio_device_release_direct(indio_dev);
if (ret < 0) return ret;
*val = ret; return IIO_VAL_INT;
case IIO_CHAN_INFO_SCALE: /* * Voltage reference is fixed at 3.3v * 3.3 / (1 << 10) * 1000000000
*/
*val = 0;
*val2 = 3222656; return IIO_VAL_INT_PLUS_NANO;
staticint dln2_adc_write_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int val, int val2, long mask)
{ int ret; unsignedint microhertz; struct dln2_adc *dln2 = iio_priv(indio_dev);
switch (mask) { case IIO_CHAN_INFO_SAMP_FREQ:
microhertz = 1000000 * val + val2;
mutex_lock(&dln2->mutex);
dln2->sample_period =
microhertz ? 1000000000 / microhertz : UINT_MAX; if (dln2->sample_period > 65535) {
dln2->sample_period = 65535;
dev_warn(&dln2->pdev->dev, "clamping period to 65535ms\n");
}
/* * The first requested channel is arbitrated as a shared * trigger source, so only one event is registered with the * DLN. The event handler will then read all enabled channel * values using DLN2_ADC_CHANNEL_GET_ALL_VAL to maintain * synchronization between ADC readings.
*/ if (dln2->trigger_chan != -1)
ret = dln2_adc_set_chan_period(dln2,
dln2->trigger_chan, dln2->sample_period); else
ret = 0;
mutex_unlock(&dln2->mutex);
return ret;
default: return -EINVAL;
}
}
staticint dln2_update_scan_mode(struct iio_dev *indio_dev, constunsignedlong *scan_mask)
{ struct dln2_adc *dln2 = iio_priv(indio_dev); int chan_count = indio_dev->num_channels - 1; int ret, i, j;
mutex_lock(&dln2->mutex);
for (i = 0; i < chan_count; ++i) {
ret = dln2_adc_set_chan_enabled(dln2, i,
test_bit(i, scan_mask)); if (ret < 0) { for (j = 0; j < i; ++j)
dln2_adc_set_chan_enabled(dln2, j, false);
mutex_unlock(&dln2->mutex);
dev_err(&dln2->pdev->dev, "Unable to enable ADC channel %d\n", i); return -EBUSY;
}
}
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.