ret = i2c_smbus_write_byte_data(client, STK8312_REG_MODE, mode); if (ret < 0) {
dev_err(&client->dev, "failed to change sensor mode\n"); return ret;
}
data->mode = mode; if (mode & STK8312_MODE_ACTIVE) { /* Need to run OTP sequence before entering active mode */
usleep_range(1000, 5000);
ret = stk8312_otp_init(data);
}
mode = data->mode; /* We need to go in standby mode to modify registers */
ret = stk8312_set_mode(data, STK8312_MODE_STANDBY); if (ret < 0) return ret;
ret = i2c_smbus_write_byte_data(client, STK8312_REG_INTSU, int_mask); if (ret < 0) {
dev_err(&client->dev, "failed to set interrupts\n");
stk8312_set_mode(data, mode); return ret;
}
mode = data->mode; /* We need to go in standby mode to modify registers */
ret = stk8312_set_mode(data, STK8312_MODE_STANDBY); if (ret < 0) return ret;
ret = i2c_smbus_read_byte_data(client, STK8312_REG_SR); if (ret < 0) goto err_activate;
masked_reg = (ret & (~STK8312_SR_MASK)) | rate;
ret = i2c_smbus_write_byte_data(client, STK8312_REG_SR, masked_reg); if (ret < 0) goto err_activate;
data->sample_rate_idx = rate;
return stk8312_set_mode(data, mode);
err_activate:
dev_err(&client->dev, "failed to set sampling rate\n");
stk8312_set_mode(data, mode);
if (range != 1 && range != 2) return -EINVAL; elseif (range == data->range) return 0;
mode = data->mode; /* We need to go in standby mode to modify registers */
ret = stk8312_set_mode(data, STK8312_MODE_STANDBY); if (ret < 0) return ret;
ret = i2c_smbus_read_byte_data(client, STK8312_REG_STH); if (ret < 0) goto err_activate;
masked_reg = ret & (~STK8312_RNG_MASK);
masked_reg |= range << STK8312_RNG_SHIFT;
ret = i2c_smbus_write_byte_data(client, STK8312_REG_STH, masked_reg); if (ret < 0) goto err_activate;
data->range = range;
return stk8312_set_mode(data, mode);
err_activate:
dev_err(&client->dev, "failed to change sensor range\n");
stk8312_set_mode(data, mode);
ret = i2c_smbus_read_byte_data(client, address); if (ret < 0)
dev_err(&client->dev, "register read failed\n");
return ret;
}
staticint stk8312_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int *val, int *val2, long mask)
{ struct stk8312_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 = stk8312_set_mode(data, data->mode | STK8312_MODE_ACTIVE); if (ret < 0) {
mutex_unlock(&data->lock); return ret;
}
ret = stk8312_read_accel(data, chan->address); if (ret < 0) {
stk8312_set_mode(data,
data->mode & (~STK8312_MODE_ACTIVE));
mutex_unlock(&data->lock); return ret;
}
*val = sign_extend32(ret, chan->scan_type.realbits - 1);
ret = stk8312_set_mode(data,
data->mode & (~STK8312_MODE_ACTIVE));
mutex_unlock(&data->lock); if (ret < 0) return ret; return IIO_VAL_INT; case IIO_CHAN_INFO_SCALE:
*val = stk8312_scale_table[data->range - 1][0];
*val2 = stk8312_scale_table[data->range - 1][1]; return IIO_VAL_INT_PLUS_MICRO; case IIO_CHAN_INFO_SAMP_FREQ:
*val = stk8312_samp_freq_table[data->sample_rate_idx].val;
*val2 = stk8312_samp_freq_table[data->sample_rate_idx].val2; return IIO_VAL_INT_PLUS_MICRO;
}
return -EINVAL;
}
staticint stk8312_write_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int val, int val2, long mask)
{ int i; int index = -1; int ret; struct stk8312_data *data = iio_priv(indio_dev);
switch (mask) { case IIO_CHAN_INFO_SCALE: for (i = 0; i < ARRAY_SIZE(stk8312_scale_table); i++) if (val == stk8312_scale_table[i][0] &&
val2 == stk8312_scale_table[i][1]) {
index = i + 1; break;
} if (index < 0) return -EINVAL;
mutex_lock(&data->lock);
ret = stk8312_set_range(data, index);
mutex_unlock(&data->lock);
return ret; case IIO_CHAN_INFO_SAMP_FREQ: for (i = 0; i < ARRAY_SIZE(stk8312_samp_freq_table); i++) if (val == stk8312_samp_freq_table[i].val &&
val2 == stk8312_samp_freq_table[i].val2) {
index = i; break;
} if (index < 0) return -EINVAL;
mutex_lock(&data->lock);
ret = stk8312_set_sample_rate(data, index);
mutex_unlock(&data->lock);
/* A software reset is recommended at power-on */
ret = i2c_smbus_write_byte_data(data->client, STK8312_REG_RESET, 0x00); if (ret < 0) {
dev_err(&client->dev, "failed to reset sensor\n"); return ret;
}
data->sample_rate_idx = STK8312_SR_400HZ_IDX;
ret = stk8312_set_range(data, STK8312_RNG_6G); if (ret < 0) return ret;
ret = stk8312_set_mode(data,
STK8312_MODE_INT_AH_PP | STK8312_MODE_ACTIVE); if (ret < 0) return ret;
if (client->irq > 0) {
ret = devm_request_threaded_irq(&client->dev, client->irq,
stk8312_data_rdy_trig_poll,
NULL,
IRQF_TRIGGER_RISING |
IRQF_ONESHOT, "stk8312_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 = &stk8312_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,
stk8312_trigger_handler,
&stk8312_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.