/** * struct adxrs450_state - device instance specific data * @us: actual spi_device * @buf_lock: mutex to protect tx and rx * @tx: transmit buffer * @rx: receive buffer
**/ struct adxrs450_state { struct spi_device *us; struct mutex buf_lock;
__be32 tx __aligned(IIO_DMA_MINALIGN);
__be32 rx;
};
/** * adxrs450_spi_read_reg_16() - read 2 bytes from a register pair * @indio_dev: device associated with child of actual iio_dev * @reg_address: the address of the lower of the two registers, which should be * an even address, the second register's address is reg_address + 1. * @val: somewhere to pass back the value read
**/ staticint adxrs450_spi_read_reg_16(struct iio_dev *indio_dev,
u8 reg_address,
u16 *val)
{ struct adxrs450_state *st = iio_priv(indio_dev);
u32 tx; int ret; struct spi_transfer xfers[] = {
{
.tx_buf = &st->tx,
.len = sizeof(st->tx),
.cs_change = 1,
}, {
.rx_buf = &st->rx,
.len = sizeof(st->rx),
},
};
/** * adxrs450_spi_write_reg_16() - write 2 bytes data to a register pair * @indio_dev: device associated with child of actual actual iio_dev * @reg_address: the address of the lower of the two registers,which should be * an even address, the second register's address is reg_address + 1. * @val: value to be written.
**/ staticint adxrs450_spi_write_reg_16(struct iio_dev *indio_dev,
u8 reg_address,
u16 val)
{ struct adxrs450_state *st = iio_priv(indio_dev);
u32 tx; int ret;
msleep(ADXRS450_STARTUP_DELAY*2);
ret = adxrs450_spi_initial(st, &t, 1); if (ret) return ret; if (t != 0x01)
dev_warn(&st->us->dev, "The initial power on response is not correct! Restart without reset?\n");
msleep(ADXRS450_STARTUP_DELAY);
ret = adxrs450_spi_initial(st, &t, 0); if (ret) return ret;
msleep(ADXRS450_STARTUP_DELAY);
ret = adxrs450_spi_initial(st, &t, 0); if (ret) return ret; if (((t & 0xff) | 0x01) != 0xff || ADXRS450_GET_ST(t) != 2) {
dev_err(&st->us->dev, "The second response is not correct!\n"); return -EIO;
}
ret = adxrs450_spi_initial(st, &t, 0); if (ret) return ret; if (((t & 0xff) | 0x01) != 0xff || ADXRS450_GET_ST(t) != 2) {
dev_err(&st->us->dev, "The third response is not correct!\n"); return -EIO;
}
ret = adxrs450_spi_read_reg_16(indio_dev, ADXRS450_FAULT1, &data); if (ret) return ret; if (data & 0x0fff) {
dev_err(&st->us->dev, "The device is not in normal status!\n"); return -EINVAL;
}
return 0;
}
staticint adxrs450_write_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int val, int val2, long mask)
{ int ret; switch (mask) { case IIO_CHAN_INFO_CALIBBIAS: if (val < -0x400 || val >= 0x400) return -EINVAL;
ret = adxrs450_spi_write_reg_16(indio_dev,
ADXRS450_DNC1, val); break; default:
ret = -EINVAL; break;
} return ret;
}
staticint adxrs450_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int *val, int *val2, long mask)
{ int ret;
s16 t;
switch (mask) { case IIO_CHAN_INFO_RAW: switch (chan->type) { case IIO_ANGL_VEL:
ret = adxrs450_spi_sensor_data(indio_dev, &t); if (ret) break;
*val = t;
ret = IIO_VAL_INT; break; case IIO_TEMP:
ret = adxrs450_spi_read_reg_16(indio_dev,
ADXRS450_TEMP1, &t); if (ret) break;
*val = (t >> 6) + 225;
ret = IIO_VAL_INT; break; default:
ret = -EINVAL; break;
} break; case IIO_CHAN_INFO_SCALE: switch (chan->type) { case IIO_ANGL_VEL:
*val = 0;
*val2 = 218166; return IIO_VAL_INT_PLUS_NANO; case IIO_TEMP:
*val = 200;
*val2 = 0; return IIO_VAL_INT; default: return -EINVAL;
} case IIO_CHAN_INFO_QUADRATURE_CORRECTION_RAW:
ret = adxrs450_spi_read_reg_16(indio_dev, ADXRS450_QUAD1, &t); if (ret) break;
*val = t;
ret = IIO_VAL_INT; break; case IIO_CHAN_INFO_CALIBBIAS:
ret = adxrs450_spi_read_reg_16(indio_dev, ADXRS450_DNC1, &t); if (ret) break;
*val = sign_extend32(t, 9);
ret = IIO_VAL_INT; break; default:
ret = -EINVAL; break;
}
/* setup the industrialio driver allocated elements */
indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st)); if (!indio_dev) return -ENOMEM;
st = iio_priv(indio_dev);
st->us = spi;
mutex_init(&st->buf_lock); /* This is only used for removal purposes */
spi_set_drvdata(spi, indio_dev);
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.