if (state)
ret = i2c_smbus_write_byte_data(data->client,
STK8BA50_REG_INTEN2, STK8BA50_DREADY_INT_MASK); else
ret = i2c_smbus_write_byte_data(data->client,
STK8BA50_REG_INTEN2, 0x00);
if (ret < 0)
dev_err(&data->client->dev, "failed to set trigger state\n"); else
data->dready_trigger_on = state;
ret = i2c_smbus_read_byte_data(client, STK8BA50_REG_POWMODE); if (ret < 0) goto exit_err;
if (mode)
masked_reg = ret | STK8BA50_MODE_POWERBIT; else
masked_reg = ret & (~STK8BA50_MODE_POWERBIT);
ret = i2c_smbus_write_byte_data(client, STK8BA50_REG_POWMODE,
masked_reg); if (ret < 0) goto exit_err;
return ret;
exit_err:
dev_err(&client->dev, "failed to change sensor mode\n"); return ret;
}
staticint stk8ba50_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int *val, int *val2, long mask)
{ struct stk8ba50_data *data = iio_priv(indio_dev); int ret;
switch (mask) { case IIO_CHAN_INFO_RAW: if (iio_buffer_enabled(indio_dev)) return -EBUSY;
mutex_lock(&data->lock);
ret = stk8ba50_set_power(data, STK8BA50_MODE_NORMAL); if (ret < 0) {
mutex_unlock(&data->lock); return -EINVAL;
}
ret = stk8ba50_read_accel(data, chan->address); if (ret < 0) {
stk8ba50_set_power(data, STK8BA50_MODE_SUSPEND);
mutex_unlock(&data->lock); return -EINVAL;
}
*val = sign_extend32(ret >> chan->scan_type.shift,
chan->scan_type.realbits - 1);
stk8ba50_set_power(data, STK8BA50_MODE_SUSPEND);
mutex_unlock(&data->lock); return IIO_VAL_INT; case IIO_CHAN_INFO_SCALE:
*val = 0;
*val2 = stk8ba50_scale_table[data->range].scale_val; return IIO_VAL_INT_PLUS_MICRO; case IIO_CHAN_INFO_SAMP_FREQ:
*val = stk8ba50_samp_freq_table
[data->sample_rate_idx].samp_freq;
*val2 = 0; return IIO_VAL_INT;
}
return -EINVAL;
}
staticint stk8ba50_write_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int val, int val2, long mask)
{ int ret; int i; int index = -1; struct stk8ba50_data *data = iio_priv(indio_dev);
switch (mask) { case IIO_CHAN_INFO_SCALE: if (val != 0) return -EINVAL;
for (i = 0; i < ARRAY_SIZE(stk8ba50_scale_table); i++) if (val2 == stk8ba50_scale_table[i].scale_val) {
index = i; break;
} if (index < 0) return -EINVAL;
ret = i2c_smbus_write_byte_data(data->client,
STK8BA50_REG_RANGE,
stk8ba50_scale_table[index].reg_val); if (ret < 0)
dev_err(&data->client->dev, "failed to set measurement range\n"); else
data->range = index;
return ret; case IIO_CHAN_INFO_SAMP_FREQ: for (i = 0; i < ARRAY_SIZE(stk8ba50_samp_freq_table); i++) if (val == stk8ba50_samp_freq_table[i].samp_freq) {
index = i; break;
} if (index < 0) return -EINVAL;
ret = i2c_smbus_write_byte_data(data->client,
STK8BA50_REG_BWSEL,
stk8ba50_samp_freq_table[index].reg_val); if (ret < 0)
dev_err(&data->client->dev, "failed to set sampling rate\n"); else
data->sample_rate_idx = index;
mutex_lock(&data->lock); /* * Do a bulk read if all channels are requested, * from 0x02 (XOUT1) to 0x07 (ZOUT2)
*/ if (*(indio_dev->active_scan_mask) == STK8BA50_ALL_CHANNEL_MASK) {
ret = i2c_smbus_read_i2c_block_data(data->client,
STK8BA50_REG_XOUT,
STK8BA50_ALL_CHANNEL_SIZE,
(u8 *)data->scan.chans); if (ret < STK8BA50_ALL_CHANNEL_SIZE) {
dev_err(&data->client->dev, "register read failed\n"); goto err;
}
} else {
iio_for_each_active_channel(indio_dev, bit) {
ret = stk8ba50_read_accel(data,
stk8ba50_channel_table[bit]); if (ret < 0) goto err;
/* Reset all registers on startup */
ret = i2c_smbus_write_byte_data(client,
STK8BA50_REG_SWRST, STK8BA50_RESET_CMD); if (ret < 0) {
dev_err(&client->dev, "failed to reset sensor\n"); goto err_power_off;
}
/* The default range is +/-2g */
data->range = 0;
/* The default sampling rate is 1792 Hz (maximum) */
data->sample_rate_idx = STK8BA50_SR_1792HZ_IDX;
/* Set up interrupts */
ret = i2c_smbus_write_byte_data(client,
STK8BA50_REG_INTEN2, STK8BA50_DREADY_INT_MASK); if (ret < 0) {
dev_err(&client->dev, "failed to set up interrupts\n"); goto err_power_off;
}
ret = i2c_smbus_write_byte_data(client,
STK8BA50_REG_INTMAP2, STK8BA50_DREADY_INT_MAP); if (ret < 0) {
dev_err(&client->dev, "failed to set up interrupts\n"); goto err_power_off;
}
if (client->irq > 0) {
ret = devm_request_threaded_irq(&client->dev, client->irq,
stk8ba50_data_rdy_trig_poll,
NULL,
IRQF_TRIGGER_RISING |
IRQF_ONESHOT, "stk8ba50_event",
indio_dev); if (ret < 0) {
dev_err(&client->dev, "request irq %d failed\n",
client->irq); goto err_power_off;
}
data->dready_trig = devm_iio_trigger_alloc(&client->dev, "%s-dev%d",
indio_dev->name,
iio_device_id(indio_dev)); if (!data->dready_trig) {
ret = -ENOMEM; goto err_power_off;
}
data->dready_trig->ops = &stk8ba50_trigger_ops;
iio_trigger_set_drvdata(data->dready_trig, indio_dev);
ret = iio_trigger_register(data->dready_trig); if (ret) {
dev_err(&client->dev, "iio trigger register failed\n"); goto err_power_off;
}
}
ret = iio_triggered_buffer_setup(indio_dev,
iio_pollfunc_store_time,
stk8ba50_trigger_handler,
&stk8ba50_buffer_setup_ops); if (ret < 0) {
dev_err(&client->dev, "iio triggered buffer setup failed\n"); goto err_trigger_unregister;
}
ret = iio_device_register(indio_dev); if (ret < 0) {
dev_err(&client->dev, "device_register failed\n"); goto err_buffer_cleanup;
}
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.