Lines Matching +full:sample +full:- +full:clk
4 * SPDX-License-Identifier: Apache-2.0
55 const struct adc_numaker_config *cfg = dev->config; in adc_numaker_channel_setup()
56 struct adc_numaker_data *data = dev->data; in adc_numaker_channel_setup()
58 if (chan_cfg->acquisition_time != ADC_ACQ_TIME_DEFAULT) { in adc_numaker_channel_setup()
59 if ((ADC_ACQ_TIME_UNIT(chan_cfg->acquisition_time) != ADC_ACQ_TIME_TICKS) || in adc_numaker_channel_setup()
60 (ADC_ACQ_TIME_VALUE(chan_cfg->acquisition_time) > 255)) { in adc_numaker_channel_setup()
62 return -EINVAL; in adc_numaker_channel_setup()
65 data->acq_time = ADC_ACQ_TIME_VALUE(chan_cfg->acquisition_time); in adc_numaker_channel_setup()
67 if (chan_cfg->gain != ADC_GAIN_1) { in adc_numaker_channel_setup()
69 return -ENOTSUP; in adc_numaker_channel_setup()
72 if (chan_cfg->reference != ADC_REF_INTERNAL) { in adc_numaker_channel_setup()
74 return -ENOTSUP; in adc_numaker_channel_setup()
77 if (chan_cfg->channel_id >= cfg->channel_cnt) { in adc_numaker_channel_setup()
78 LOG_ERR("Invalid channel (%u)", chan_cfg->channel_id); in adc_numaker_channel_setup()
79 return -EINVAL; in adc_numaker_channel_setup()
82 data->is_differential = (chan_cfg->differential) ? true : false; in adc_numaker_channel_setup()
90 const struct adc_numaker_config *cfg = dev->config; in m_adc_numaker_validate_buffer_size()
95 for (mask = BIT(cfg->channel_cnt - 1); mask != 0; mask >>= 1) { in m_adc_numaker_validate_buffer_size()
96 if (mask & sequence->channels) { in m_adc_numaker_validate_buffer_size()
102 if (sequence->options) { in m_adc_numaker_validate_buffer_size()
103 needed_size *= (1 + sequence->options->extra_samplings); in m_adc_numaker_validate_buffer_size()
106 if (sequence->buffer_size < needed_size) { in m_adc_numaker_validate_buffer_size()
107 return -ENOBUFS; in m_adc_numaker_validate_buffer_size()
115 const struct adc_numaker_config *cfg = dev->config; in adc_numaker_isr()
116 EADC_T *eadc = cfg->eadc_base; in adc_numaker_isr()
117 struct adc_numaker_data *const data = dev->data; in adc_numaker_isr()
118 uint32_t channel_mask = data->channels; in adc_numaker_isr()
125 LOG_DBG("ADC ISR STATUS2[0x%x] STATUS3[0x%x]", eadc->STATUS2, eadc->STATUS3); in adc_numaker_isr()
129 * Confirm all sample modules are idle by EADC_STATUS2_ADOVIF_Msk in adc_numaker_isr()
131 if (!(eadc->STATUS2 & EADC_STATUS2_BUSY_Msk) && in adc_numaker_isr()
132 ((eadc->STATUS3 & EADC_STATUS3_CURSPL_Msk) == EADC_STATUS3_CURSPL_Msk)) { in adc_numaker_isr()
133 /* Stop the conversion for sample module */ in adc_numaker_isr()
136 /* Disable sample module A/D ADINT0 interrupt. */ in adc_numaker_isr()
139 /* Disable the sample module ADINT0 interrupt source */ in adc_numaker_isr()
142 /* Get conversion data of each sample module for selected channel */ in adc_numaker_isr()
144 module_id = find_lsb_set(module_mask) - 1; in adc_numaker_isr()
147 if (data->buffer < data->buf_end) { in adc_numaker_isr()
148 *data->buffer++ = conv_data; in adc_numaker_isr()
153 /* Disable all channels on each sample module */ in adc_numaker_isr()
154 eadc->SCTL[module_id] = 0; in adc_numaker_isr()
158 adc_context_on_sampling_done(&data->ctx, data->dev); in adc_numaker_isr()
167 const struct adc_numaker_config *cfg = dev->config; in m_adc_numaker_start_scan()
168 EADC_T *eadc = cfg->eadc_base; in m_adc_numaker_start_scan()
169 struct adc_numaker_data *const data = dev->data; in m_adc_numaker_start_scan()
170 uint32_t channel_mask = data->channels; in m_adc_numaker_start_scan()
175 /* Configure the sample module, analog input channel and software trigger source */ in m_adc_numaker_start_scan()
177 channel_id = find_lsb_set(channel_mask) - 1; in m_adc_numaker_start_scan()
182 /* Set sample module external sampling time to 0 */ in m_adc_numaker_start_scan()
183 EADC_SetExtendSampleTime(eadc, module_id, data->acq_time); in m_adc_numaker_start_scan()
189 /* Enable sample module A/D ADINT0 interrupt. */ in m_adc_numaker_start_scan()
192 /* Enable sample module interrupt ADINT0. */ in m_adc_numaker_start_scan()
200 * - adc_context_start_sampling()
201 * - adc_context_update_buffer_pointer()
208 data->repeat_buffer = data->buffer; in adc_context_start_sampling()
209 data->channels = ctx->sequence.channels; in adc_context_start_sampling()
211 /* Start ADC conversion for sample modules/channels */ in adc_context_start_sampling()
212 m_adc_numaker_start_scan(data->dev); in adc_context_start_sampling()
222 data->buffer = data->repeat_buffer; in adc_context_update_buffer_pointer()
230 const struct adc_numaker_config *cfg = data->dev->config; in adc_context_on_complete()
231 EADC_T *eadc = cfg->eadc_base; in adc_context_on_complete()
242 const struct adc_numaker_config *cfg = dev->config; in m_adc_numaker_start_read()
243 struct adc_numaker_data *data = dev->data; in m_adc_numaker_start_read()
244 EADC_T *eadc = cfg->eadc_base; in m_adc_numaker_start_read()
253 if (!sequence->resolution) { in m_adc_numaker_start_read()
255 return -EINVAL; in m_adc_numaker_start_read()
257 LOG_DBG("Configure resolution=%d", sequence->resolution); in m_adc_numaker_start_read()
260 if (data->is_differential) { in m_adc_numaker_start_read()
266 data->buffer = sequence->buffer; in m_adc_numaker_start_read()
267 data->buf_end = data->buffer + sequence->buffer_size / sizeof(uint16_t); in m_adc_numaker_start_read()
270 adc_context_start_read(&data->ctx, sequence); in m_adc_numaker_start_read()
272 return adc_context_wait_for_completion(&data->ctx); in m_adc_numaker_start_read()
278 struct adc_numaker_data *data = dev->data; in adc_numaker_read()
281 adc_context_lock(&data->ctx, false, NULL); in adc_numaker_read()
283 adc_context_release(&data->ctx, err); in adc_numaker_read()
293 struct adc_numaker_data *data = dev->data; in adc_numaker_read_async()
296 adc_context_lock(&data->ctx, true, async); in adc_numaker_read_async()
298 adc_context_release(&data->ctx, err); in adc_numaker_read_async()
314 const struct adc_numaker_config *cfg = dev->config; in adc_numaker_init()
315 struct adc_numaker_data *data = dev->data; in adc_numaker_init()
320 if (!device_is_ready(cfg->reset.dev)) { in adc_numaker_init()
322 return -ENODEV; in adc_numaker_init()
325 data->dev = dev; in adc_numaker_init()
329 /* CLK controller */ in adc_numaker_init()
332 scc_subsys.pcc.clk_modidx = cfg->clk_modidx; in adc_numaker_init()
333 scc_subsys.pcc.clk_src = cfg->clk_src; in adc_numaker_init()
334 scc_subsys.pcc.clk_div = cfg->clk_div; in adc_numaker_init()
337 err = clock_control_on(cfg->clk_dev, (clock_control_subsys_t)&scc_subsys); in adc_numaker_init()
342 err = clock_control_configure(cfg->clk_dev, (clock_control_subsys_t)&scc_subsys, NULL); in adc_numaker_init()
347 err = pinctrl_apply_state(cfg->pincfg, PINCTRL_STATE_DEFAULT); in adc_numaker_init()
354 reset_line_toggle_dt(&cfg->reset); in adc_numaker_init()
357 cfg->irq_config_func(dev); in adc_numaker_init()
360 adc_context_unlock_unconditionally(&data->ctx); in adc_numaker_init()