Lines Matching +full:enable +full:- +full:inverted

4  * SPDX-License-Identifier: Apache-2.0
81 bool inverted; member
105 struct mcpwm_esp32_config *config = (struct mcpwm_esp32_config *)dev->config; in mcpwm_esp32_duty_set()
106 struct mcpwm_esp32_data *data = (struct mcpwm_esp32_data *const)(dev)->data; in mcpwm_esp32_duty_set()
110 if (channel->inverted) { in mcpwm_esp32_duty_set()
111 duty_type = channel->duty == 0 ? in mcpwm_esp32_duty_set()
112 MCPWM_HAL_GENERATOR_MODE_FORCE_HIGH : channel->duty == 100 ? in mcpwm_esp32_duty_set()
115 duty_type = channel->duty == 0 ? in mcpwm_esp32_duty_set()
116 MCPWM_HAL_GENERATOR_MODE_FORCE_LOW : channel->duty == 100 ? in mcpwm_esp32_duty_set()
120 uint32_t timer_clk_hz = data->mcpwm_clk_hz / config->prescale / channel->prescale; in mcpwm_esp32_duty_set()
122 set_duty = (timer_clk_hz / channel->freq) * channel->duty / 100; in mcpwm_esp32_duty_set()
123 mcpwm_ll_operator_connect_timer(data->hal.dev, channel->operator_id, channel->timer_id); in mcpwm_esp32_duty_set()
124 mcpwm_ll_operator_set_compare_value(data->hal.dev, channel->operator_id, in mcpwm_esp32_duty_set()
125 channel->generator_id, set_duty); in mcpwm_esp32_duty_set()
126 mcpwm_ll_operator_enable_update_compare_on_tez(data->hal.dev, channel->operator_id, in mcpwm_esp32_duty_set()
127 channel->generator_id, true); in mcpwm_esp32_duty_set()
131 data->hal.dev, channel->operator_id, channel->generator_id, in mcpwm_esp32_duty_set()
134 data->hal.dev, channel->operator_id, channel->generator_id, in mcpwm_esp32_duty_set()
137 data->hal.dev, channel->operator_id, channel->generator_id, in mcpwm_esp32_duty_set()
138 MCPWM_TIMER_DIRECTION_UP, channel->generator_id, MCPWM_ACTION_FORCE_LOW); in mcpwm_esp32_duty_set()
141 data->hal.dev, channel->operator_id, channel->generator_id, in mcpwm_esp32_duty_set()
144 data->hal.dev, channel->operator_id, channel->generator_id, in mcpwm_esp32_duty_set()
147 data->hal.dev, channel->operator_id, channel->generator_id, in mcpwm_esp32_duty_set()
148 MCPWM_TIMER_DIRECTION_UP, channel->generator_id, MCPWM_ACTION_FORCE_HIGH); in mcpwm_esp32_duty_set()
151 data->hal.dev, channel->operator_id, channel->generator_id, in mcpwm_esp32_duty_set()
154 data->hal.dev, channel->operator_id, channel->generator_id, in mcpwm_esp32_duty_set()
157 data->hal.dev, channel->operator_id, channel->generator_id, in mcpwm_esp32_duty_set()
158 MCPWM_TIMER_DIRECTION_UP, channel->generator_id, MCPWM_ACTION_FORCE_LOW); in mcpwm_esp32_duty_set()
161 data->hal.dev, channel->operator_id, channel->generator_id, in mcpwm_esp32_duty_set()
164 data->hal.dev, channel->operator_id, channel->generator_id, in mcpwm_esp32_duty_set()
167 data->hal.dev, channel->operator_id, channel->generator_id, in mcpwm_esp32_duty_set()
168 MCPWM_TIMER_DIRECTION_UP, channel->generator_id, MCPWM_ACTION_FORCE_HIGH); in mcpwm_esp32_duty_set()
175 struct mcpwm_esp32_config *config = (struct mcpwm_esp32_config *)dev->config; in mcpwm_esp32_configure_pinctrl()
177 ret = pinctrl_apply_state(config->pincfg, PINCTRL_STATE_DEFAULT); in mcpwm_esp32_configure_pinctrl()
188 struct mcpwm_esp32_config *config = (struct mcpwm_esp32_config *)dev->config; in mcpwm_esp32_timer_set()
189 struct mcpwm_esp32_data *data = (struct mcpwm_esp32_data *const)(dev)->data; in mcpwm_esp32_timer_set()
191 __ASSERT_NO_MSG(channel->freq > 0); in mcpwm_esp32_timer_set()
193 mcpwm_ll_timer_set_clock_prescale(data->hal.dev, channel->timer_id, channel->prescale); in mcpwm_esp32_timer_set()
194 mcpwm_ll_timer_set_count_mode(data->hal.dev, channel->timer_id, MCPWM_TIMER_COUNT_MODE_UP); in mcpwm_esp32_timer_set()
195 mcpwm_ll_timer_update_period_at_once(data->hal.dev, channel->timer_id); in mcpwm_esp32_timer_set()
197 uint32_t timer_clk_hz = data->mcpwm_clk_hz / config->prescale / channel->prescale; in mcpwm_esp32_timer_set()
199 mcpwm_ll_timer_set_peak(data->hal.dev, channel->timer_id, timer_clk_hz / channel->freq, in mcpwm_esp32_timer_set()
208 struct mcpwm_esp32_config *config = (struct mcpwm_esp32_config *)dev->config; in mcpwm_esp32_get_cycles_per_sec()
209 struct mcpwm_esp32_channel_config *channel = &config->channel_config[channel_idx]; in mcpwm_esp32_get_cycles_per_sec()
210 struct mcpwm_esp32_data *data = (struct mcpwm_esp32_data *const)(dev)->data; in mcpwm_esp32_get_cycles_per_sec()
214 return -EINVAL; in mcpwm_esp32_get_cycles_per_sec()
218 if (channel->idx >= CAPTURE_CHANNEL_IDX) { in mcpwm_esp32_get_cycles_per_sec()
221 *cycles = (uint64_t)data->mcpwm_clk_hz / (config->prescale + 1) / 1; in mcpwm_esp32_get_cycles_per_sec()
230 (uint64_t)data->mcpwm_clk_hz / (config->prescale + 1) / (channel->prescale + 1); in mcpwm_esp32_get_cycles_per_sec()
240 struct mcpwm_esp32_config *config = (struct mcpwm_esp32_config *)dev->config; in mcpwm_esp32_set_cycles()
241 struct mcpwm_esp32_data *data = (struct mcpwm_esp32_data *const)(dev)->data; in mcpwm_esp32_set_cycles()
242 struct mcpwm_esp32_channel_config *channel = &config->channel_config[channel_idx]; in mcpwm_esp32_set_cycles()
246 return -EINVAL; in mcpwm_esp32_set_cycles()
252 channel->freq = (uint32_t)(clk_freq / period_cycles); in mcpwm_esp32_set_cycles()
253 if (!channel->freq) { in mcpwm_esp32_set_cycles()
254 return -EINVAL; in mcpwm_esp32_set_cycles()
257 k_sem_take(&data->cmd_sem, K_FOREVER); in mcpwm_esp32_set_cycles()
261 k_sem_give(&data->cmd_sem); in mcpwm_esp32_set_cycles()
267 channel->duty = (uint32_t)duty_cycle; in mcpwm_esp32_set_cycles()
269 channel->inverted = (flags & PWM_POLARITY_INVERTED); in mcpwm_esp32_set_cycles()
275 k_sem_give(&data->cmd_sem); in mcpwm_esp32_set_cycles()
279 mcpwm_ll_timer_set_start_stop_command(data->hal.dev, channel->timer_id, in mcpwm_esp32_set_cycles()
282 k_sem_give(&data->cmd_sem); in mcpwm_esp32_set_cycles()
292 struct mcpwm_esp32_config *config = (struct mcpwm_esp32_config *)dev->config; in mcpwm_esp32_configure_capture()
293 struct mcpwm_esp32_data *data = (struct mcpwm_esp32_data *const)(dev)->data; in mcpwm_esp32_configure_capture()
294 struct mcpwm_esp32_channel_config *channel = &config->channel_config[channel_idx]; in mcpwm_esp32_configure_capture()
295 struct mcpwm_esp32_capture_config *capture = &channel->capture; in mcpwm_esp32_configure_capture()
299 return -EINVAL; in mcpwm_esp32_configure_capture()
302 if ((channel->idx < CAPTURE_CHANNEL_IDX) || (channel->idx > CAPTURE_CHANNEL_IDX + 2)) { in mcpwm_esp32_configure_capture()
304 return -EINVAL; in mcpwm_esp32_configure_capture()
307 if (data->hal.dev->cap_chn_cfg[capture->capture_signal].capn_en) { in mcpwm_esp32_configure_capture()
309 return -EBUSY; in mcpwm_esp32_configure_capture()
314 return -EINVAL; in mcpwm_esp32_configure_capture()
317 channel->inverted = (flags & PWM_POLARITY_INVERTED); in mcpwm_esp32_configure_capture()
318 capture->capture_signal = channel->idx - CAPTURE_CHANNEL_IDX; in mcpwm_esp32_configure_capture()
319 capture->callback = cb; in mcpwm_esp32_configure_capture()
320 capture->user_data = user_data; in mcpwm_esp32_configure_capture()
321 capture->capture_period = (flags & PWM_CAPTURE_TYPE_PERIOD); in mcpwm_esp32_configure_capture()
322 capture->capture_pulse = (flags & PWM_CAPTURE_TYPE_PULSE); in mcpwm_esp32_configure_capture()
323 capture->continuous = (flags & PWM_CAPTURE_MODE_CONTINUOUS); in mcpwm_esp32_configure_capture()
330 struct mcpwm_esp32_config *config = (struct mcpwm_esp32_config *)dev->config; in mcpwm_esp32_disable_capture()
331 struct mcpwm_esp32_data *data = (struct mcpwm_esp32_data *const)(dev)->data; in mcpwm_esp32_disable_capture()
332 struct mcpwm_esp32_channel_config *channel = &config->channel_config[channel_idx]; in mcpwm_esp32_disable_capture()
333 struct mcpwm_esp32_capture_config *capture = &channel->capture; in mcpwm_esp32_disable_capture()
337 return -EINVAL; in mcpwm_esp32_disable_capture()
340 if ((channel->idx < CAPTURE_CHANNEL_IDX) || (channel->idx > CAPTURE_CHANNEL_IDX + 2)) { in mcpwm_esp32_disable_capture()
342 return -EINVAL; in mcpwm_esp32_disable_capture()
345 mcpwm_ll_capture_enable_channel(data->hal.dev, capture->capture_signal, false); in mcpwm_esp32_disable_capture()
346 mcpwm_ll_intr_enable(data->hal.dev, MCPWM_LL_EVENT_CAPTURE(capture->capture_signal), false); in mcpwm_esp32_disable_capture()
353 struct mcpwm_esp32_config *config = (struct mcpwm_esp32_config *)dev->config; in mcpwm_esp32_enable_capture()
354 struct mcpwm_esp32_data *data = (struct mcpwm_esp32_data *const)(dev)->data; in mcpwm_esp32_enable_capture()
355 struct mcpwm_esp32_channel_config *channel = &config->channel_config[channel_idx]; in mcpwm_esp32_enable_capture()
356 struct mcpwm_esp32_capture_config *capture = &channel->capture; in mcpwm_esp32_enable_capture()
360 return -EINVAL; in mcpwm_esp32_enable_capture()
363 if (!capture->callback) { in mcpwm_esp32_enable_capture()
365 return -EINVAL; in mcpwm_esp32_enable_capture()
368 if ((channel->idx < CAPTURE_CHANNEL_IDX) || (channel->idx > CAPTURE_CHANNEL_IDX + 2)) { in mcpwm_esp32_enable_capture()
370 return -EINVAL; in mcpwm_esp32_enable_capture()
373 if (data->hal.dev->cap_chn_cfg[capture->capture_signal].capn_en) { in mcpwm_esp32_enable_capture()
375 return -EBUSY; in mcpwm_esp32_enable_capture()
387 mcpwm_ll_group_set_clock_prescale(data->hal.dev, config->prescale); in mcpwm_esp32_enable_capture()
388 mcpwm_ll_group_enable_shadow_mode(data->hal.dev); in mcpwm_esp32_enable_capture()
389 mcpwm_ll_group_flush_shadow(data->hal.dev); in mcpwm_esp32_enable_capture()
391 mcpwm_ll_capture_enable_timer(data->hal.dev, true); in mcpwm_esp32_enable_capture()
392 mcpwm_ll_capture_enable_channel(data->hal.dev, capture->capture_signal, true); in mcpwm_esp32_enable_capture()
393 mcpwm_ll_capture_enable_negedge(data->hal.dev, capture->capture_signal, in mcpwm_esp32_enable_capture()
395 mcpwm_ll_capture_enable_posedge(data->hal.dev, capture->capture_signal, in mcpwm_esp32_enable_capture()
397 mcpwm_ll_capture_set_prescale(data->hal.dev, capture->capture_signal, in mcpwm_esp32_enable_capture()
400 mcpwm_ll_intr_enable(data->hal.dev, MCPWM_LL_EVENT_CAPTURE(capture->capture_signal), true); in mcpwm_esp32_enable_capture()
401 mcpwm_ll_intr_clear_status(data->hal.dev, MCPWM_LL_EVENT_CAPTURE(capture->capture_signal)); in mcpwm_esp32_enable_capture()
403 capture->skip_irq = 0; in mcpwm_esp32_enable_capture()
411 struct mcpwm_esp32_config *config = (struct mcpwm_esp32_config *)dev->config; in channel_init()
415 channel = &config->channel_config[i]; in channel_init()
416 channel->idx = i; in channel_init()
417 channel->timer_id = i < 2 ? 0 : i < 4 ? 1 : 2; in channel_init()
418 channel->operator_id = i < 2 ? 0 : i < 4 ? 1 : 2; in channel_init()
419 channel->generator_id = i % 2 ? 1 : 0; in channel_init()
420 channel->prescale = i < 2 ? config->prescale_timer0 in channel_init()
421 : i < 4 ? config->prescale_timer1 in channel_init()
422 : config->prescale_timer2; in channel_init()
429 struct mcpwm_esp32_config *config = (struct mcpwm_esp32_config *)dev->config; in mcpwm_esp32_init()
430 struct mcpwm_esp32_data *data = (struct mcpwm_esp32_data *const)(dev)->data; in mcpwm_esp32_init()
432 if (!device_is_ready(config->clock_dev)) { in mcpwm_esp32_init()
434 return -ENODEV; in mcpwm_esp32_init()
437 mcpwm_ll_group_set_clock_source(data->hal.dev, MCPWM_TIMER_CLK_SRC_DEFAULT); in mcpwm_esp32_init()
439 ESP_CLK_TREE_SRC_FREQ_PRECISION_CACHED, &data->mcpwm_clk_hz); in mcpwm_esp32_init()
441 /* Enable peripheral */ in mcpwm_esp32_init()
442 ret = clock_control_on(config->clock_dev, config->clock_subsys); in mcpwm_esp32_init()
450 mcpwm_ll_group_set_clock_prescale(data->hal.dev, config->prescale); in mcpwm_esp32_init()
451 mcpwm_ll_group_enable_shadow_mode(data->hal.dev); in mcpwm_esp32_init()
452 mcpwm_ll_group_flush_shadow(data->hal.dev); in mcpwm_esp32_init()
455 ret = config->irq_config_func(dev); in mcpwm_esp32_init()
467 struct mcpwm_esp32_config *config = (struct mcpwm_esp32_config *)dev->config; in mcpwm_esp32_isr()
468 struct mcpwm_esp32_data *data = (struct mcpwm_esp32_data *const)(dev)->data; in mcpwm_esp32_isr()
474 mcpwm_intr_status = mcpwm_ll_intr_get_status(data->hal.dev); in mcpwm_esp32_isr()
483 mcpwm_ll_intr_clear_status(data->hal.dev, in mcpwm_esp32_isr()
486 channel = &config->channel_config[CAPTURE_CHANNEL_IDX + cap_id]; in mcpwm_esp32_isr()
487 capture = &channel->capture; in mcpwm_esp32_isr()
492 if (capture->skip_irq < SKIP_IRQ_NUM) { in mcpwm_esp32_isr()
493 capture->capture_data[capture->skip_irq].value = in mcpwm_esp32_isr()
494 mcpwm_ll_capture_get_value(data->hal.dev, capture->capture_signal); in mcpwm_esp32_isr()
495 capture->capture_data[capture->skip_irq].edge = in mcpwm_esp32_isr()
496 mcpwm_ll_capture_get_edge(data->hal.dev, capture->capture_signal) == in mcpwm_esp32_isr()
500 capture->skip_irq++; in mcpwm_esp32_isr()
504 * The capture timer is a 32-bit counter incrementing continuously, once enabled. in mcpwm_esp32_isr()
507 capture->period = channel->inverted ? in mcpwm_esp32_isr()
508 capture->capture_data[0].edge == MCPWM_NEG_EDGE in mcpwm_esp32_isr()
509 ? (capture->capture_data[2].value - capture->capture_data[0].value) in mcpwm_esp32_isr()
510 : (capture->capture_data[3].value - capture->capture_data[1].value) in mcpwm_esp32_isr()
511 : capture->capture_data[0].edge == MCPWM_POS_EDGE in mcpwm_esp32_isr()
512 ? (capture->capture_data[2].value - capture->capture_data[0].value) in mcpwm_esp32_isr()
513 : (capture->capture_data[3].value - capture->capture_data[1].value); in mcpwm_esp32_isr()
515 capture->pulse = channel->inverted ? in mcpwm_esp32_isr()
516 capture->capture_data[0].edge == MCPWM_NEG_EDGE in mcpwm_esp32_isr()
517 ? (capture->capture_data[1].value - capture->capture_data[0].value) in mcpwm_esp32_isr()
518 : (capture->capture_data[2].value - capture->capture_data[1].value) in mcpwm_esp32_isr()
519 : capture->capture_data[0].edge == MCPWM_POS_EDGE in mcpwm_esp32_isr()
520 ? (capture->capture_data[1].value - capture->capture_data[0].value) in mcpwm_esp32_isr()
521 : (capture->capture_data[2].value - capture->capture_data[1].value); in mcpwm_esp32_isr()
523 capture->skip_irq = 0; in mcpwm_esp32_isr()
524 if (!capture->continuous) { in mcpwm_esp32_isr()
525 mcpwm_esp32_disable_capture(dev, channel->idx); in mcpwm_esp32_isr()
528 if (capture->callback) { in mcpwm_esp32_isr()
529 capture->callback(dev, capture->capture_signal + CAPTURE_CHANNEL_IDX, in mcpwm_esp32_isr()
530 capture->capture_period ? capture->period : 0u, in mcpwm_esp32_isr()
531 capture->capture_pulse ? capture->pulse : 0u, 0u, in mcpwm_esp32_isr()
532 capture->user_data); in mcpwm_esp32_isr()