static int adc_stm32_read(struct device *dev, const struct adc_sequence *sequence) { struct adc_stm32_data *data = dev->driver_data; int error; adc_context_lock(&data->ctx, false, NULL); error = start_read(dev, sequence); adc_context_release(&data->ctx, error); return error; }
static int adc_stm32_read_async(struct device *dev, const struct adc_sequence *sequence, struct k_poll_signal *async) { struct adc_stm32_data *data = dev->driver_data; int error; adc_context_lock(&data->ctx, true, async); error = start_read(dev, sequence); adc_context_release(&data->ctx, error); return error; }
static int start_read(struct device *dev, const struct adc_sequence *sequence) { int error = 0; u32_t selected_channels = sequence->channels; u8_t active_channels; u8_t channel_id; nrf_adc_config_resolution_t nrf_resolution; /* Signal an error if channel selection is invalid (no channels or * a non-existing one is selected). */ if (!selected_channels || (selected_channels & ~BIT_MASK(CONFIG_ADC_NRFX_ADC_CHANNEL_COUNT))) { LOG_ERR("Invalid selection of channels"); return -EINVAL; } if (sequence->oversampling != 0) { LOG_ERR("Oversampling is not supported"); return -EINVAL; } switch (sequence->resolution) { case 8: nrf_resolution = NRF_ADC_CONFIG_RES_8BIT; break; case 9: nrf_resolution = NRF_ADC_CONFIG_RES_9BIT; break; case 10: nrf_resolution = NRF_ADC_CONFIG_RES_10BIT; break; default: LOG_ERR("ADC resolution value %d is not valid", sequence->resolution); return -EINVAL; } active_channels = 0; nrfx_adc_all_channels_disable(); /* Enable the channels selected for the pointed sequence. */ channel_id = 0; while (selected_channels) { if (selected_channels & BIT(0)) { /* The nrfx driver requires setting the resolution * for each enabled channel individually. */ m_channels[channel_id].config.resolution = nrf_resolution; nrfx_adc_channel_enable(&m_channels[channel_id]); ++active_channels; } selected_channels >>= 1; ++channel_id; } error = check_buffer_size(sequence, active_channels); if (error) { return error; } m_data.buffer = sequence->buffer; m_data.active_channels = active_channels; adc_context_start_read(&m_data.ctx, sequence); if (!error) { error = adc_context_wait_for_completion(&m_data.ctx); adc_context_release(&m_data.ctx, error); } return error; }