Lines Matching +full:data +full:- +full:pin +full:- +full:start

4  * SPDX-License-Identifier: Apache-2.0
14 #include <zephyr/dt-bindings/adc/b91-adc.h>
28 /* B91 ADC driver data */
46 /* Validate ADC data buffer size */
51 if (sequence->options) { in adc_b91_validate_buffer_size()
52 needed *= (1 + sequence->options->extra_samplings); in adc_b91_validate_buffer_size()
55 if (sequence->buffer_size < needed) { in adc_b91_validate_buffer_size()
56 return -ENOMEM; in adc_b91_validate_buffer_size()
67 if (sequence->channels != BIT(0)) { in adc_b91_validate_sequence()
69 return -ENOTSUP; in adc_b91_validate_sequence()
72 if (sequence->oversampling) { in adc_b91_validate_sequence()
74 return -ENOTSUP; in adc_b91_validate_sequence()
86 /* Convert dts pin to B91 SDK pin */
150 /* ADC Context API implementation: start sampling */
153 struct b91_adc_data *data = in adc_context_start_sampling() local
156 data->repeat_buffer = data->buffer; in adc_context_start_sampling()
160 k_sem_give(&data->acq_sem); in adc_context_start_sampling()
166 struct b91_adc_data *data = in adc_context_update_buffer_pointer() local
170 data->buffer = data->repeat_buffer; in adc_context_update_buffer_pointer()
174 /* Start ADC measurements */
178 struct b91_adc_data *data = dev->data; in adc_b91_adc_start_read() local
187 switch (sequence->resolution) { in adc_b91_adc_start_read()
190 data->resolution_divider = 1; in adc_b91_adc_start_read()
194 data->resolution_divider = 4; in adc_b91_adc_start_read()
198 data->resolution_divider = 16; in adc_b91_adc_start_read()
202 data->resolution_divider = 64; in adc_b91_adc_start_read()
206 return -EINVAL; in adc_b91_adc_start_read()
210 data->buffer = sequence->buffer; in adc_b91_adc_start_read()
212 /* Start ADC conversion */ in adc_b91_adc_start_read()
213 adc_context_start_read(&data->ctx, sequence); in adc_b91_adc_start_read()
215 return adc_context_wait_for_completion(&data->ctx); in adc_b91_adc_start_read()
226 struct b91_adc_data *data = dev->data; in adc_b91_acquisition_thread() local
230 k_sem_take(&data->acq_sem, K_FOREVER); in adc_b91_acquisition_thread()
232 /* Wait for ADC data ready */ in adc_b91_acquisition_thread()
238 adc_code = (adc_b91_get_code() / data->resolution_divider); in adc_b91_acquisition_thread()
239 if (!data->differential) { in adc_b91_acquisition_thread()
240 /* Sign bit is not used in case of single-ended configuration */ in adc_b91_acquisition_thread()
243 /* Do not return negative value for single-ended configuration */ in adc_b91_acquisition_thread()
248 *data->buffer++ = adc_code; in adc_b91_acquisition_thread()
254 adc_context_on_sampling_done(&data->ctx, dev); in adc_b91_acquisition_thread()
261 struct b91_adc_data *data = dev->data; in adc_b91_init() local
263 k_sem_init(&data->acq_sem, 0, 1); in adc_b91_init()
265 k_thread_create(&data->thread, data->stack, in adc_b91_init()
272 adc_context_unlock_unconditionally(&data->ctx); in adc_b91_init()
287 struct b91_adc_data *data = dev->data; in adc_b91_channel_setup() local
288 const struct b91_adc_cfg *config = dev->config; in adc_b91_channel_setup()
291 if (channel_cfg->channel_id > 0) { in adc_b91_channel_setup()
293 return -EINVAL; in adc_b91_channel_setup()
297 if (channel_cfg->reference != ADC_REF_INTERNAL) { in adc_b91_channel_setup()
299 return -EINVAL; in adc_b91_channel_setup()
303 switch (config->vref_internal_mv) { in adc_b91_channel_setup()
312 return -EINVAL; in adc_b91_channel_setup()
316 switch (config->sample_freq) { in adc_b91_channel_setup()
328 return -EINVAL; in adc_b91_channel_setup()
332 switch (channel_cfg->gain) { in adc_b91_channel_setup()
341 return -EINVAL; in adc_b91_channel_setup()
345 switch (channel_cfg->acquisition_time) { in adc_b91_channel_setup()
374 return -EINVAL; in adc_b91_channel_setup()
378 input_positive = adc_b91_get_pin(channel_cfg->input_positive); in adc_b91_channel_setup()
379 input_negative = adc_b91_get_pin(channel_cfg->input_negative); in adc_b91_channel_setup()
381 channel_cfg->differential) { in adc_b91_channel_setup()
382 LOG_ERR("VBAT pin is not available for differential mode."); in adc_b91_channel_setup()
383 return -EINVAL; in adc_b91_channel_setup()
384 } else if (channel_cfg->differential && (input_negative == (uint8_t)NOINPUTN)) { in adc_b91_channel_setup()
386 return -EINVAL; in adc_b91_channel_setup()
390 data->differential = channel_cfg->differential; in adc_b91_channel_setup()
396 if (channel_cfg->differential) { in adc_b91_channel_setup()
400 adc_set_diff_input(channel_cfg->input_positive, channel_cfg->input_negative); in adc_b91_channel_setup()
402 /* Single-ended Vbat pin configuration */ in adc_b91_channel_setup()
405 /* Single-ended GPIO pin configuration */ in adc_b91_channel_setup()
407 adc_set_diff_input(channel_cfg->input_positive, GND); in adc_b91_channel_setup()
418 struct b91_adc_data *data = dev->data; in adc_b91_read() local
420 adc_context_lock(&data->ctx, false, NULL); in adc_b91_read()
422 adc_context_release(&data->ctx, status); in adc_b91_read()
434 struct b91_adc_data *data = dev->data; in adc_b91_read_async() local
436 adc_context_lock(&data->ctx, true, async); in adc_b91_read_async()
438 adc_context_release(&data->ctx, status); in adc_b91_read_async()