Lines Matching refs:obj
324 static inline int16_t _cyhal_pdm_pcm_get_paired_channel(cyhal_pdm_pcm_t* obj, bool check_used) in _cyhal_pdm_pcm_get_paired_channel() argument
328 uint8_t channel_idx = obj->resource.channel_num; in _cyhal_pdm_pcm_get_paired_channel()
330 if(paired_channel < _cyhal_pdm_num_channels[obj->resource.block_num]) in _cyhal_pdm_pcm_get_paired_channel()
332 …if((false == check_used) || (obj == _cyhal_pdm_pcm_config_structs[obj->resource.block_num][paired_… in _cyhal_pdm_pcm_get_paired_channel()
338 CY_UNUSED_PARAMETER(obj); in _cyhal_pdm_pcm_get_paired_channel()
397 static inline void _cyhal_pdm_pcm_clear_interrupt(cyhal_pdm_pcm_t* obj, uint32_t interrupt) in _cyhal_pdm_pcm_clear_interrupt() argument
400 Cy_PDM_PCM_ClearInterrupt(obj->base, interrupt); in _cyhal_pdm_pcm_clear_interrupt()
402 Cy_PDM_PCM_Channel_ClearInterrupt(obj->base, obj->resource.channel_num, interrupt); in _cyhal_pdm_pcm_clear_interrupt()
406 static inline uint32_t _cyhal_pdm_pcm_get_interrupt_mask(cyhal_pdm_pcm_t* obj) in _cyhal_pdm_pcm_get_interrupt_mask() argument
409 return Cy_PDM_PCM_GetInterruptMask(obj->base); in _cyhal_pdm_pcm_get_interrupt_mask()
411 return Cy_PDM_PCM_Channel_GetInterruptMask(obj->base, obj->resource.channel_num); in _cyhal_pdm_pcm_get_interrupt_mask()
415 static inline void _cyhal_pdm_pcm_set_interrupt_mask(cyhal_pdm_pcm_t* obj, uint32_t mask) in _cyhal_pdm_pcm_set_interrupt_mask() argument
418 Cy_PDM_PCM_SetInterruptMask(obj->base, mask); in _cyhal_pdm_pcm_set_interrupt_mask()
420 Cy_PDM_PCM_Channel_SetInterruptMask(obj->base, obj->resource.channel_num, mask); in _cyhal_pdm_pcm_set_interrupt_mask()
424 static inline void _cyhal_pdm_pcm_set_rx_fifo_level(cyhal_pdm_pcm_t *obj, uint8_t fifo_level) in _cyhal_pdm_pcm_set_rx_fifo_level() argument
427 PDM_PCM_RX_FIFO_CTL(obj->base) = _VAL2FLD(PDM_RX_FIFO_CTL_TRIGGER_LEVEL, fifo_level - 1); in _cyhal_pdm_pcm_set_rx_fifo_level()
429 …PDM_PCM_RX_FIFO_CTL(obj->base, obj->resource.channel_num) = _VAL2FLD(PDM_CH_RX_FIFO_CTL_TRIGGER_LE… in _cyhal_pdm_pcm_set_rx_fifo_level()
430 int16_t paired_channel = _cyhal_pdm_pcm_get_paired_channel(obj, true); in _cyhal_pdm_pcm_set_rx_fifo_level()
433 …PDM_PCM_RX_FIFO_CTL(obj->base, obj->resource.channel_num) = _VAL2FLD(PDM_CH_RX_FIFO_CTL_TRIGGER_LE… in _cyhal_pdm_pcm_set_rx_fifo_level()
436 _cyhal_pdm_pcm_clear_interrupt(obj, CY_PDM_PCM_INTR_RX_TRIGGER); in _cyhal_pdm_pcm_set_rx_fifo_level()
442 cyhal_pdm_pcm_t *obj = (cyhal_pdm_pcm_t *)callback_arg; in _cyhal_pdm_pcm_pm_callback() local
448 bool enabled = cyhal_pdm_pcm_is_enabled(obj); in _cyhal_pdm_pcm_pm_callback()
449 obj->pm_transition_ready = !(enabled || cyhal_pdm_pcm_is_pending(obj)); in _cyhal_pdm_pcm_pm_callback()
454 obj->pm_transition_ready = false; in _cyhal_pdm_pcm_pm_callback()
460 return obj->pm_transition_ready; in _cyhal_pdm_pcm_pm_callback()
463 static inline void _cyhal_pdm_pcm_increment_async_buffer(cyhal_pdm_pcm_t *obj, size_t increment) in _cyhal_pdm_pcm_increment_async_buffer() argument
465 CY_ASSERT(obj->async_read_remaining >= increment); in _cyhal_pdm_pcm_increment_async_buffer()
467 obj->async_read_remaining -= increment; in _cyhal_pdm_pcm_increment_async_buffer()
468 obj->async_buffer = (obj->async_read_remaining == 0) in _cyhal_pdm_pcm_increment_async_buffer()
470 : (void*)(((uint8_t*) obj->async_buffer) + increment * obj->word_size); in _cyhal_pdm_pcm_increment_async_buffer()
474 static inline void _cyhal_pdm_pcm_try_read_async(cyhal_pdm_pcm_t *obj) in _cyhal_pdm_pcm_try_read_async() argument
476 size_t read_remaining = obj->async_read_remaining; in _cyhal_pdm_pcm_try_read_async()
477 cyhal_pdm_pcm_read(obj, obj->async_buffer, &read_remaining); in _cyhal_pdm_pcm_try_read_async()
478 _cyhal_pdm_pcm_increment_async_buffer(obj, read_remaining); in _cyhal_pdm_pcm_try_read_async()
481 static inline cy_rslt_t _cyhal_pdm_pcm_dma_start(cyhal_pdm_pcm_t *obj) in _cyhal_pdm_pcm_dma_start() argument
484 size_t transfer_size = obj->user_trigger_level; in _cyhal_pdm_pcm_dma_start()
485 if (obj->async_read_remaining <= obj->user_trigger_level) in _cyhal_pdm_pcm_dma_start()
487 transfer_size = obj->async_read_remaining; in _cyhal_pdm_pcm_dma_start()
489 …cyhal_dma_enable_event(&(obj->dma), CYHAL_DMA_TRANSFER_COMPLETE, CYHAL_ISR_PRIORITY_DEFAULT, true); in _cyhal_pdm_pcm_dma_start()
492 int16_t paired_channel = _cyhal_pdm_pcm_get_paired_channel(obj, true); in _cyhal_pdm_pcm_dma_start()
497 .src_addr = (uint32_t)(&(obj->base->RX_FIFO_RD)), in _cyhal_pdm_pcm_dma_start()
499 .src_addr = (uint32_t)(&(obj->base->CH[obj->resource.channel_num].RX_FIFO_RD)), in _cyhal_pdm_pcm_dma_start()
502 .dst_addr = (uint32_t)obj->async_buffer, in _cyhal_pdm_pcm_dma_start()
504 .transfer_width = 8 * obj->word_size, in _cyhal_pdm_pcm_dma_start()
510 rslt = cyhal_dma_configure(&(obj->dma), &dma_cfg); in _cyhal_pdm_pcm_dma_start()
513 SCB_InvalidateDCache_by_Addr((void *)obj->async_buffer, (transfer_size * obj->word_size)); in _cyhal_pdm_pcm_dma_start()
518 rslt = cyhal_dma_enable(&(obj->dma)); in _cyhal_pdm_pcm_dma_start()
526 void* dst_addr = (((uint8_t*) obj->async_buffer) + obj->word_size); in _cyhal_pdm_pcm_dma_start()
529 .src_addr = (uint32_t)(&(obj->base->CH[paired_channel].RX_FIFO_RD)), in _cyhal_pdm_pcm_dma_start()
533 .transfer_width = 8 * obj->word_size, in _cyhal_pdm_pcm_dma_start()
539 rslt = cyhal_dma_configure(&(obj->dma_paired), &dma_cfg_paired); in _cyhal_pdm_pcm_dma_start()
543 rslt = cyhal_dma_enable(&(obj->dma_paired)); in _cyhal_pdm_pcm_dma_start()
550 _cyhal_pdm_pcm_increment_async_buffer(obj, transfer_size); in _cyhal_pdm_pcm_dma_start()
551 rslt = cyhal_dma_start_transfer(&(obj->dma)); in _cyhal_pdm_pcm_dma_start()
556 rslt = cyhal_dma_start_transfer(&(obj->dma_paired)); in _cyhal_pdm_pcm_dma_start()
567 cyhal_pdm_pcm_t *obj = _cyhal_pdm_pcm_config_structs[block][channel]; in _cyhal_pdm_pcm_hw_irq_handler() local
569 if (obj != NULL) in _cyhal_pdm_pcm_hw_irq_handler()
572 uint32_t irq_status = Cy_PDM_PCM_GetInterruptStatus(obj->base); in _cyhal_pdm_pcm_hw_irq_handler()
574 … uint32_t irq_status = Cy_PDM_PCM_Channel_GetInterruptStatus(obj->base, obj->resource.channel_num); in _cyhal_pdm_pcm_hw_irq_handler()
580 if (obj->stabilized) in _cyhal_pdm_pcm_hw_irq_handler()
582 if (NULL != obj->async_buffer) in _cyhal_pdm_pcm_hw_irq_handler()
584 if (obj->dma.resource.type == CYHAL_RSC_INVALID) in _cyhal_pdm_pcm_hw_irq_handler()
586 if (obj->async_read_remaining > 0) in _cyhal_pdm_pcm_hw_irq_handler()
588 _cyhal_pdm_pcm_try_read_async(obj); in _cyhal_pdm_pcm_hw_irq_handler()
590 if (obj->async_read_remaining == 0) in _cyhal_pdm_pcm_hw_irq_handler()
597 if (obj->async_read_remaining > 0 && !cyhal_dma_is_busy(&(obj->dma))) in _cyhal_pdm_pcm_hw_irq_handler()
599 cy_rslt_t rslt = _cyhal_pdm_pcm_dma_start(obj); in _cyhal_pdm_pcm_hw_irq_handler()
605 if (obj->async_read_remaining == 0) in _cyhal_pdm_pcm_hw_irq_handler()
607 obj->async_buffer = NULL; in _cyhal_pdm_pcm_hw_irq_handler()
608 if (!(obj->irq_cause & CYHAL_PDM_PCM_RX_HALF_FULL)) in _cyhal_pdm_pcm_hw_irq_handler()
611 …_cyhal_pdm_pcm_set_interrupt_mask(obj, _cyhal_pdm_pcm_get_interrupt_mask(obj) & ~CY_PDM_PCM_INTR_R… in _cyhal_pdm_pcm_hw_irq_handler()
625 (void)Cy_PDM_PCM_ReadFifo(obj->base); in _cyhal_pdm_pcm_hw_irq_handler()
627 Cy_PDM_PCM_Channel_ReadFifo(obj->base, obj->resource.channel_num); in _cyhal_pdm_pcm_hw_irq_handler()
628 int16_t paired_channel = _cyhal_pdm_pcm_get_paired_channel(obj, true); in _cyhal_pdm_pcm_hw_irq_handler()
631 (void)Cy_PDM_PCM_Channel_ReadFifo(obj->base, paired_channel); in _cyhal_pdm_pcm_hw_irq_handler()
635 _cyhal_pdm_pcm_set_rx_fifo_level(obj, obj->user_trigger_level); in _cyhal_pdm_pcm_hw_irq_handler()
636 … if (!cyhal_pdm_pcm_is_pending(obj) && !(CYHAL_PDM_PCM_RX_HALF_FULL & obj->irq_cause)) in _cyhal_pdm_pcm_hw_irq_handler()
638 …_cyhal_pdm_pcm_set_interrupt_mask(obj, _cyhal_pdm_pcm_get_interrupt_mask(obj) & ~CY_PDM_PCM_INTR_R… in _cyhal_pdm_pcm_hw_irq_handler()
640 obj->stabilized = true; in _cyhal_pdm_pcm_hw_irq_handler()
644 event &= obj->irq_cause; in _cyhal_pdm_pcm_hw_irq_handler()
648 …cyhal_pdm_pcm_event_callback_t callback = (cyhal_pdm_pcm_event_callback_t) obj->callback_data.call… in _cyhal_pdm_pcm_hw_irq_handler()
651 callback(obj->callback_data.callback_arg, event); in _cyhal_pdm_pcm_hw_irq_handler()
654 _cyhal_pdm_pcm_clear_interrupt(obj, irq_status); in _cyhal_pdm_pcm_hw_irq_handler()
800 static inline cy_rslt_t _cyhal_pdm_pcm_set_pdl_config_struct(cyhal_pdm_pcm_t* obj, const cyhal_pdm_… in _cyhal_pdm_pcm_set_pdl_config_struct() argument
808 uint32_t hf1_freq = cyhal_clock_get_frequency(&obj->clock); in _cyhal_pdm_pcm_set_pdl_config_struct()
887 static inline cy_rslt_t _cyhal_pdm_pcm_set_pdl_config_struct(cyhal_pdm_pcm_t* obj, const cyhal_pdm_… in _cyhal_pdm_pcm_set_pdl_config_struct() argument
914 if(obj->is_clock_owned && false == found_existing) in _cyhal_pdm_pcm_set_pdl_config_struct()
922 …cy_rslt_t freq_result = _cyhal_utils_set_clock_frequency(&(obj->clock), desired_source_freq, &CLK_… in _cyhal_pdm_pcm_set_pdl_config_struct()
932 uint32_t actual_source_freq = cyhal_clock_get_frequency(&obj->clock); in _cyhal_pdm_pcm_set_pdl_config_struct()
949 uint8_t existingDiv = _FLD2VAL(PDM_CLOCK_CTL_CLOCK_DIV, PDM_PCM_CLOCK_CTL(obj->base)); in _cyhal_pdm_pcm_set_pdl_config_struct()
1000 cyhal_pdm_pcm_t *obj = (cyhal_pdm_pcm_t *)callback_arg; in _cyhal_pdm_pcm_dma_callback() local
1001 if (obj != NULL) in _cyhal_pdm_pcm_dma_callback()
1004 bool has_pair = CYHAL_RSC_INVALID != obj->dma_paired.resource.type; in _cyhal_pdm_pcm_dma_callback()
1005 if(has_pair && ((cyhal_dma_is_busy(&obj->dma) || cyhal_dma_is_busy(&obj->dma_paired)))) in _cyhal_pdm_pcm_dma_callback()
1011 …cyhal_pdm_pcm_event_callback_t callback = (cyhal_pdm_pcm_event_callback_t) obj->callback_data.call… in _cyhal_pdm_pcm_dma_callback()
1014 callback(obj->callback_data.callback_arg, CYHAL_PDM_PCM_ASYNC_COMPLETE); in _cyhal_pdm_pcm_dma_callback()
1020 static cy_rslt_t _cyhal_pdm_pcm_init_clock(cyhal_pdm_pcm_t *obj, const cyhal_clock_t* clk_source, c… in _cyhal_pdm_pcm_init_clock() argument
1033 obj->clock = existing_obj->clock; in _cyhal_pdm_pcm_init_clock()
1034 obj->is_clock_owned = existing_obj->is_clock_owned; in _cyhal_pdm_pcm_init_clock()
1048 obj->clock = *clk_source; in _cyhal_pdm_pcm_init_clock()
1055 …result = _cyhal_utils_allocate_clock(&(obj->clock), &(obj->resource), CYHAL_CLOCK_BLOCK_PERIPHERAL… in _cyhal_pdm_pcm_init_clock()
1058 obj->is_clock_owned = true; in _cyhal_pdm_pcm_init_clock()
1059 result = cyhal_clock_set_enabled(&(obj->clock), true, true); in _cyhal_pdm_pcm_init_clock()
1065 …if (CY_RSLT_SUCCESS == result && obj->clock.block != CYHAL_CLOCK_BLOCK_HF && false == obj->owned_b… in _cyhal_pdm_pcm_init_clock()
1067 en_clk_dst_t pclk = _cyhal_pdm_clock[obj->resource.block_num]; in _cyhal_pdm_pcm_init_clock()
1068 result = _cyhal_utils_peri_pclk_assign_divider(pclk, &(obj->clock)); in _cyhal_pdm_pcm_init_clock()
1096 static cy_rslt_t _cyhal_pdm_pcm_init_hw(cyhal_pdm_pcm_t *obj, int paired_channel, cyhal_pdm_pcm_t* … in _cyhal_pdm_pcm_init_hw() argument
1106 obj->base = _cyhal_pdm_pcm_base[obj->resource.block_num]; in _cyhal_pdm_pcm_init_hw()
1109 result = (cy_rslt_t)Cy_PDM_PCM_Init(obj->base, pdl_struct); in _cyhal_pdm_pcm_init_hw()
1115 …result = (cy_rslt_t)Cy_PDM_PCM_Channel_Init(obj->base, pdl_chan_struct, obj->resource.channel_num); in _cyhal_pdm_pcm_init_hw()
1119 … result = (cy_rslt_t)Cy_PDM_PCM_Channel_Init(obj->base, pdl_chan_struct_paired, paired_channel); in _cyhal_pdm_pcm_init_hw()
1123 Cy_PDM_PCM_Channel_Enable(obj->base, obj->resource.channel_num); in _cyhal_pdm_pcm_init_hw()
1126 Cy_PDM_PCM_Channel_Enable(obj->base, paired_channel); in _cyhal_pdm_pcm_init_hw()
1135 _cyhal_pdm_pcm_config_structs[obj->resource.block_num][obj->resource.channel_num] = obj; in _cyhal_pdm_pcm_init_hw()
1141 _cyhal_pdm_pcm_config_structs[obj->resource.block_num][paired_channel] = obj; in _cyhal_pdm_pcm_init_hw()
1147 obj->word_size = 1; in _cyhal_pdm_pcm_init_hw()
1151 obj->word_size = 2; in _cyhal_pdm_pcm_init_hw()
1155 obj->word_size = 4; in _cyhal_pdm_pcm_init_hw()
1157 obj->callback_data.callback = NULL; in _cyhal_pdm_pcm_init_hw()
1158 obj->callback_data.callback_arg = NULL; in _cyhal_pdm_pcm_init_hw()
1161 obj->irq_cause = (uint32_t)_cyhal_pdm_pcm_get_hal_event(pdl_struct->interruptMask); in _cyhal_pdm_pcm_init_hw()
1162 obj->stabilized = false; in _cyhal_pdm_pcm_init_hw()
1164 obj->stabilized = true; in _cyhal_pdm_pcm_init_hw()
1165 _cyhal_pdm_pcm_set_rx_fifo_level(obj, obj->user_trigger_level); in _cyhal_pdm_pcm_init_hw()
1167 obj->pm_transition_ready = false; in _cyhal_pdm_pcm_init_hw()
1169 obj->pm_callback.callback = &_cyhal_pdm_pcm_pm_callback; in _cyhal_pdm_pcm_init_hw()
1170 …obj->pm_callback.states = (cyhal_syspm_callback_state_t)(CYHAL_SYSPM_CB_CPU_DEEPSLEEP | CYHAL_SYSP… in _cyhal_pdm_pcm_init_hw()
1171 obj->pm_callback.next = NULL; in _cyhal_pdm_pcm_init_hw()
1172 obj->pm_callback.args = (void*)obj; in _cyhal_pdm_pcm_init_hw()
1173 …obj->pm_callback.ignore_modes = (cyhal_syspm_callback_mode_t)(CYHAL_SYSPM_BEFORE_TRANSITION | CYHA… in _cyhal_pdm_pcm_init_hw()
1175 _cyhal_syspm_register_peripheral_callback(&(obj->pm_callback)); in _cyhal_pdm_pcm_init_hw()
1179 …_cyhal_system_irq_t irqn = _cyhal_pdm_pcm_irq_n[obj->resource.block_num][obj->resource.channel_num… in _cyhal_pdm_pcm_init_hw()
1182 cyhal_pdm_pcm_clear(obj); in _cyhal_pdm_pcm_init_hw()
1188 cy_rslt_t cyhal_pdm_pcm_init(cyhal_pdm_pcm_t *obj, cyhal_gpio_t pin_data, cyhal_gpio_t pin_clk, in cyhal_pdm_pcm_init() argument
1191 CY_ASSERT(NULL != obj); in cyhal_pdm_pcm_init()
1192 memset(obj, 0, sizeof(cyhal_pdm_pcm_t)); in cyhal_pdm_pcm_init()
1198 obj->resource.type = CYHAL_RSC_INVALID; in cyhal_pdm_pcm_init()
1199 obj->pin_data = CYHAL_NC_PIN_VALUE; in cyhal_pdm_pcm_init()
1200 obj->pin_clk = CYHAL_NC_PIN_VALUE; in cyhal_pdm_pcm_init()
1201 obj->dma.resource.type = CYHAL_RSC_INVALID; in cyhal_pdm_pcm_init()
1203 obj->dma_paired.resource.type = CYHAL_RSC_INVALID; in cyhal_pdm_pcm_init()
1206 obj->user_trigger_level = _CYHAL_PDM_PCM_HALF_FIFO; in cyhal_pdm_pcm_init()
1230 _CYHAL_UTILS_ASSIGN_RESOURCE(obj->resource, CYHAL_RSC_PDM, data_map); in cyhal_pdm_pcm_init()
1231 obj->base = _cyhal_pdm_pcm_base[obj->resource.block_num]; in cyhal_pdm_pcm_init()
1235 paired_channel = _cyhal_pdm_pcm_get_paired_channel(obj, false); in cyhal_pdm_pcm_init()
1238 … if((NULL != _cyhal_pdm_pcm_config_structs[obj->resource.block_num][obj->resource.channel_num]) || in cyhal_pdm_pcm_init()
1239 …(paired_channel >= 0 && (NULL != _cyhal_pdm_pcm_config_structs[obj->resource.block_num][paired_cha… in cyhal_pdm_pcm_init()
1246 existing_obj = _cyhal_pdm_pcm_find_existing_obj(obj->resource.block_num); in cyhal_pdm_pcm_init()
1249 result = cyhal_hwmgr_reserve(&(obj->resource)); in cyhal_pdm_pcm_init()
1259 obj->pin_data = pin_data; in cyhal_pdm_pcm_init()
1267 obj->pin_clk = pin_clk; in cyhal_pdm_pcm_init()
1273 result = _cyhal_pdm_pcm_init_clock(obj, clk_source, existing_obj); in cyhal_pdm_pcm_init()
1280 result = _cyhal_pdm_pcm_set_pdl_config_struct(obj, cfg, &pdl_struct); in cyhal_pdm_pcm_init()
1285 result = _cyhal_pdm_pcm_set_pdl_config_struct(obj, cfg, (NULL != existing_obj), &pdl_struct, in cyhal_pdm_pcm_init()
1291 result = _cyhal_pdm_pcm_init_hw(obj, paired_channel, existing_obj, &pdl_struct); in cyhal_pdm_pcm_init()
1293 result = _cyhal_pdm_pcm_init_hw(obj, paired_channel, existing_obj, &pdl_struct, in cyhal_pdm_pcm_init()
1300 PDM_PCM_ROUTE_CTL(obj->base) |= (1 << paired_channel); in cyhal_pdm_pcm_init()
1308 cyhal_pdm_pcm_free(obj); in cyhal_pdm_pcm_init()
1313 cy_rslt_t cyhal_pdm_pcm_init_cfg(cyhal_pdm_pcm_t *obj, const cyhal_pdm_pcm_configurator_t* cfg) in cyhal_pdm_pcm_init_cfg() argument
1315 CY_ASSERT(NULL != obj); in cyhal_pdm_pcm_init_cfg()
1316 memset(obj, 0, sizeof(cyhal_pdm_pcm_t)); in cyhal_pdm_pcm_init_cfg()
1317 obj->resource = *cfg->resource; in cyhal_pdm_pcm_init_cfg()
1318 obj->pin_data = CYHAL_NC_PIN_VALUE; in cyhal_pdm_pcm_init_cfg()
1319 obj->pin_clk = CYHAL_NC_PIN_VALUE; in cyhal_pdm_pcm_init_cfg()
1320 obj->dma.resource.type = CYHAL_RSC_INVALID; in cyhal_pdm_pcm_init_cfg()
1322 obj->dma_paired.resource.type = CYHAL_RSC_INVALID; in cyhal_pdm_pcm_init_cfg()
1324 obj->owned_by_configurator = true; in cyhal_pdm_pcm_init_cfg()
1328 obj->user_trigger_level = cfg->config->rxFifoTriggerLevel + 1; in cyhal_pdm_pcm_init_cfg()
1330 obj->user_trigger_level = cfg->chan_config->rxFifoTriggerLevel + 1; in cyhal_pdm_pcm_init_cfg()
1335 cyhal_pdm_pcm_t* existing_obj = _cyhal_pdm_pcm_find_existing_obj(obj->resource.block_num); in cyhal_pdm_pcm_init_cfg()
1336 cy_rslt_t result = _cyhal_pdm_pcm_init_clock(obj, cfg->clock, existing_obj); in cyhal_pdm_pcm_init_cfg()
1342 result = _cyhal_pdm_pcm_init_hw(obj, _CYHAL_PDM_PCM_UNPAIRED, existing_obj, cfg->config); in cyhal_pdm_pcm_init_cfg()
1344 …result = _cyhal_pdm_pcm_init_hw(obj, _CYHAL_PDM_PCM_UNPAIRED, existing_obj, cfg->config, cfg->chan… in cyhal_pdm_pcm_init_cfg()
1350 cyhal_pdm_pcm_free(obj); in cyhal_pdm_pcm_init_cfg()
1356 void cyhal_pdm_pcm_free(cyhal_pdm_pcm_t *obj) in cyhal_pdm_pcm_free() argument
1358 CY_ASSERT(NULL != obj); in cyhal_pdm_pcm_free()
1361 if (CYHAL_RSC_INVALID != obj->resource.type) in cyhal_pdm_pcm_free()
1364 int16_t paired_channel = _cyhal_pdm_pcm_get_paired_channel(obj, true); in cyhal_pdm_pcm_free()
1367 for(int i = 0; last_remaining && i < _cyhal_pdm_num_channels[obj->resource.block_num]; ++i) in cyhal_pdm_pcm_free()
1369 cyhal_pdm_pcm_t* existing = _cyhal_pdm_pcm_config_structs[obj->resource.block_num][i]; in cyhal_pdm_pcm_free()
1370 last_remaining &= (NULL == existing || obj == existing); in cyhal_pdm_pcm_free()
1372 _cyhal_syspm_unregister_peripheral_callback(&(obj->pm_callback)); in cyhal_pdm_pcm_free()
1373 if(NULL != obj->base) in cyhal_pdm_pcm_free()
1376 Cy_PDM_PCM_Channel_Disable(obj->base, obj->resource.channel_num); in cyhal_pdm_pcm_free()
1377 Cy_PDM_PCM_Channel_DeInit(obj->base, obj->resource.channel_num); in cyhal_pdm_pcm_free()
1380 Cy_PDM_PCM_Channel_Disable(obj->base, paired_channel); in cyhal_pdm_pcm_free()
1381 Cy_PDM_PCM_Channel_DeInit(obj->base, paired_channel); in cyhal_pdm_pcm_free()
1384 PDM_PCM_ROUTE_CTL(obj->base) &= ~(1 << paired_channel); in cyhal_pdm_pcm_free()
1389 Cy_PDM_PCM_DeInit(obj->base); in cyhal_pdm_pcm_free()
1392 … _cyhal_irq_free(_cyhal_pdm_pcm_irq_n[obj->resource.block_num][obj->resource.channel_num]); in cyhal_pdm_pcm_free()
1395 if(obj == _cyhal_pdm_pcm_config_structs[obj->resource.block_num][obj->resource.channel_num]) in cyhal_pdm_pcm_free()
1397 … _cyhal_pdm_pcm_config_structs[obj->resource.block_num][obj->resource.channel_num] = NULL; in cyhal_pdm_pcm_free()
1403 _cyhal_pdm_pcm_config_structs[obj->resource.block_num][paired_channel] = NULL; in cyhal_pdm_pcm_free()
1407 if(last_remaining && false == obj->owned_by_configurator) in cyhal_pdm_pcm_free()
1409 cyhal_hwmgr_free(&(obj->resource)); in cyhal_pdm_pcm_free()
1411 obj->base = NULL; in cyhal_pdm_pcm_free()
1412 obj->resource.type = CYHAL_RSC_INVALID; in cyhal_pdm_pcm_free()
1414 if(false == obj->owned_by_configurator) in cyhal_pdm_pcm_free()
1416 _cyhal_utils_release_if_used(&(obj->pin_data)); in cyhal_pdm_pcm_free()
1417 _cyhal_utils_release_if_used(&(obj->pin_clk)); in cyhal_pdm_pcm_free()
1420 if(last_remaining && obj->is_clock_owned) in cyhal_pdm_pcm_free()
1422 cyhal_clock_free(&(obj->clock)); in cyhal_pdm_pcm_free()
1425 if (CYHAL_RSC_INVALID != obj->dma.resource.type) in cyhal_pdm_pcm_free()
1427 cyhal_dma_free(&(obj->dma)); in cyhal_pdm_pcm_free()
1431 if (CYHAL_RSC_INVALID != obj->dma_paired.resource.type) in cyhal_pdm_pcm_free()
1433 cyhal_dma_free(&(obj->dma_paired)); in cyhal_pdm_pcm_free()
1439 cy_rslt_t cyhal_pdm_pcm_start(cyhal_pdm_pcm_t *obj) in cyhal_pdm_pcm_start() argument
1441 CY_ASSERT(NULL != obj); in cyhal_pdm_pcm_start()
1442 if (obj->pm_transition_ready) in cyhal_pdm_pcm_start()
1447 obj->stabilized = false; in cyhal_pdm_pcm_start()
1449 Cy_PDM_PCM_ClearFifo(obj->base); in cyhal_pdm_pcm_start()
1450 Cy_PDM_PCM_Enable(obj->base); in cyhal_pdm_pcm_start()
1452 _cyhal_pdm_pcm_set_rx_fifo_level(obj, _CYHAL_PDM_PCM_STABILIZATION_FS); in cyhal_pdm_pcm_start()
1453 …_cyhal_pdm_pcm_set_interrupt_mask(obj, _cyhal_pdm_pcm_get_interrupt_mask(obj) | CY_PDM_PCM_INTR_RX… in cyhal_pdm_pcm_start()
1456 Cy_PDM_PCM_Activate_Channel(obj->base, obj->resource.channel_num); in cyhal_pdm_pcm_start()
1457 int16_t paired_channel = _cyhal_pdm_pcm_get_paired_channel(obj, true); in cyhal_pdm_pcm_start()
1460 Cy_PDM_PCM_Activate_Channel(obj->base, paired_channel); in cyhal_pdm_pcm_start()
1466 cy_rslt_t cyhal_pdm_pcm_stop(cyhal_pdm_pcm_t *obj) in cyhal_pdm_pcm_stop() argument
1468 CY_ASSERT(NULL != obj); in cyhal_pdm_pcm_stop()
1470 Cy_PDM_PCM_Disable(obj->base); in cyhal_pdm_pcm_stop()
1473 Cy_PDM_PCM_DeActivate_Channel(obj->base, obj->resource.channel_num); in cyhal_pdm_pcm_stop()
1474 int16_t paired_channel = _cyhal_pdm_pcm_get_paired_channel(obj, true); in cyhal_pdm_pcm_stop()
1477 Cy_PDM_PCM_DeActivate_Channel(obj->base, paired_channel); in cyhal_pdm_pcm_stop()
1483 bool cyhal_pdm_pcm_is_enabled(cyhal_pdm_pcm_t *obj) in cyhal_pdm_pcm_is_enabled() argument
1485 CY_ASSERT(NULL != obj); in cyhal_pdm_pcm_is_enabled()
1487 return (0 != Cy_PDM_PCM_GetCurrentState(obj->base)); in cyhal_pdm_pcm_is_enabled()
1489 return (0 != Cy_PDM_PCM_Channel_GetCurrentState(obj->base, obj->resource.channel_num)); in cyhal_pdm_pcm_is_enabled()
1493 cy_rslt_t cyhal_pdm_pcm_set_gain(cyhal_pdm_pcm_t *obj, int16_t gain_left, int16_t gain_right) in cyhal_pdm_pcm_set_gain() argument
1495 CY_ASSERT(NULL != obj); in cyhal_pdm_pcm_set_gain()
1503 Cy_PDM_PCM_SetGain(obj->base, CY_PDM_PCM_CHAN_LEFT, _cyhal_pdm_pcm_scale_gain_value(gain_left)); in cyhal_pdm_pcm_set_gain()
1504 … Cy_PDM_PCM_SetGain(obj->base, CY_PDM_PCM_CHAN_RIGHT, _cyhal_pdm_pcm_scale_gain_value(gain_right)); in cyhal_pdm_pcm_set_gain()
1506 int16_t paired_channel = _cyhal_pdm_pcm_get_paired_channel(obj, true); in cyhal_pdm_pcm_set_gain()
1524 uint8_t clkDiv = _FLD2VAL(PDM_CLOCK_CTL_CLOCK_DIV, PDM_PCM_CLOCK_CTL(obj->base)); in cyhal_pdm_pcm_set_gain()
1525 …uint8_t sampleDelay = _FLD2VAL(PDM_CH_IF_CTL_SAMPLE_DELAY, PDM_PCM_CH_IF_CTL(obj->base, obj->resou… in cyhal_pdm_pcm_set_gain()
1533 … _FLD2VAL(PDM_CH_FIR1_CTL_DECIM2, PDM_PCM_CH_FIR1_CTL(obj->base, 0u)); in cyhal_pdm_pcm_set_gain()
1534 …Cy_PDM_PCM_Channel_Set_Fir1(obj->base, obj->resource.channel_num, decim_code, mono_and_right ? fir… in cyhal_pdm_pcm_set_gain()
1539 Cy_PDM_PCM_Channel_Set_Fir1(obj->base, paired_channel, decim_code, fir1_scale_right); in cyhal_pdm_pcm_set_gain()
1547 cy_rslt_t cyhal_pdm_pcm_clear(cyhal_pdm_pcm_t *obj) in cyhal_pdm_pcm_clear() argument
1549 CY_ASSERT(NULL != obj); in cyhal_pdm_pcm_clear()
1552 Cy_PDM_PCM_ClearFifo(obj->base); in cyhal_pdm_pcm_clear()
1555 while(Cy_PDM_PCM_Channel_GetNumInFifo(obj->base, obj->resource.channel_num) > 0) in cyhal_pdm_pcm_clear()
1557 (void)Cy_PDM_PCM_Channel_ReadFifo(obj->base, obj->resource.channel_num); in cyhal_pdm_pcm_clear()
1560 int16_t paired_channel = _cyhal_pdm_pcm_get_paired_channel(obj, true); in cyhal_pdm_pcm_clear()
1563 while(Cy_PDM_PCM_Channel_GetNumInFifo(obj->base, paired_channel) > 0) in cyhal_pdm_pcm_clear()
1565 (void)Cy_PDM_PCM_Channel_ReadFifo(obj->base, paired_channel); in cyhal_pdm_pcm_clear()
1570 _cyhal_pdm_pcm_clear_interrupt(obj, CY_PDM_PCM_INTR_RX_TRIGGER | CY_PDM_PCM_INTR_RX_OVERFLOW in cyhal_pdm_pcm_clear()
1575 cy_rslt_t cyhal_pdm_pcm_read(cyhal_pdm_pcm_t *obj, void *data, size_t *length) in cyhal_pdm_pcm_read() argument
1577 CY_ASSERT(NULL != obj); in cyhal_pdm_pcm_read()
1578 if (!(obj->stabilized)) in cyhal_pdm_pcm_read()
1584 uint8_t fifo_count = Cy_PDM_PCM_GetNumInFifo(obj->base); in cyhal_pdm_pcm_read()
1586 int16_t paired_channel = _cyhal_pdm_pcm_get_paired_channel(obj, true); in cyhal_pdm_pcm_read()
1587 uint8_t fifo_count = Cy_PDM_PCM_Channel_GetNumInFifo(obj->base, obj->resource.channel_num); in cyhal_pdm_pcm_read()
1590 fifo_count += Cy_PDM_PCM_Channel_GetNumInFifo(obj->base, paired_channel); in cyhal_pdm_pcm_read()
1602 if (obj->word_size == 1) in cyhal_pdm_pcm_read()
1608 buffer[i] = (Cy_PDM_PCM_ReadFifo(obj->base) & 0xFF); in cyhal_pdm_pcm_read()
1610 buffer[i] = (Cy_PDM_PCM_Channel_ReadFifo(obj->base, obj->resource.channel_num)) & 0xFF; in cyhal_pdm_pcm_read()
1614 buffer[i] = (Cy_PDM_PCM_Channel_ReadFifo(obj->base, paired_channel)) & 0xFF; in cyhal_pdm_pcm_read()
1619 if (obj->word_size == 2) in cyhal_pdm_pcm_read()
1625 buffer[i] = (Cy_PDM_PCM_ReadFifo(obj->base) & 0xFFFF); in cyhal_pdm_pcm_read()
1627 … buffer[i] = (Cy_PDM_PCM_Channel_ReadFifo(obj->base, obj->resource.channel_num)) & 0xFFFF; in cyhal_pdm_pcm_read()
1631 buffer[i] = (Cy_PDM_PCM_Channel_ReadFifo(obj->base, paired_channel)) & 0xFFFF; in cyhal_pdm_pcm_read()
1642 buffer[i] = Cy_PDM_PCM_ReadFifo(obj->base); in cyhal_pdm_pcm_read()
1644 buffer[i] = Cy_PDM_PCM_Channel_ReadFifo(obj->base, obj->resource.channel_num); in cyhal_pdm_pcm_read()
1648 buffer[i] = Cy_PDM_PCM_Channel_ReadFifo(obj->base, paired_channel); in cyhal_pdm_pcm_read()
1656 cy_rslt_t cyhal_pdm_pcm_read_async(cyhal_pdm_pcm_t *obj, void *data, size_t length) in cyhal_pdm_pcm_read_async() argument
1658 CY_ASSERT(NULL != obj); in cyhal_pdm_pcm_read_async()
1659 if (obj->pm_transition_ready) in cyhal_pdm_pcm_read_async()
1663 if (cyhal_pdm_pcm_is_pending(obj)) in cyhal_pdm_pcm_read_async()
1669 _cyhal_irq_disable(_cyhal_pdm_pcm_irq_n[obj->resource.block_num][obj->resource.channel_num]); in cyhal_pdm_pcm_read_async()
1671 obj->async_buffer = data; in cyhal_pdm_pcm_read_async()
1672 obj->async_read_remaining = length; in cyhal_pdm_pcm_read_async()
1674 if (obj->stabilized) in cyhal_pdm_pcm_read_async()
1676 if (obj->dma.resource.type == CYHAL_RSC_INVALID) in cyhal_pdm_pcm_read_async()
1679 _cyhal_pdm_pcm_try_read_async(obj); in cyhal_pdm_pcm_read_async()
1681 if (0 == obj->async_read_remaining) in cyhal_pdm_pcm_read_async()
1683 …cyhal_pdm_pcm_event_callback_t callback = (cyhal_pdm_pcm_event_callback_t) obj->callback_data.call… in cyhal_pdm_pcm_read_async()
1686 obj->async_buffer = NULL; in cyhal_pdm_pcm_read_async()
1687 callback(obj->callback_data.callback_arg, CYHAL_PDM_PCM_ASYNC_COMPLETE); in cyhal_pdm_pcm_read_async()
1693 if (0 != obj->async_read_remaining) in cyhal_pdm_pcm_read_async()
1695 …_cyhal_pdm_pcm_set_interrupt_mask(obj, _cyhal_pdm_pcm_get_interrupt_mask(obj) | CY_PDM_PCM_INTR_RX… in cyhal_pdm_pcm_read_async()
1697 _cyhal_irq_enable(_cyhal_pdm_pcm_irq_n[obj->resource.block_num][obj->resource.channel_num]); in cyhal_pdm_pcm_read_async()
1701 bool cyhal_pdm_pcm_is_pending(cyhal_pdm_pcm_t *obj) in cyhal_pdm_pcm_is_pending() argument
1703 CY_ASSERT(NULL != obj); in cyhal_pdm_pcm_is_pending()
1704 return obj->async_read_remaining != 0 && obj->async_buffer != NULL; in cyhal_pdm_pcm_is_pending()
1707 cy_rslt_t cyhal_pdm_pcm_abort_async(cyhal_pdm_pcm_t *obj) in cyhal_pdm_pcm_abort_async() argument
1709 CY_ASSERT(NULL != obj); in cyhal_pdm_pcm_abort_async()
1711 obj->async_read_remaining = 0; in cyhal_pdm_pcm_abort_async()
1712 obj->async_buffer = NULL; in cyhal_pdm_pcm_abort_async()
1714 if (!(obj->irq_cause & CYHAL_PDM_PCM_RX_HALF_FULL)) in cyhal_pdm_pcm_abort_async()
1716 …_cyhal_pdm_pcm_set_interrupt_mask(obj, _cyhal_pdm_pcm_get_interrupt_mask(obj) & ~CY_PDM_PCM_INTR_R… in cyhal_pdm_pcm_abort_async()
1722 void cyhal_pdm_pcm_register_callback(cyhal_pdm_pcm_t *obj, cyhal_pdm_pcm_event_callback_t callback,… in cyhal_pdm_pcm_register_callback() argument
1725 obj->callback_data.callback = (cy_israddress) callback; in cyhal_pdm_pcm_register_callback()
1726 obj->callback_data.callback_arg = callback_arg; in cyhal_pdm_pcm_register_callback()
1730 void cyhal_pdm_pcm_enable_event(cyhal_pdm_pcm_t *obj, cyhal_pdm_pcm_event_t event, uint8_t intr_pri… in cyhal_pdm_pcm_enable_event() argument
1735 obj->irq_cause |= event; in cyhal_pdm_pcm_enable_event()
1736 _cyhal_pdm_pcm_clear_interrupt(obj, mask); in cyhal_pdm_pcm_enable_event()
1737 _cyhal_pdm_pcm_set_interrupt_mask(obj, _cyhal_pdm_pcm_get_interrupt_mask(obj) | mask); in cyhal_pdm_pcm_enable_event()
1741 obj->irq_cause &= ~event; in cyhal_pdm_pcm_enable_event()
1743 if (!obj->stabilized && cyhal_pdm_pcm_is_pending(obj)) in cyhal_pdm_pcm_enable_event()
1752 _cyhal_pdm_pcm_set_interrupt_mask(obj, _cyhal_pdm_pcm_get_interrupt_mask(obj) & ~mask); in cyhal_pdm_pcm_enable_event()
1756 …_cyhal_irq_set_priority(_cyhal_pdm_pcm_irq_n[obj->resource.block_num][obj->resource.channel_num], … in cyhal_pdm_pcm_enable_event()
1759 cy_rslt_t cyhal_pdm_pcm_set_async_mode(cyhal_pdm_pcm_t *obj, cyhal_async_mode_t mode, uint8_t dma_p… in cyhal_pdm_pcm_set_async_mode() argument
1761 CY_ASSERT(NULL != obj); in cyhal_pdm_pcm_set_async_mode()
1770 else if (CYHAL_RSC_INVALID != obj->dma.resource.type) in cyhal_pdm_pcm_set_async_mode()
1772 cyhal_dma_free(&(obj->dma)); in cyhal_pdm_pcm_set_async_mode()
1773 obj->dma.resource.type = CYHAL_RSC_INVALID; in cyhal_pdm_pcm_set_async_mode()
1775 if(CYHAL_RSC_INVALID != obj->dma_paired.resource.type) in cyhal_pdm_pcm_set_async_mode()
1777 cyhal_dma_free(&(obj->dma_paired)); in cyhal_pdm_pcm_set_async_mode()
1778 obj->dma_paired.resource.type = CYHAL_RSC_INVALID; in cyhal_pdm_pcm_set_async_mode()
1783 else if (CYHAL_ASYNC_DMA == mode && CYHAL_RSC_INVALID == obj->dma.resource.type) in cyhal_pdm_pcm_set_async_mode()
1785 rslt = cyhal_dma_init(&(obj->dma), dma_priority, CYHAL_DMA_DIRECTION_PERIPH2MEM); in cyhal_pdm_pcm_set_async_mode()
1787 int16_t paired_channel = _cyhal_pdm_pcm_get_paired_channel(obj, true); in cyhal_pdm_pcm_set_async_mode()
1790 rslt = cyhal_dma_init(&(obj->dma_paired), dma_priority, CYHAL_DMA_DIRECTION_PERIPH2MEM); in cyhal_pdm_pcm_set_async_mode()
1793 cyhal_dma_register_callback(&(obj->dma_paired), &_cyhal_pdm_pcm_dma_callback, obj); in cyhal_pdm_pcm_set_async_mode()
1799 cyhal_dma_register_callback(&(obj->dma), &_cyhal_pdm_pcm_dma_callback, obj); in cyhal_pdm_pcm_set_async_mode()