Lines Matching +full:capture +full:- +full:rate

4  * SPDX-License-Identifier: Apache-2.0
21 /* 11-bit prescaler in Numaker EPWM modules */
61 struct pwm_numaker_capture_data capture[NUMAKER_PWM_CHANNEL_COUNT]; member
67 const struct pwm_numaker_config *cfg = dev->config; in pwm_numaker_configure()
68 EPWM_T *epwm = cfg->epwm; in pwm_numaker_configure()
74 epwm->POLCTL &= ~(NUMAKER_PWM_CHANNEL_MASK << EPWM_POLCTL_PINV0_Pos); in pwm_numaker_configure()
81 const struct pwm_numaker_config *cfg = dev->config; in pwm_numaker_set_cycles()
82 struct pwm_numaker_data *data = dev->data; in pwm_numaker_set_cycles()
83 EPWM_T *epwm = cfg->epwm; in pwm_numaker_set_cycles()
86 LOG_DBG("Channel=0x%x, CAPIEN=0x%x, CAPIF=0x%x", channel, epwm->CAPIEN, in pwm_numaker_set_cycles()
87 epwm->CAPIF); in pwm_numaker_set_cycles()
91 epwm->POLCTL |= BIT(EPWM_POLCTL_PINV0_Pos + channel); in pwm_numaker_set_cycles()
93 epwm->POLCTL &= ~BIT(EPWM_POLCTL_PINV0_Pos + channel); in pwm_numaker_set_cycles()
105 EPWM_ConfigOutputChannel(epwm, channel, data->cycles_per_sec / period_cycles, in pwm_numaker_set_cycles()
115 data->cycles_per_sec, pulse_cycles, period_cycles); in pwm_numaker_set_cycles()
116 LOG_DBG("CTL1=0x%x, POEN=0x%x, CNTEN=0x%x", epwm->CTL1, epwm->POEN, epwm->CNTEN); in pwm_numaker_set_cycles()
117 LOG_DBG("Channel=0x%x, CAPIEN=0x%x, CAPIF=0x%x", channel, epwm->CAPIEN, epwm->CAPIF); in pwm_numaker_set_cycles()
125 const struct pwm_numaker_config *cfg = dev->config; in pwm_numaker_get_cycles_per_sec()
126 struct pwm_numaker_data *data = dev->data; in pwm_numaker_get_cycles_per_sec()
130 data->cycles_per_sec = data->clock_freq / (cfg->prescale + 1U); in pwm_numaker_get_cycles_per_sec()
131 *cycles = (uint64_t)data->cycles_per_sec; in pwm_numaker_get_cycles_per_sec()
141 struct pwm_numaker_data *data = dev->data; in pwm_numaker_configure_capture()
146 data->capture[pair].callback = cb; in pwm_numaker_configure_capture()
147 data->capture[pair].user_data = user_data; in pwm_numaker_configure_capture()
149 if (data->capture[pair].is_busy) { in pwm_numaker_configure_capture()
150 LOG_ERR("Capture already active on this channel %d", pair); in pwm_numaker_configure_capture()
151 return -EBUSY; in pwm_numaker_configure_capture()
154 LOG_ERR("Cannot capture both period and pulse width"); in pwm_numaker_configure_capture()
155 return -ENOTSUP; in pwm_numaker_configure_capture()
159 data->capture[pair].single_mode = false; in pwm_numaker_configure_capture()
161 data->capture[pair].single_mode = true; in pwm_numaker_configure_capture()
165 data->capture[pair].pulse_capture = false; in pwm_numaker_configure_capture()
168 data->capture[pair].curr_edge_mode = EPWM_CAPTURE_INT_FALLING_LATCH; in pwm_numaker_configure_capture()
169 data->capture[pair].next_edge_mode = EPWM_CAPTURE_INT_FALLING_LATCH; in pwm_numaker_configure_capture()
171 data->capture[pair].curr_edge_mode = EPWM_CAPTURE_INT_RISING_LATCH; in pwm_numaker_configure_capture()
172 data->capture[pair].next_edge_mode = EPWM_CAPTURE_INT_RISING_LATCH; in pwm_numaker_configure_capture()
175 data->capture[pair].pulse_capture = true; in pwm_numaker_configure_capture()
178 data->capture[pair].curr_edge_mode = EPWM_CAPTURE_INT_FALLING_LATCH; in pwm_numaker_configure_capture()
179 data->capture[pair].next_edge_mode = EPWM_CAPTURE_INT_RISING_LATCH; in pwm_numaker_configure_capture()
181 data->capture[pair].curr_edge_mode = EPWM_CAPTURE_INT_RISING_LATCH; in pwm_numaker_configure_capture()
182 data->capture[pair].next_edge_mode = EPWM_CAPTURE_INT_FALLING_LATCH; in pwm_numaker_configure_capture()
191 const struct pwm_numaker_config *cfg = dev->config; in pwm_numaker_enable_capture()
192 struct pwm_numaker_data *data = dev->data; in pwm_numaker_enable_capture()
193 EPWM_T *epwm = cfg->epwm; in pwm_numaker_enable_capture()
196 uint32_t unit_time_nsec = (1000000000U / data->cycles_per_sec); in pwm_numaker_enable_capture()
200 if (!data->capture[pair].callback) { in pwm_numaker_enable_capture()
201 LOG_ERR("PWM capture not configured"); in pwm_numaker_enable_capture()
202 return -EINVAL; in pwm_numaker_enable_capture()
205 if (data->capture[pair].is_busy) { in pwm_numaker_enable_capture()
206 LOG_ERR("Capture already active on this channel %d", pair); in pwm_numaker_enable_capture()
207 return -EBUSY; in pwm_numaker_enable_capture()
210 data->capture[pair].is_busy = true; in pwm_numaker_enable_capture()
212 /* Set capture configuration */ in pwm_numaker_enable_capture()
215 /* Enable Capture Function for EPWM */ in pwm_numaker_enable_capture()
225 EPWM_EnableCaptureInt(epwm, channel, data->capture[pair].curr_edge_mode); in pwm_numaker_enable_capture()
227 LOG_DBG("Channel=0x%x, CAPIEN=0x%x, CAPIF=0x%x", channel, epwm->CAPIEN, in pwm_numaker_enable_capture()
228 epwm->CAPIF); in pwm_numaker_enable_capture()
235 const struct pwm_numaker_config *cfg = dev->config; in pwm_numaker_disable_capture()
236 struct pwm_numaker_data *data = dev->data; in pwm_numaker_disable_capture()
237 EPWM_T *epwm = cfg->epwm; in pwm_numaker_disable_capture()
242 data->capture[channel].is_busy = false; in pwm_numaker_disable_capture()
250 LOG_DBG("CAPIEN = 0x%x\n", epwm->CAPIEN); in pwm_numaker_disable_capture()
255 * Get capture cycles between current channel edge until next chnannel edge.
256 * The capture period counter down count from 0x10000, and auto-reload to 0x10000
277 time_out_cnt = NUMAKER_SYSCLK_FREQ / 2; /* 500 ms time-out */ in pwm_numaker_get_cap_cycle()
278 LOG_DBG("Channel=0x%x, R-Cnt=0x%x, F-Cnt0x%x, CNT-0x%x", channel, in pwm_numaker_get_cap_cycle()
280 EPWM_GET_CAPTURE_FALLING_DATA(epwm, channel), epwm->CNT[channel]); in pwm_numaker_get_cap_cycle()
285 /* Wait for Capture Next Indicator */ in pwm_numaker_get_cap_cycle()
286 while ((epwm->CAPIF & next_if_mask) == 0) { in pwm_numaker_get_cap_cycle()
291 if (--time_out_cnt == 0) { in pwm_numaker_get_cap_cycle()
292 status = -EAGAIN; in pwm_numaker_get_cap_cycle()
297 /* Clear Capture Falling and Rising Indicator */ in pwm_numaker_get_cap_cycle()
301 /* Get Capture Latch Counter Data */ in pwm_numaker_get_cap_cycle()
306 *cycles = (period_reloads * NUMAKER_PWM_RELOAD_CNT) + curr_cnt - next_cnt; in pwm_numaker_get_cap_cycle()
307 LOG_DBG("cycles=0x%x, period_reloads=0x%x, CAPIF=0x%x, cur-0x%x ,next-0x%x", in pwm_numaker_get_cap_cycle()
308 *cycles, period_reloads, epwm->CAPIF, curr_cnt, next_cnt); in pwm_numaker_get_cap_cycle()
316 struct pwm_numaker_data *data = dev->data; in pwm_numaker_channel_cap()
317 struct pwm_numaker_capture_data *capture; in pwm_numaker_channel_cap() local
324 capture = &data->capture[channel]; in pwm_numaker_channel_cap()
328 epwm, channel, data->capture[channel].curr_edge_mode, in pwm_numaker_channel_cap()
329 data->capture[channel].next_edge_mode, &cycles); in pwm_numaker_channel_cap()
330 if (capture->pulse_capture) { in pwm_numaker_channel_cap()
332 capture->callback(dev, channel, 0, cycles, status, capture->user_data); in pwm_numaker_channel_cap()
335 capture->callback(dev, channel, cycles, 0, status, capture->user_data); in pwm_numaker_channel_cap()
338 if (capture->single_mode) { in pwm_numaker_channel_cap()
341 data->capture[channel].is_busy = false; in pwm_numaker_channel_cap()
345 EPWM_EnableCaptureInt(epwm, channel, data->capture[channel].curr_edge_mode); in pwm_numaker_channel_cap()
346 /* data->capture[channel].is_busy = true; */ in pwm_numaker_channel_cap()
352 const struct pwm_numaker_config *cfg = dev->config; in pwm_numaker_isr()
353 struct pwm_numaker_data *data = dev->data; in pwm_numaker_isr()
354 EPWM_T *epwm = cfg->epwm; in pwm_numaker_isr()
355 struct pwm_numaker_capture_data *capture; in pwm_numaker_isr() local
366 int_status = epwm->AINTSTS & int_mask; in pwm_numaker_isr()
369 epwm->AINTSTS = int_status; in pwm_numaker_isr()
373 cap_intsts = epwm->CAPIF & cap_int_mask; in pwm_numaker_isr()
376 * until getting capture cycles. in pwm_numaker_isr()
379 st_channel, epwm->CAPIEN, epwm->CAPIF, cap_int_mask); in pwm_numaker_isr()
380 if (cap_intsts != 0x00) { /* Capture Interrupt */ in pwm_numaker_isr()
382 epwm->CAPIF = cap_intsts; in pwm_numaker_isr()
386 capture = &data->capture[i]; in pwm_numaker_isr()
387 if (capture == NULL) { in pwm_numaker_isr()
429 /* Alternative EPWM clock get rate before support standard clock_control_get_rate */
430 static int pwm_numaker_clk_get_rate(EPWM_T *epwm, uint32_t *rate) in pwm_numaker_clk_get_rate() argument
436 clk_src = CLK->CLKSEL2 & CLK_CLKSEL2_EPWM0SEL_Msk; in pwm_numaker_clk_get_rate()
438 clk_src = CLK->CLKSEL2 & CLK_CLKSEL2_EPWM1SEL_Msk; in pwm_numaker_clk_get_rate()
441 return -EINVAL; in pwm_numaker_clk_get_rate()
456 *rate = epwm_clk_src; in pwm_numaker_clk_get_rate()
462 const struct pwm_numaker_config *cfg = dev->config; in pwm_numaker_init()
463 struct pwm_numaker_data *data = dev->data; in pwm_numaker_init()
464 EPWM_T *epwm = cfg->epwm; in pwm_numaker_init()
471 if (!device_is_ready(cfg->reset.dev)) { in pwm_numaker_init()
473 return -ENODEV; in pwm_numaker_init()
481 scc_subsys.pcc.clk_modidx = cfg->clk_modidx; in pwm_numaker_init()
482 scc_subsys.pcc.clk_src = cfg->clk_src; in pwm_numaker_init()
483 scc_subsys.pcc.clk_div = cfg->clk_div; in pwm_numaker_init()
486 err = clock_control_on(cfg->clk_dev, (clock_control_subsys_t)&scc_subsys); in pwm_numaker_init()
491 err = clock_control_configure(cfg->clk_dev, (clock_control_subsys_t)&scc_subsys, NULL); in pwm_numaker_init()
497 /* clock_control_get_rate(cfg->clk_dev,(clock_control_subsys_t)&scc_subsys,&clock_freq); */ in pwm_numaker_init()
501 LOG_ERR("Get EPWM clock rate failure %d", err); in pwm_numaker_init()
504 data->clock_freq = clock_freq; in pwm_numaker_init()
505 data->cycles_per_sec = data->clock_freq / (cfg->prescale + 1U); in pwm_numaker_init()
507 err = pinctrl_apply_state(cfg->pincfg, PINCTRL_STATE_DEFAULT); in pwm_numaker_init()
514 reset_line_toggle_dt(&cfg->reset); in pwm_numaker_init()
521 cfg->irq_config_func(dev); in pwm_numaker_init()