Lines Matching +full:output +full:- +full:gain

10  * SPDX-License-Identifier: Apache-2.0
50 /** Gain used on output value */
51 enum adc_gain gain; member
111 const struct adc_emul_config *config = dev->config; in adc_emul_const_value_set()
112 struct adc_emul_data *data = dev->data; in adc_emul_const_value_set()
115 if (chan >= config->num_channels) { in adc_emul_const_value_set()
117 return -EINVAL; in adc_emul_const_value_set()
120 chan_cfg = &data->chan_cfg[chan]; in adc_emul_const_value_set()
122 k_mutex_lock(&data->cfg_mtx, K_FOREVER); in adc_emul_const_value_set()
124 chan_cfg->input = ADC_EMUL_CONST_VALUE; in adc_emul_const_value_set()
125 chan_cfg->const_value = value; in adc_emul_const_value_set()
127 k_mutex_unlock(&data->cfg_mtx); in adc_emul_const_value_set()
134 const struct adc_emul_config *config = dev->config; in adc_emul_const_raw_value_set()
135 struct adc_emul_data *data = dev->data; in adc_emul_const_raw_value_set()
138 if (chan >= config->num_channels) { in adc_emul_const_raw_value_set()
140 return -EINVAL; in adc_emul_const_raw_value_set()
143 chan_cfg = &data->chan_cfg[chan]; in adc_emul_const_raw_value_set()
145 k_mutex_lock(&data->cfg_mtx, K_FOREVER); in adc_emul_const_raw_value_set()
147 chan_cfg->input = ADC_EMUL_CONST_RAW_VALUE; in adc_emul_const_raw_value_set()
148 chan_cfg->const_value = raw_value; in adc_emul_const_raw_value_set()
150 k_mutex_unlock(&data->cfg_mtx); in adc_emul_const_raw_value_set()
158 const struct adc_emul_config *config = dev->config; in adc_emul_value_func_set()
159 struct adc_emul_data *data = dev->data; in adc_emul_value_func_set()
162 if (chan >= config->num_channels) { in adc_emul_value_func_set()
164 return -EINVAL; in adc_emul_value_func_set()
167 chan_cfg = &data->chan_cfg[chan]; in adc_emul_value_func_set()
169 k_mutex_lock(&data->cfg_mtx, K_FOREVER); in adc_emul_value_func_set()
171 chan_cfg->func = func; in adc_emul_value_func_set()
172 chan_cfg->func_data = func_data; in adc_emul_value_func_set()
173 chan_cfg->input = ADC_EMUL_CUSTOM_FUNC; in adc_emul_value_func_set()
175 k_mutex_unlock(&data->cfg_mtx); in adc_emul_value_func_set()
183 const struct adc_emul_config *config = dev->config; in adc_emul_raw_value_func_set()
184 struct adc_emul_data *data = dev->data; in adc_emul_raw_value_func_set()
187 if (chan >= config->num_channels) { in adc_emul_raw_value_func_set()
189 return -EINVAL; in adc_emul_raw_value_func_set()
192 chan_cfg = &data->chan_cfg[chan]; in adc_emul_raw_value_func_set()
194 k_mutex_lock(&data->cfg_mtx, K_FOREVER); in adc_emul_raw_value_func_set()
196 chan_cfg->func = func; in adc_emul_raw_value_func_set()
197 chan_cfg->func_data = func_data; in adc_emul_raw_value_func_set()
198 chan_cfg->input = ADC_EMUL_CUSTOM_FUNC_RAW_VALUE; in adc_emul_raw_value_func_set()
200 k_mutex_unlock(&data->cfg_mtx); in adc_emul_raw_value_func_set()
208 struct adc_emul_data *data = dev->data; in adc_emul_ref_voltage_set()
211 k_mutex_lock(&data->cfg_mtx, K_FOREVER); in adc_emul_ref_voltage_set()
215 data->ref_vdd = value; in adc_emul_ref_voltage_set()
218 data->ref_int = value; in adc_emul_ref_voltage_set()
221 data->ref_ext0 = value; in adc_emul_ref_voltage_set()
224 data->ref_ext1 = value; in adc_emul_ref_voltage_set()
227 err = -EINVAL; in adc_emul_ref_voltage_set()
230 k_mutex_unlock(&data->cfg_mtx); in adc_emul_ref_voltage_set()
249 k_mutex_lock(&data->cfg_mtx, K_FOREVER); in adc_emul_get_ref_voltage()
253 voltage = data->ref_vdd; in adc_emul_get_ref_voltage()
256 voltage = data->ref_vdd / 2; in adc_emul_get_ref_voltage()
259 voltage = data->ref_vdd / 3; in adc_emul_get_ref_voltage()
262 voltage = data->ref_vdd / 4; in adc_emul_get_ref_voltage()
265 voltage = data->ref_int; in adc_emul_get_ref_voltage()
268 voltage = data->ref_ext0; in adc_emul_get_ref_voltage()
271 voltage = data->ref_ext1; in adc_emul_get_ref_voltage()
277 k_mutex_unlock(&data->cfg_mtx); in adc_emul_get_ref_voltage()
285 const struct adc_emul_config *config = dev->config; in adc_emul_channel_setup()
287 struct adc_emul_data *data = dev->data; in adc_emul_channel_setup()
289 if (channel_cfg->channel_id >= config->num_channels) { in adc_emul_channel_setup()
290 LOG_ERR("unsupported channel id '%d'", channel_cfg->channel_id); in adc_emul_channel_setup()
291 return -ENOTSUP; in adc_emul_channel_setup()
294 if (adc_emul_get_ref_voltage(data, channel_cfg->reference) == 0) { in adc_emul_channel_setup()
296 channel_cfg->reference); in adc_emul_channel_setup()
297 return -ENOTSUP; in adc_emul_channel_setup()
300 if (channel_cfg->differential) { in adc_emul_channel_setup()
302 return -ENOTSUP; in adc_emul_channel_setup()
305 emul_chan_cfg = &data->chan_cfg[channel_cfg->channel_id]; in adc_emul_channel_setup()
307 k_mutex_lock(&data->cfg_mtx, K_FOREVER); in adc_emul_channel_setup()
309 emul_chan_cfg->gain = channel_cfg->gain; in adc_emul_channel_setup()
310 emul_chan_cfg->ref = channel_cfg->reference; in adc_emul_channel_setup()
312 k_mutex_unlock(&data->cfg_mtx); in adc_emul_channel_setup()
324 * @return -ENOMEM if buffer is not big enough
329 const struct adc_emul_config *config = dev->config; in adc_emul_check_buffer_size()
334 for (mask = BIT(config->num_channels - 1); mask != 0; mask >>= 1) { in adc_emul_check_buffer_size()
335 if (mask & sequence->channels) { in adc_emul_check_buffer_size()
341 if (sequence->options) { in adc_emul_check_buffer_size()
342 needed *= (1 + sequence->options->extra_samplings); in adc_emul_check_buffer_size()
345 if (sequence->buffer_size < needed) { in adc_emul_check_buffer_size()
346 return -ENOMEM; in adc_emul_check_buffer_size()
359 * @return -ENOTSUP if requested resolution or channel is out side of supported
361 * @return -ENOMEM if buffer is not big enough
368 const struct adc_emul_config *config = dev->config; in adc_emul_start_read()
369 struct adc_emul_data *data = dev->data; in adc_emul_start_read()
372 if (sequence->resolution > ADC_EMUL_MAX_RESOLUTION || in adc_emul_start_read()
373 sequence->resolution == 0) { in adc_emul_start_read()
374 LOG_ERR("unsupported resolution %d", sequence->resolution); in adc_emul_start_read()
375 return -ENOTSUP; in adc_emul_start_read()
378 if (find_msb_set(sequence->channels) > config->num_channels) { in adc_emul_start_read()
380 sequence->channels); in adc_emul_start_read()
381 return -ENOTSUP; in adc_emul_start_read()
390 data->res_mask = BIT_MASK(sequence->resolution); in adc_emul_start_read()
391 data->buf = sequence->buffer; in adc_emul_start_read()
392 adc_context_start_read(&data->ctx, sequence); in adc_emul_start_read()
394 return adc_context_wait_for_completion(&data->ctx); in adc_emul_start_read()
401 struct adc_emul_data *data = dev->data; in adc_emul_read_async()
404 adc_context_lock(&data->ctx, async ? true : false, async); in adc_emul_read_async()
406 adc_context_release(&data->ctx, err); in adc_emul_read_async()
422 data->channels = ctx->sequence.channels; in adc_context_start_sampling()
423 data->repeat_buf = data->buf; in adc_context_start_sampling()
425 k_sem_give(&data->sem); in adc_context_start_sampling()
435 data->buf = data->repeat_buf; in adc_context_update_buffer_pointer()
440 * @brief Convert input voltage of ADC @p chan to raw output value
444 * @param result Raw output value
447 * @return -EINVAL if failed to get reference voltage or unknown input is
455 struct adc_emul_chan_cfg *chan_cfg = &data->chan_cfg[chan]; in adc_emul_get_chan_value()
461 k_mutex_lock(&data->cfg_mtx, K_FOREVER); in adc_emul_get_chan_value()
464 switch (chan_cfg->input) { in adc_emul_get_chan_value()
466 input_mV = chan_cfg->const_value; in adc_emul_get_chan_value()
470 err = chan_cfg->func(data->dev, chan, chan_cfg->func_data, in adc_emul_get_chan_value()
480 temp = chan_cfg->const_value; in adc_emul_get_chan_value()
484 err = chan_cfg->func(data->dev, chan, chan_cfg->func_data, &input_mV); in adc_emul_get_chan_value()
493 LOG_ERR("unknown input source %d", chan_cfg->input); in adc_emul_get_chan_value()
494 err = -EINVAL; in adc_emul_get_chan_value()
498 /* Get reference voltage and apply inverted gain */ in adc_emul_get_chan_value()
499 ref_v = adc_emul_get_ref_voltage(data, chan_cfg->ref); in adc_emul_get_chan_value()
500 err = adc_gain_invert(chan_cfg->gain, &ref_v); in adc_emul_get_chan_value()
503 err = -EINVAL; in adc_emul_get_chan_value()
507 /* Calculate output value */ in adc_emul_get_chan_value()
508 temp = (uint64_t)input_mV * data->res_mask / ref_v; in adc_emul_get_chan_value()
511 /* If output value is greater than resolution, it has to be trimmed */ in adc_emul_get_chan_value()
512 if (temp > data->res_mask) { in adc_emul_get_chan_value()
513 temp = data->res_mask; in adc_emul_get_chan_value()
519 k_mutex_unlock(&data->cfg_mtx); in adc_emul_get_chan_value()
528 * mV value is converted to output using reference voltage, gain
544 k_sem_take(&data->sem, K_FOREVER); in adc_emul_acquisition_thread()
548 while (data->channels) { in adc_emul_acquisition_thread()
550 unsigned int chan = find_lsb_set(data->channels) - 1; in adc_emul_acquisition_thread()
556 adc_context_complete(&data->ctx, err); in adc_emul_acquisition_thread()
562 *data->buf++ = result; in adc_emul_acquisition_thread()
563 WRITE_BIT(data->channels, chan, 0); in adc_emul_acquisition_thread()
567 adc_context_on_sampling_done(&data->ctx, data->dev); in adc_emul_acquisition_thread()
582 const struct adc_emul_config *config = dev->config; in adc_emul_init()
583 struct adc_emul_data *data = dev->data; in adc_emul_init()
586 data->dev = dev; in adc_emul_init()
588 k_sem_init(&data->sem, 0, 1); in adc_emul_init()
589 k_mutex_init(&data->cfg_mtx); in adc_emul_init()
591 for (chan = 0; chan < config->num_channels; chan++) { in adc_emul_init()
592 struct adc_emul_chan_cfg *chan_cfg = &data->chan_cfg[chan]; in adc_emul_init()
594 chan_cfg->func = NULL; in adc_emul_init()
595 chan_cfg->func_data = NULL; in adc_emul_init()
596 chan_cfg->input = ADC_EMUL_CONST_VALUE; in adc_emul_init()
597 chan_cfg->const_value = 0; in adc_emul_init()
600 k_thread_create(&data->thread, data->stack, in adc_emul_init()
607 adc_context_unlock_unconditionally(&data->ctx); in adc_emul_init()