case IIO_CHAN_INFO_RAW: /* For RAW accesses, stay always in simple-spi. */
ret = ad3552r_hs_reg_read(st,
AD3552R_REG_ADDR_CH_DAC_16B(chan->channel),
val, 2); if (ret) return ret;
staticint ad3552r_hs_write_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int val, int val2, long mask)
{ struct ad3552r_hs_state *st = iio_priv(indio_dev); int ret;
switch (mask) { case IIO_CHAN_INFO_RAW: if (!iio_device_claim_direct(indio_dev)) return -EBUSY; /* For RAW accesses, stay always in simple-spi. */
ret = st->data->bus_reg_write(st->back,
AD3552R_REG_ADDR_CH_DAC_16B(chan->channel),
val, 2);
/* Primary region access, set streaming mode (now in SPI + SDR). */
ret = ad3552r_hs_update_reg_bits(st,
AD3552R_REG_ADDR_INTERFACE_CONFIG_B,
AD3552R_MASK_SINGLE_INST, 0, 1); if (ret) return ret;
/* *Settargetlooplen,keepingthevalue:streamingwritesataddress *0x2cor0x2a,indescendingloop(2or4bytes),keepinglooplen *valuesothatit'snotclearedhereafterwhen_CSisdeasserted.
*/
ret = ad3552r_hs_update_reg_bits(st, AD3552R_REG_ADDR_TRANSFER_REGISTER,
AD3552R_MASK_STREAM_LENGTH_KEEP_VALUE,
AD3552R_MASK_STREAM_LENGTH_KEEP_VALUE, 1); if (ret) goto exit_err_streaming;
ret = st->data->bus_reg_write(st->back,
AD3552R_REG_ADDR_STREAM_MODE,
loop_len, 1); if (ret) goto exit_err_streaming;
st->config_d |= AD3552R_MASK_SPI_CONFIG_DDR;
ret = st->data->bus_reg_write(st->back,
AD3552R_REG_ADDR_INTERFACE_CONFIG_D,
st->config_d, 1); if (ret) goto exit_err_streaming;
ret = iio_backend_ddr_enable(st->back); if (ret) goto exit_err_ddr_mode_target;
/* Set target to best high speed mode (D or QSPI). */
ret = ad3552r_hs_set_target_io_mode_hs(st); if (ret) goto exit_err_ddr_mode;
/* Set bus to best high speed mode (D or QSPI). */
ret = ad3552r_hs_set_bus_io_mode_hs(st); if (ret) goto exit_err_bus_mode_target;
/* *Backendsetupmustbedonenowonly,orrelatedregistervalueswill *bedisruptedbypreviousbusaccesses.
*/
ret = iio_backend_data_transfer_addr(st->back, val); if (ret) goto exit_err_bus_mode_target;
ret = iio_backend_data_format_set(st->back, 0, &fmt); if (ret) goto exit_err_bus_mode_target;
ret = iio_backend_data_stream_enable(st->back); if (ret) goto exit_err_bus_mode_target;
return0;
exit_err_bus_mode_target: /* Back to simple SPI, not using update to avoid read. */
st->data->bus_reg_write(st->back, AD3552R_REG_ADDR_TRANSFER_REGISTER,
FIELD_PREP(AD3552R_MASK_MULTI_IO_MODE,
AD3552R_SPI) |
AD3552R_MASK_STREAM_LENGTH_KEEP_VALUE, 1);
ret = iio_backend_data_stream_disable(st->back); if (ret) return ret;
/* *SetustosimpleSPI,evenifstillinddr,sotobeabletowrite *inprimaryregion.
*/
ret = st->data->bus_set_io_mode(st->back, AD3552R_IO_MODE_SPI); if (ret) return ret;
/* *BacktoSDR(inDDRwecannotread,whateverthemodeis,sonot *usingupdate).
*/
st->config_d &= ~AD3552R_MASK_SPI_CONFIG_DDR;
ret = st->data->bus_reg_write(st->back,
AD3552R_REG_ADDR_INTERFACE_CONFIG_D,
st->config_d, 1); if (ret) return ret;
ret = iio_backend_ddr_disable(st->back); if (ret) return ret;
/* *BacktosimpleSPIforsecondaryregiontoonow,sotobeableto *dump/readregisterstheretooifneeded.
*/
ret = ad3552r_hs_update_reg_bits(st, AD3552R_REG_ADDR_TRANSFER_REGISTER,
AD3552R_MASK_MULTI_IO_MODE,
AD3552R_SPI, 1); if (ret) return ret;
/* Back to single instruction mode, disabling loop. */
ret = ad3552r_hs_update_reg_bits(st,
AD3552R_REG_ADDR_INTERFACE_CONFIG_B,
AD3552R_MASK_SINGLE_INST,
AD3552R_MASK_SINGLE_INST, 1); if (ret) return ret;
return0;
}
staticinlineint ad3552r_hs_set_output_range(struct ad3552r_hs_state *st, int ch, unsignedint mode)
{ int val;
if (ch == 0)
val = FIELD_PREP(AD3552R_MASK_CH0_RANGE, mode); else
val = FIELD_PREP(AD3552R_MASK_CH1_RANGE, mode);
staticint ad3552r_hs_setup(struct ad3552r_hs_state *st)
{
u16 id;
u16 gain = 0, offset = 0;
u32 ch, val, range; int ret;
ret = ad3552r_hs_reset(st); if (ret) return ret;
/* HDL starts with DDR enabled, disabling it. */
ret = iio_backend_ddr_disable(st->back); if (ret) return ret;
ret = st->data->bus_reg_write(st->back,
AD3552R_REG_ADDR_INTERFACE_CONFIG_B,
AD3552R_MASK_SINGLE_INST |
AD3552R_MASK_SHORT_INSTRUCTION, 1); if (ret) return ret;
ret = ad3552r_hs_scratch_pad_test(st); if (ret) return ret;
/* *Cachingconfig_d,neededtorestoreitafterstreaming, *andalso,todetectpossibleDDRread,that'snotallowed.
*/
ret = st->data->bus_reg_read(st->back,
AD3552R_REG_ADDR_INTERFACE_CONFIG_D,
&st->config_d, 1); if (ret) return ret;
ret = ad3552r_hs_reg_read(st, AD3552R_REG_ADDR_PRODUCT_ID_L, &val, 1); if (ret) return ret;
id = val;
ret = ad3552r_hs_reg_read(st, AD3552R_REG_ADDR_PRODUCT_ID_H, &val, 1); if (ret) return ret;
id |= val << 8; if (id != st->model_data->chip_id)
dev_warn(st->dev, "chip ID mismatch, detected 0x%x but expected 0x%x\n",
id, st->model_data->chip_id);
dev_dbg(st->dev, "chip id %s detected", st->model_data->model_name);
/* Clear reset error flag, see ad3552r manual, rev B table 38. */
ret = st->data->bus_reg_write(st->back, AD3552R_REG_ADDR_ERR_STATUS,
AD3552R_MASK_RESET_STATUS, 1); if (ret) return ret;
ret = st->data->bus_reg_write(st->back,
AD3552R_REG_ADDR_SH_REFERENCE_CONFIG, 0, 1); if (ret) return ret;
ret = ad3552r_hs_set_data_source(st, IIO_BACKEND_EXTERNAL); if (ret) return ret;
ret = ad3552r_get_ref_voltage(st->dev, &val); if (ret < 0) return ret;
val = ret;
ret = ad3552r_hs_update_reg_bits(st,
AD3552R_REG_ADDR_SH_REFERENCE_CONFIG,
AD3552R_MASK_REFERENCE_VOLTAGE_SEL,
val, 1); if (ret) return ret;
ret = ad3552r_get_drive_strength(st->dev, &val); if (!ret) {
st->config_d |=
FIELD_PREP(AD3552R_MASK_SDO_DRIVE_STRENGTH, val);
ret = st->data->bus_reg_write(st->back,
AD3552R_REG_ADDR_INTERFACE_CONFIG_D,
st->config_d, 1); if (ret) return ret;
}
device_for_each_child_node_scoped(st->dev, child) {
ret = fwnode_property_read_u32(child, "reg", &ch); if (ret) return dev_err_probe(st->dev, ret, "reg property missing\n");
ret = ad3552r_get_output_range(st->dev, st->model_data, child,
&range); if (ret && ret != -ENOENT) return ret; if (ret == -ENOENT) {
ret = ad3552r_get_custom_gain(st->dev, child,
&st->ch_data[ch].p,
&st->ch_data[ch].n,
&st->ch_data[ch].rfb,
&st->ch_data[ch].gain_offset); if (ret) return ret;
gain = ad3552r_calc_custom_gain(st->ch_data[ch].p,
st->ch_data[ch].n,
st->ch_data[ch].gain_offset);
offset = abs(st->ch_data[ch].gain_offset);
st->ch_data[ch].range_override = 1;
ret = ad3552r_hs_setup_custom_gain(st, ch, gain,
offset); if (ret) return ret;
} else {
st->ch_data[ch].range = range;
ret = ad3552r_hs_set_output_range(st, ch, range); if (ret) return ret;
}
¤ Diese beiden folgenden Angebotsgruppen bietet das Unternehmen0.19Angebot
(Wie Sie bei der Firma Beratungs- und Dienstleistungen beauftragen können 2026-09-27)
¤
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.