staticint bma220_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int *val, int *val2, long mask)
{ int ret;
u8 range_idx; struct bma220_data *data = iio_priv(indio_dev);
switch (mask) { case IIO_CHAN_INFO_RAW:
ret = bma220_read_reg(data->spi_device, chan->address); if (ret < 0) return -EINVAL;
*val = sign_extend32(ret >> chan->scan_type.shift,
chan->scan_type.realbits - 1); return IIO_VAL_INT; case IIO_CHAN_INFO_SCALE:
ret = bma220_read_reg(data->spi_device, BMA220_REG_RANGE); if (ret < 0) return ret;
range_idx = ret & BMA220_RANGE_MASK;
*val = bma220_scale_table[range_idx][0];
*val2 = bma220_scale_table[range_idx][1]; return IIO_VAL_INT_PLUS_MICRO;
}
return -EINVAL;
}
staticint bma220_write_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int val, int val2, long mask)
{ int i; int ret; int index = -1; struct bma220_data *data = iio_priv(indio_dev);
switch (mask) { case IIO_CHAN_INFO_SCALE: for (i = 0; i < ARRAY_SIZE(bma220_scale_table); i++) if (val == bma220_scale_table[i][0] &&
val2 == bma220_scale_table[i][1]) {
index = i; break;
} if (index < 0) return -EINVAL;
mutex_lock(&data->lock);
data->tx_buf[0] = BMA220_REG_RANGE;
data->tx_buf[1] = index;
ret = spi_write(data->spi_device, data->tx_buf, sizeof(data->tx_buf)); if (ret < 0)
dev_err(&data->spi_device->dev, "failed to set measurement range\n");
mutex_unlock(&data->lock);
staticint bma220_init(struct spi_device *spi)
{ int ret;
ret = bma220_read_reg(spi, BMA220_REG_ID); if (ret != BMA220_CHIP_ID) return -ENODEV;
/* Make sure the chip is powered on */
ret = bma220_read_reg(spi, BMA220_REG_SUSPEND); if (ret == BMA220_SUSPEND_WAKE)
ret = bma220_read_reg(spi, BMA220_REG_SUSPEND); if (ret < 0) return ret; if (ret == BMA220_SUSPEND_WAKE) return -EBUSY;
return 0;
}
staticint bma220_power(struct spi_device *spi, bool up)
{ int i, ret;
/** * The chip can be suspended/woken up by a simple register read. * So, we need up to 2 register reads of the suspend register * to make sure that the device is in the desired state.
*/ for (i = 0; i < 2; i++) {
ret = bma220_read_reg(spi, BMA220_REG_SUSPEND); if (ret < 0) return ret;
if (up && ret == BMA220_SUSPEND_SLEEP) return 0;
if (!up && ret == BMA220_SUSPEND_WAKE) return 0;
}
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.