ret = spi_w8r8(st->spi, ADXRS290_READ_REG(ADXRS290_REG_POWER_CTL)); if (ret < 0) goto out_unlock;
val = ret;
switch (mode) { case ADXRS290_MODE_STANDBY:
val &= ~ADXRS290_MEASUREMENT; break; case ADXRS290_MODE_MEASUREMENT:
val |= ADXRS290_MEASUREMENT; break; default:
ret = -EINVAL; goto out_unlock;
}
ret = adxrs290_spi_write_reg(st->spi, ADXRS290_REG_POWER_CTL, val); if (ret < 0) {
dev_err(&st->spi->dev, "unable to set mode: %d\n", ret); goto out_unlock;
}
staticint adxrs290_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int *val, int *val2, long mask)
{ struct adxrs290_state *st = iio_priv(indio_dev); unsignedint t; int ret;
switch (mask) { case IIO_CHAN_INFO_RAW: if (!iio_device_claim_direct(indio_dev)) return -EBUSY;
switch (chan->type) { case IIO_ANGL_VEL:
ret = adxrs290_get_rate_data(indio_dev,
ADXRS290_READ_REG(chan->address),
val); if (ret < 0) break;
ret = IIO_VAL_INT; break; case IIO_TEMP:
ret = adxrs290_get_temp_data(indio_dev, val); if (ret < 0) break;
ret = IIO_VAL_INT; break; default:
ret = -EINVAL; break;
}
iio_device_release_direct(indio_dev); return ret; case IIO_CHAN_INFO_SCALE: switch (chan->type) { case IIO_ANGL_VEL: /* 1 LSB = 0.005 degrees/sec */
*val = 0;
*val2 = 87266; return IIO_VAL_INT_PLUS_NANO; case IIO_TEMP: /* 1 LSB = 0.1 degrees Celsius */
*val = 100; return IIO_VAL_INT; default: return -EINVAL;
} case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY: switch (chan->type) { case IIO_ANGL_VEL:
t = st->lpf_3db_freq_idx;
*val = adxrs290_lpf_3db_freq_hz_table[t][0];
*val2 = adxrs290_lpf_3db_freq_hz_table[t][1]; return IIO_VAL_INT_PLUS_MICRO; default: return -EINVAL;
} case IIO_CHAN_INFO_HIGH_PASS_FILTER_3DB_FREQUENCY: switch (chan->type) { case IIO_ANGL_VEL:
t = st->hpf_3db_freq_idx;
*val = adxrs290_hpf_3db_freq_hz_table[t][0];
*val2 = adxrs290_hpf_3db_freq_hz_table[t][1]; return IIO_VAL_INT_PLUS_MICRO; default: return -EINVAL;
}
}
return -EINVAL;
}
staticint adxrs290_write_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int val, int val2, long mask)
{ struct adxrs290_state *st = iio_priv(indio_dev); int ret, lpf_idx, hpf_idx;
if (!iio_device_claim_direct(indio_dev)) return -EBUSY;
switch (mask) { case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY:
lpf_idx = adxrs290_find_match(adxrs290_lpf_3db_freq_hz_table,
ARRAY_SIZE(adxrs290_lpf_3db_freq_hz_table),
val, val2); if (lpf_idx < 0) {
ret = -EINVAL; break;
}
/* caching the updated state of the low-pass filter */
st->lpf_3db_freq_idx = lpf_idx; /* retrieving the current state of the high-pass filter */
hpf_idx = st->hpf_3db_freq_idx;
ret = adxrs290_set_filter_freq(indio_dev, lpf_idx, hpf_idx); break;
case IIO_CHAN_INFO_HIGH_PASS_FILTER_3DB_FREQUENCY:
hpf_idx = adxrs290_find_match(adxrs290_hpf_3db_freq_hz_table,
ARRAY_SIZE(adxrs290_hpf_3db_freq_hz_table),
val, val2); if (hpf_idx < 0) {
ret = -EINVAL; break;
}
/* caching the updated state of the high-pass filter */
st->hpf_3db_freq_idx = hpf_idx; /* retrieving the current state of the low-pass filter */
lpf_idx = st->lpf_3db_freq_idx;
ret = adxrs290_set_filter_freq(indio_dev, lpf_idx, hpf_idx); break;
/* * Data ready interrupt is reset after a read of the data registers. * Here, we only read the 16b DATAY registers as that marks the end of * a read of the data registers and initiates a reset for the interrupt * line.
*/
adxrs290_get_rate_data(indio_dev,
ADXRS290_READ_REG(ADXRS290_REG_DATAY0), &val);
}
/* exercise a bulk data capture starting from reg DATAX0... */
ret = spi_write_then_read(st->spi, &tx, sizeof(tx), st->buffer.channels, sizeof(st->buffer.channels)); if (ret < 0) goto out_unlock_notify;
val = spi_w8r8(spi, ADXRS290_READ_REG(ADXRS290_REG_ADI_ID)); if (val != ADXRS290_ADI_ID) {
dev_err(&spi->dev, "Wrong ADI ID 0x%02x\n", val); return -ENODEV;
}
val = spi_w8r8(spi, ADXRS290_READ_REG(ADXRS290_REG_MEMS_ID)); if (val != ADXRS290_MEMS_ID) {
dev_err(&spi->dev, "Wrong MEMS ID 0x%02x\n", val); return -ENODEV;
}
val = spi_w8r8(spi, ADXRS290_READ_REG(ADXRS290_REG_DEV_ID)); if (val != ADXRS290_DEV_ID) {
dev_err(&spi->dev, "Wrong DEV ID 0x%02x\n", val); return -ENODEV;
}
/* default mode the gyroscope starts in */
st->mode = ADXRS290_MODE_STANDBY;
/* switch to measurement mode and switch on the temperature sensor */
ret = adxrs290_initial_setup(indio_dev); if (ret < 0) return ret;
/* max transition time to measurement mode */
msleep(ADXRS290_MAX_TRANSITION_TIME_MS);
ret = adxrs290_get_3db_freq(indio_dev, &val, &val2); if (ret < 0) return ret;
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.