Lines Matching refs:obj
235 static uint8_t _cyhal_adc_last_enabled(const cyhal_adc_t* obj); /* Or last channel, if no channel i…
474 static uint8_t _cyhal_adc_first_enabled(const cyhal_adc_t* obj) /* Or first channel, if no channel … in _cyhal_adc_first_enabled() argument
479 if(NULL != obj->channel_config[i] && obj->base->CH[i].ENABLE) in _cyhal_adc_first_enabled()
489 static uint8_t _cyhal_adc_last_enabled(const cyhal_adc_t* obj) /* Or last channel, if no channel is… in _cyhal_adc_last_enabled() argument
495 if(NULL != obj->channel_config[i] && obj->base->CH[i].ENABLE) in _cyhal_adc_last_enabled()
505 static int32_t _cyhal_adc_counts_to_uvolts(cyhal_adc_t* obj, uint8_t channel, uint32_t counts) in _cyhal_adc_counts_to_uvolts() argument
507 CY_UNUSED_PARAMETER(obj); /* We're always single-ended with vneg set to vssa */ in _cyhal_adc_counts_to_uvolts()
512 return (int32_t)((counts * 900000.0f) / obj->vbg_last_value); in _cyhal_adc_counts_to_uvolts()
559 static void _cyhal_adc_update_intr_mask(const cyhal_adc_t* obj) in _cyhal_adc_update_intr_mask() argument
561 bool needs_eos = (obj->async_scans_remaining > 0) /* Async transfer in progress */ in _cyhal_adc_update_intr_mask()
562 … || (false == obj->conversion_complete) /* ISR needs to flag that a conversion finished */ in _cyhal_adc_update_intr_mask()
564 … || obj->stop_after_scan /* ISR needs to stop the conversion after the scan finishes */ in _cyhal_adc_update_intr_mask()
566 … || (0u != (CYHAL_ADC_EOS & obj->user_enabled_events)); /* User requested EOS event */ in _cyhal_adc_update_intr_mask()
569 uint8_t last_channel = _cyhal_adc_last_enabled(obj); in _cyhal_adc_update_intr_mask()
570 uint32_t current_mask = Cy_SAR2_Channel_GetInterruptMask(obj->base, last_channel); in _cyhal_adc_update_intr_mask()
581 Cy_SAR2_Channel_ClearInterrupt(obj->base, last_channel, new_mask & (~current_mask)); in _cyhal_adc_update_intr_mask()
582 Cy_SAR2_Channel_SetInterruptMask(obj->base, last_channel, new_mask); in _cyhal_adc_update_intr_mask()
584 uint32_t current_mask = Cy_SAR_GetInterruptMask(obj->base); in _cyhal_adc_update_intr_mask()
595 Cy_SAR_ClearInterrupt(obj->base, new_mask & (~current_mask)); in _cyhal_adc_update_intr_mask()
596 Cy_SAR_SetInterruptMask(obj->base, new_mask); in _cyhal_adc_update_intr_mask()
600 static uint8_t _cyhal_adc_max_configured_channel(const cyhal_adc_t* obj) in _cyhal_adc_max_configured_channel() argument
605 if(NULL != obj->channel_config[i]) in _cyhal_adc_max_configured_channel()
613 static cyhal_source_t _cyhal_adc_calculate_source(cyhal_adc_t *obj) in _cyhal_adc_calculate_source() argument
615 CY_ASSERT(obj->resource.block_num < _CYHAL_ADC_SAR_INSTANCES); in _cyhal_adc_calculate_source()
616 return _cyhal_adc_tr_out[obj->resource.block_num]; in _cyhal_adc_calculate_source()
939 static int32_t _cyhal_adc_counts_to_uvolts(cyhal_adc_t* obj, uint8_t channel, int32_t counts) in _cyhal_adc_counts_to_uvolts() argument
941 return Cy_SAR_CountsTo_uVolts(obj->base, channel, counts); in _cyhal_adc_counts_to_uvolts()
945 static void _cyhal_adc_start_convert(cyhal_adc_t* obj) in _cyhal_adc_start_convert() argument
949 Cy_SAR2_Channel_SoftwareTrigger(obj->base, _cyhal_adc_first_enabled(obj)); in _cyhal_adc_start_convert()
951 …Cy_SAR_StartConvert(obj->base, obj->continuous_scanning ? CY_SAR_START_CONVERT_CONTINUOUS : CY_SAR… in _cyhal_adc_start_convert()
961 cyhal_adc_t* obj = _cyhal_adc_config_structs[block]; in _cyhal_adc_irq_handler() local
963 uint8_t channel_idx = _cyhal_adc_last_enabled(obj); in _cyhal_adc_irq_handler()
964 Cy_SAR2_Channel_ClearInterrupt(obj->base, channel_idx, CY_SAR2_INT_GRP_DONE); in _cyhal_adc_irq_handler()
966 Cy_SAR_ClearInterrupt(obj->base, CY_SAR_INTR_EOS); in _cyhal_adc_irq_handler()
968 obj->conversion_complete = true; in _cyhal_adc_irq_handler()
970 if(obj->stop_after_scan) in _cyhal_adc_irq_handler()
972 Cy_SAR_StopConvert(obj->base); in _cyhal_adc_irq_handler()
976 if(obj->async_scans_remaining > 0) in _cyhal_adc_irq_handler()
978 uint8_t num_channels = _cyhal_adc_max_configured_channel(obj) + 1; in _cyhal_adc_irq_handler()
980 if(CYHAL_ASYNC_SW == obj->async_mode || obj->async_transfer_in_uv) in _cyhal_adc_irq_handler()
988 … obj->vbg_last_value = Cy_SAR2_Channel_GetResult(obj->base, _CYHAL_ADC_VBG_CHANNEL_IDX, NULL); in _cyhal_adc_irq_handler()
993 counts = Cy_SAR2_Channel_GetResult(obj->base, i, NULL); in _cyhal_adc_irq_handler()
996 counts = Cy_SAR_GetResult32(obj->base, i); in _cyhal_adc_irq_handler()
998 …*obj->async_buff_next = obj->async_transfer_in_uv ? _cyhal_adc_counts_to_uvolts(obj, i, counts) : … in _cyhal_adc_irq_handler()
999 ++obj->async_buff_next; in _cyhal_adc_irq_handler()
1001 --(obj->async_scans_remaining); in _cyhal_adc_irq_handler()
1002 if(0 == obj->async_scans_remaining) in _cyhal_adc_irq_handler()
1004 obj->async_buff_next = obj->async_buff_orig = NULL; in _cyhal_adc_irq_handler()
1007 else if(false == obj->continuous_scanning) in _cyhal_adc_irq_handler()
1009 _cyhal_adc_start_convert(obj); in _cyhal_adc_irq_handler()
1016 CY_ASSERT(CYHAL_ASYNC_DMA == obj->async_mode); in _cyhal_adc_irq_handler()
1021 .src_addr = (uint32_t)obj->base->CHAN_RESULT, in _cyhal_adc_irq_handler()
1023 .dst_addr = (uint32_t)obj->async_buff_next, in _cyhal_adc_irq_handler()
1032 cy_rslt_t result = cyhal_dma_configure(&(obj->dma), &dma_config); in _cyhal_adc_irq_handler()
1035 result = cyhal_dma_enable(&(obj->dma)); in _cyhal_adc_irq_handler()
1039 result = cyhal_dma_start_transfer(&(obj->dma)); in _cyhal_adc_irq_handler()
1044 if(false == obj->continuous_scanning) in _cyhal_adc_irq_handler()
1046 _cyhal_adc_start_convert(obj); in _cyhal_adc_irq_handler()
1054 _cyhal_adc_update_intr_mask(obj); in _cyhal_adc_irq_handler()
1056 if(0 != (hal_event & ((cyhal_adc_event_t)obj->user_enabled_events))) in _cyhal_adc_irq_handler()
1058 … cyhal_adc_event_callback_t callback = (cyhal_adc_event_callback_t)obj->callback_data.callback; in _cyhal_adc_irq_handler()
1061 …callback(obj->callback_data.callback_arg, (cyhal_adc_event_t)(hal_event & obj->user_enabled_events… in _cyhal_adc_irq_handler()
1072 cyhal_adc_t* obj = (cyhal_adc_t*)arg; in _cyhal_adc_dma_handler() local
1073 CY_ASSERT(CYHAL_ASYNC_DMA == obj->async_mode); in _cyhal_adc_dma_handler()
1075 uint8_t num_channels = _cyhal_adc_max_configured_channel(obj) + 1; in _cyhal_adc_dma_handler()
1076 CY_ASSERT(false == obj->async_transfer_in_uv); in _cyhal_adc_dma_handler()
1077 obj->async_buff_next += num_channels; in _cyhal_adc_dma_handler()
1078 --(obj->async_scans_remaining); in _cyhal_adc_dma_handler()
1079 _cyhal_adc_update_intr_mask(obj); in _cyhal_adc_dma_handler()
1081 if(0 == obj->async_scans_remaining) in _cyhal_adc_dma_handler()
1085 while(obj->async_buff_orig != obj->async_buff_next) in _cyhal_adc_dma_handler()
1089 int16_t sar_result = (int16_t)(0xFFFF & *(obj->async_buff_orig)); in _cyhal_adc_dma_handler()
1090 *(obj->async_buff_orig) = sar_result; in _cyhal_adc_dma_handler()
1091 ++(obj->async_buff_orig); in _cyhal_adc_dma_handler()
1093 obj->async_buff_next = obj->async_buff_orig = NULL; in _cyhal_adc_dma_handler()
1094 if(0 != (CYHAL_ADC_ASYNC_READ_COMPLETE & ((cyhal_adc_event_t)obj->user_enabled_events))) in _cyhal_adc_dma_handler()
1096 … cyhal_adc_event_callback_t callback = (cyhal_adc_event_callback_t)obj->callback_data.callback; in _cyhal_adc_dma_handler()
1099 callback(obj->callback_data.callback_arg, CYHAL_ADC_ASYNC_READ_COMPLETE); in _cyhal_adc_dma_handler()
1110 cy_rslt_t _cyhal_adc_config_hw(cyhal_adc_t *obj, const cyhal_adc_configurator_t* cfg, cyhal_gpio_t … in _cyhal_adc_config_hw() argument
1114 CY_ASSERT(NULL != obj); in _cyhal_adc_config_hw()
1118 memset(obj, 0, sizeof(cyhal_adc_t)); in _cyhal_adc_config_hw()
1119 obj->clock.reserved = false; in _cyhal_adc_config_hw()
1120 obj->resource.type = CYHAL_RSC_INVALID; in _cyhal_adc_config_hw()
1121 obj->async_mode = CYHAL_ASYNC_SW; in _cyhal_adc_config_hw()
1122 obj->source = CYHAL_TRIGGER_CPUSS_ZERO; in _cyhal_adc_config_hw()
1124 obj->resolution = _CYHAL_ADC_RESOLUTION; in _cyhal_adc_config_hw()
1125 obj->ext_vref = NC; in _cyhal_adc_config_hw()
1126 obj->bypass_pin = NC; in _cyhal_adc_config_hw()
1129 obj->owned_by_configurator = owned_by_configurator; in _cyhal_adc_config_hw()
1142 obj->resource.type = CYHAL_RSC_ADC; in _cyhal_adc_config_hw()
1143 obj->resource.block_num = map->block_num; in _cyhal_adc_config_hw()
1144 …obj->resource.channel_num = 0; // Force channel to 0, since we don't use channels and the sarmux_p… in _cyhal_adc_config_hw()
1149 obj->resource = *cfg->resource; in _cyhal_adc_config_hw()
1159 obj->base = _cyhal_adc_base[obj->resource.block_num]; in _cyhal_adc_config_hw()
1160 pclk = _cyhal_adc_clock[obj->resource.block_num]; in _cyhal_adc_config_hw()
1163 obj->clock = *cfg->clock; in _cyhal_adc_config_hw()
1164 obj->dedicated_clock = false; in _cyhal_adc_config_hw()
1167 …(result = _cyhal_utils_allocate_clock(&(obj->clock), &(obj->resource), CYHAL_CLOCK_BLOCK_PERIPHERA… in _cyhal_adc_config_hw()
1169 obj->dedicated_clock = true; in _cyhal_adc_config_hw()
1175 if (CY_SYSCLK_SUCCESS != _cyhal_utils_peri_pclk_assign_divider(pclk, &(obj->clock))) in _cyhal_adc_config_hw()
1181 if(obj->dedicated_clock) in _cyhal_adc_config_hw()
1183 uint32_t source_hz = _cyhal_utils_get_peripheral_clock_frequency(&(obj->resource)); in _cyhal_adc_config_hw()
1186 … (CY_SYSCLK_SUCCESS != _cyhal_utils_peri_pclk_set_divider(pclk, &(obj->clock), div - 1)) || in _cyhal_adc_config_hw()
1187 (CY_SYSCLK_SUCCESS != _cyhal_utils_peri_pclk_enable_divider(pclk, &(obj->clock)))) in _cyhal_adc_config_hw()
1197 result = (cy_rslt_t)Cy_SAR2_Init(obj->base, cfg->config); in _cyhal_adc_config_hw()
1200 result = (cy_rslt_t)Cy_SAR_Init(obj->base, cfg->config); in _cyhal_adc_config_hw()
1207 Cy_SAR_SetVssaSarSeqCtrl(obj->base, _CYHAL_ADC_SARSEQ_STATE(true)); in _cyhal_adc_config_hw()
1208 Cy_SAR_SetVssaVminusSwitch(obj->base, _CYHAL_ADC_SWITCH_STATE(true)); in _cyhal_adc_config_hw()
1213 _cyhal_adc_update_intr_mask(obj); in _cyhal_adc_config_hw()
1214 _cyhal_adc_config_structs[obj->resource.block_num] = obj; in _cyhal_adc_config_hw()
1220 _cyhal_irq_register(_cyhal_adc_calc_channel_irq(obj->resource.block_num, i), in _cyhal_adc_config_hw()
1222 _cyhal_irq_enable(_cyhal_adc_calc_channel_irq(obj->resource.block_num, i)); in _cyhal_adc_config_hw()
1225 Cy_SAR2_Enable(obj->base); in _cyhal_adc_config_hw()
1227 …_cyhal_irq_register(_cyhal_adc_irq_n[obj->resource.block_num], CYHAL_ISR_PRIORITY_DEFAULT, _cyhal_… in _cyhal_adc_config_hw()
1228 _cyhal_irq_enable(_cyhal_adc_irq_n[obj->resource.block_num]); in _cyhal_adc_config_hw()
1229 Cy_SAR_Enable(obj->base); in _cyhal_adc_config_hw()
1234 cyhal_adc_free(obj); in _cyhal_adc_config_hw()
1278 cy_rslt_t cyhal_adc_init(cyhal_adc_t *obj, cyhal_gpio_t pin, const cyhal_clock_t *clk) in cyhal_adc_init() argument
1307 result = _cyhal_adc_config_hw(obj, &config, pin, false); in cyhal_adc_init()
1314 result = cyhal_adc_configure(obj, &_CYHAL_ADC_DEFAULT_CONFIG); in cyhal_adc_init()
1318 obj->vbg_chan_inited = false; in cyhal_adc_init()
1324 void cyhal_adc_free(cyhal_adc_t *obj) in cyhal_adc_free() argument
1326 if (NULL != obj && NULL != obj->base) in cyhal_adc_free()
1331 _cyhal_irq_free(_cyhal_adc_calc_channel_irq(obj->resource.block_num, i)); in cyhal_adc_free()
1334 _cyhal_system_irq_t irqn = _cyhal_adc_irq_n[obj->resource.block_num]; in cyhal_adc_free()
1337 _cyhal_adc_config_structs[obj->resource.block_num] = NULL; in cyhal_adc_free()
1340 rslt = cyhal_adc_disable_output(obj, CYHAL_ADC_OUTPUT_SCAN_COMPLETE); in cyhal_adc_free()
1342 if (CYHAL_TRIGGER_CPUSS_ZERO != obj->source) in cyhal_adc_free()
1344 rslt = cyhal_adc_disconnect_digital(obj, obj->source, CYHAL_ADC_INPUT_START_SCAN); in cyhal_adc_free()
1350 Cy_SAR_SetVssaSarSeqCtrl(obj->base, _CYHAL_ADC_SARSEQ_STATE(false)); in cyhal_adc_free()
1351 Cy_SAR_SetVssaVminusSwitch(obj->base, _CYHAL_ADC_SWITCH_STATE(false)); in cyhal_adc_free()
1353 Cy_SAR_StopConvert(obj->base); in cyhal_adc_free()
1356 if(false == obj->owned_by_configurator) in cyhal_adc_free()
1359 Cy_SAR_Disable(obj->base); in cyhal_adc_free()
1361 Cy_SAR2_Disable(obj->base); in cyhal_adc_free()
1364 if(obj->dedicated_clock) in cyhal_adc_free()
1366 … _cyhal_utils_peri_pclk_disable_divider(_cyhal_adc_clock[obj->resource.block_num], &(obj->clock)); in cyhal_adc_free()
1367 cyhal_clock_free(&obj->clock); in cyhal_adc_free()
1372 _cyhal_utils_release_if_used(&(obj->ext_vref)); in cyhal_adc_free()
1373 _cyhal_utils_release_if_used(&(obj->bypass_pin)); in cyhal_adc_free()
1375 cyhal_hwmgr_free(&obj->resource); in cyhal_adc_free()
1377 obj->base = NULL; in cyhal_adc_free()
1382 cy_rslt_t _cyhal_adc_populate_acquisition_timers(cyhal_adc_t* obj) in _cyhal_adc_populate_acquisition_timers() argument
1386 CY_UNUSED_PARAMETER(obj); in _cyhal_adc_populate_acquisition_timers()
1390 cy_rslt_t _cyhal_adc_apply_channel_configs(cyhal_adc_t* obj, cy_stc_sar2_channel_config_t* channel_… in _cyhal_adc_apply_channel_configs() argument
1393 uint32_t clock_frequency_hz = cyhal_clock_get_frequency(&(obj->clock)); in _cyhal_adc_apply_channel_configs()
1409 Cy_SAR2_Channel_DeInit(obj->base, i); in _cyhal_adc_apply_channel_configs()
1416 channel_configs[i].triggerSelection = obj->continuous_scanning ? in _cyhal_adc_apply_channel_configs()
1420 if(obj->channel_config[i]->avg_enabled) in _cyhal_adc_apply_channel_configs()
1423 channel_configs[i].averageCount = obj->average_count; in _cyhal_adc_apply_channel_configs()
1429 if(obj->average_is_accumulate) in _cyhal_adc_apply_channel_configs()
1435 … for(rightShift = 31u; (0u == (obj->average_count & 1u << rightShift)); --rightShift) { } in _cyhal_adc_apply_channel_configs()
1447 …(uint16_t)((obj->channel_config[i]->minimum_acquisition_ns + (clock_period_ns - 1)) / clock_period… in _cyhal_adc_apply_channel_configs()
1461 cy_rslt_t result2 = Cy_SAR2_Channel_Init(obj->base, i, &channel_configs[i]); in _cyhal_adc_apply_channel_configs()
1471 …result = Cy_SAR2_SetGenericTriggerOutput(PASS0_EPASS_MMIO, obj->resource.block_num, 0u, last_enabl… in _cyhal_adc_apply_channel_configs()
1478 void _cyhal_adc_channel_update_config(cyhal_adc_channel_t* obj, cy_stc_sar2_channel_config_t *pdl_c… in _cyhal_adc_channel_update_config() argument
1488 obj->avg_enabled = cfg->enable_averaging; in _cyhal_adc_channel_update_config()
1495 cy_rslt_t _cyhal_adc_populate_acquisition_timers(cyhal_adc_t* obj) in _cyhal_adc_populate_acquisition_timers() argument
1502 uint32_t clock_frequency_hz = cyhal_clock_get_frequency(&(obj->clock)); in _cyhal_adc_populate_acquisition_timers()
1516 cyhal_adc_channel_t* chan_config = obj->channel_config[channel]; in _cyhal_adc_populate_acquisition_timers()
1567 …obj->base->SAMPLE_TIME01 = (uint32_t) (((uint32_t)sample_timer_clocks[0] << SAR_SAMPLE_TIME01_SAMP… in _cyhal_adc_populate_acquisition_timers()
1569 …obj->base->SAMPLE_TIME23 = (uint32_t) (((uint32_t)sample_timer_clocks[2] << SAR_SAMPLE_TIME23_SAMP… in _cyhal_adc_populate_acquisition_timers()
1574 obj->base->CHAN_CONFIG[i] &= ~SAR_CHAN_CONFIG_SAMPLE_TIME_SEL_Msk; in _cyhal_adc_populate_acquisition_timers()
1575 … obj->base->CHAN_CONFIG[i] |= (uint32_t)assigned_timer[i] << SAR_CHAN_CONFIG_SAMPLE_TIME_SEL_Pos; in _cyhal_adc_populate_acquisition_timers()
1583 cy_rslt_t cyhal_adc_configure(cyhal_adc_t *obj, const cyhal_adc_config_t *config) in cyhal_adc_configure() argument
1586 obj->continuous_scanning = config->continuous_scanning; in cyhal_adc_configure()
1606 … obj->average_is_accumulate = (0u != (config->average_mode_flags & CYHAL_ADC_AVG_MODE_ACCUMULATE)); in cyhal_adc_configure()
1607 if(false == obj->average_is_accumulate) in cyhal_adc_configure()
1628 if((NC == obj->ext_vref) && (config->ext_vref != obj->bypass_pin)) in cyhal_adc_configure()
1632 …of(cyhal_pin_map_pass_sar_ext_vref0)/sizeof(cyhal_pin_map_pass_sar_ext_vref0[0]), &(obj->resource), in cyhal_adc_configure()
1646 obj->ext_vref = config->ext_vref; in cyhal_adc_configure()
1652 if(NC != obj->ext_vref) // We used to have an external vref pin - free it in cyhal_adc_configure()
1655 if(obj->ext_vref == obj->bypass_pin) in cyhal_adc_configure()
1657 obj->bypass_pin = NC; in cyhal_adc_configure()
1661 cyhal_gpio_free(obj->ext_vref); in cyhal_adc_configure()
1662 obj->ext_vref = NC; in cyhal_adc_configure()
1679 …of(cyhal_pin_map_pass_sar_ext_vref0)/sizeof(cyhal_pin_map_pass_sar_ext_vref0[0]), &(obj->resource), in cyhal_adc_configure()
1694 obj->bypass_pin = config->bypass_pin; in cyhal_adc_configure()
1700 if((NC != obj->bypass_pin) && (obj->ext_vref != obj->bypass_pin)) in cyhal_adc_configure()
1702 cyhal_gpio_free(obj->bypass_pin); in cyhal_adc_configure()
1703 obj->bypass_pin = NC; in cyhal_adc_configure()
1731 obj->resolution = config->resolution; in cyhal_adc_configure()
1733 _cyhal_adc_extract_channel_conf(obj, chan_configs); in cyhal_adc_configure()
1746 pdl_config.chanEn = obj->base->CHAN_EN; in cyhal_adc_configure()
1758 pdl_config.chanConfig[i] = obj->base->CHAN_CONFIG[i]; in cyhal_adc_configure()
1761 Cy_SAR_Disable(obj->base); in cyhal_adc_configure()
1762 Cy_SAR_DeInit(obj->base, false); in cyhal_adc_configure()
1763 result = (cy_rslt_t)Cy_SAR_Init(obj->base, &pdl_config); in cyhal_adc_configure()
1764 _cyhal_adc_populate_acquisition_timers(obj); in cyhal_adc_configure()
1765 Cy_SAR_SetInterruptMask(obj->base, CY_SAR_INTR_EOS); in cyhal_adc_configure()
1766 Cy_SAR_Enable(obj->base); in cyhal_adc_configure()
1772 obj->average_count = config->average_count; in cyhal_adc_configure()
1773 … obj->average_is_accumulate = (0u != (config->average_mode_flags & CYHAL_ADC_AVG_MODE_ACCUMULATE)); in cyhal_adc_configure()
1776 _cyhal_adc_extract_channel_conf(obj, channel_configs); in cyhal_adc_configure()
1777 result = _cyhal_adc_apply_channel_configs(obj, channel_configs); in cyhal_adc_configure()
1781 if(obj->continuous_scanning) in cyhal_adc_configure()
1783 obj->conversion_complete = false; in cyhal_adc_configure()
1784 _cyhal_adc_update_intr_mask(obj); in cyhal_adc_configure()
1785 _cyhal_adc_start_convert(obj); in cyhal_adc_configure()
1790 cy_rslt_t cyhal_adc_set_power(cyhal_adc_t *obj, cyhal_power_level_t power) in cyhal_adc_set_power() argument
1796 Cy_SAR_Disable(obj->base); in cyhal_adc_set_power()
1798 Cy_SAR2_Disable(obj->base); in cyhal_adc_set_power()
1804 Cy_SAR_Enable(obj->base); in cyhal_adc_set_power()
1806 Cy_SAR2_Enable(obj->base); in cyhal_adc_set_power()
1812 static uint16_t _cyhal_adc_get_average_count(cyhal_adc_t* obj, int channel_idx) in _cyhal_adc_get_average_count() argument
1815 return _FLD2VAL(PASS_SAR_CH_POST_CTL_AVG_CNT, obj->base->CH[channel_idx].POST_CTL); in _cyhal_adc_get_average_count()
1820 …bool is_interleaved = CY_SAR_AVG_MODE_INTERLEAVED == (SAR_SAMPLE_CTRL(obj->base) & SAR_SAMPLE_CTRL… in _cyhal_adc_get_average_count()
1827 …average_count = (SAR_SAMPLE_CTRL(obj->base) & SAR_SAMPLE_CTRL_AVG_CNT_Msk) >> SAR_SAMPLE_CTRL_AVG_… in _cyhal_adc_get_average_count()
1831 return (obj->base->CHAN_CONFIG[channel_idx] & SAR_CHAN_CONFIG_AVG_EN_Msk) ? average_count : 1; in _cyhal_adc_get_average_count()
1836 static void _cyhal_adc_get_sample_times(cyhal_adc_t* obj, uint32_t* min_acquisition_ns, uint32_t* c… in _cyhal_adc_get_sample_times() argument
1841 cyhal_adc_channel_t* chan_config = obj->channel_config[i]; in _cyhal_adc_get_sample_times()
1843 if((NULL != chan_config) && (0u != (obj->base->CH[i].ENABLE))) in _cyhal_adc_get_sample_times()
1845 if((NULL != chan_config) && (0u != (obj->base->CHAN_EN & ((uint32_t)1U << i)))) in _cyhal_adc_get_sample_times()
1850 uint16_t average_count = _cyhal_adc_get_average_count(obj, i); in _cyhal_adc_get_sample_times()
1860 uint32_t _cyhal_adc_calc_optimal_clock_rate(cyhal_adc_t* obj, uint32_t target_sample_hz) in _cyhal_adc_calc_optimal_clock_rate() argument
1868 _cyhal_adc_get_sample_times(obj, &total_acquisition_ns, &conversion_clock_cycles); in _cyhal_adc_calc_optimal_clock_rate()
1895 uint32_t _cyhal_adc_compute_actual_sample_rate(cyhal_adc_t* obj) in _cyhal_adc_compute_actual_sample_rate() argument
1898 uint32_t clock_frequency_hz = cyhal_clock_get_frequency(&obj->clock); in _cyhal_adc_compute_actual_sample_rate()
1908 … uint32_t sample_count = _FLD2VAL(PASS_SAR_CH_SAMPLE_CTL_SAMPLE_TIME, obj->base->CH[i].SAMPLE_CTL); in _cyhal_adc_compute_actual_sample_rate()
1914 …(obj->base->SAMPLE_TIME01 & SAR_SAMPLE_TIME01_SAMPLE_TIME0_Msk) >> SAR_SAMPLE_TIME01_SAMPLE_TIME0_… in _cyhal_adc_compute_actual_sample_rate()
1915 …(obj->base->SAMPLE_TIME01 & SAR_SAMPLE_TIME01_SAMPLE_TIME1_Msk) >> SAR_SAMPLE_TIME01_SAMPLE_TIME1_… in _cyhal_adc_compute_actual_sample_rate()
1916 …(obj->base->SAMPLE_TIME23 & SAR_SAMPLE_TIME23_SAMPLE_TIME2_Msk) >> SAR_SAMPLE_TIME23_SAMPLE_TIME2_… in _cyhal_adc_compute_actual_sample_rate()
1917 …(obj->base->SAMPLE_TIME23 & SAR_SAMPLE_TIME23_SAMPLE_TIME3_Msk) >> SAR_SAMPLE_TIME23_SAMPLE_TIME3_… in _cyhal_adc_compute_actual_sample_rate()
1922 if(0u == (obj->base->CHAN_EN & ((uint32_t)1u << i))) in _cyhal_adc_compute_actual_sample_rate()
1927 …(obj->base->CHAN_CONFIG[i] & SAR_CHAN_CONFIG_SAMPLE_TIME_SEL_Msk) >> SAR_CHAN_CONFIG_SAMPLE_TIME_S… in _cyhal_adc_compute_actual_sample_rate()
1932 sample_time_ns *= _cyhal_adc_get_average_count(obj, i); in _cyhal_adc_compute_actual_sample_rate()
1942 cy_rslt_t cyhal_adc_set_sample_rate(cyhal_adc_t* obj, uint32_t desired_sample_rate_hz, uint32_t* ac… in cyhal_adc_set_sample_rate() argument
1946 if(obj->dedicated_clock) in cyhal_adc_set_sample_rate()
1948 uint32_t desired_hz = _cyhal_adc_calc_optimal_clock_rate(obj, desired_sample_rate_hz); in cyhal_adc_set_sample_rate()
1949 result = cyhal_clock_set_frequency(&(obj->clock), desired_hz, NULL); in cyhal_adc_set_sample_rate()
1954 result = _cyhal_adc_populate_acquisition_timers(obj); in cyhal_adc_set_sample_rate()
1959 *achieved_sample_rate_hz = _cyhal_adc_compute_actual_sample_rate(obj); in cyhal_adc_set_sample_rate()
1975 void _cyhal_adc_channel_update_config(cyhal_adc_channel_t* obj, const cyhal_adc_channel_config_t* c… in _cyhal_adc_channel_update_config() argument
1977 uint32_t existing_config = obj->adc->base->CHAN_CONFIG[obj->channel_idx]; in _cyhal_adc_channel_update_config()
1991 bool resolution_override = (obj->adc->resolution != _CYHAL_ADC_RESOLUTION); in _cyhal_adc_channel_update_config()
1995 obj->adc->base->CHAN_CONFIG[obj->channel_idx] = result; in _cyhal_adc_channel_update_config()
1998 void _cyhal_adc_channel_set_pin_config(cyhal_adc_channel_t* obj, cyhal_gpio_t vplus, cyhal_gpio_t v… in _cyhal_adc_channel_set_pin_config() argument
2020 obj->adc->base->CHAN_CONFIG[obj->channel_idx] = result; in _cyhal_adc_channel_set_pin_config()
2023 static void _cyhal_adc_update_chan_offset(cyhal_adc_channel_t* obj) in _cyhal_adc_update_chan_offset() argument
2031 bool single_ended = Cy_SAR_IsChannelSingleEnded(obj->adc->base, obj->channel_idx); in _cyhal_adc_update_chan_offset()
2037 bool neg_sel_vref = (neg_sel_vref_val == (obj->adc->base->CTRL & SAR_CTRL_NEG_SEL_Msk)); in _cyhal_adc_update_chan_offset()
2041 Cy_SAR_SetOffset(obj->channel_idx, offset); in _cyhal_adc_update_chan_offset()
2043 Cy_SAR_SetChannelOffset(obj->adc->base, obj->channel_idx, offset); in _cyhal_adc_update_chan_offset()
2048 cy_rslt_t cyhal_adc_channel_init_diff(cyhal_adc_channel_t *obj, cyhal_adc_t* adc, cyhal_gpio_t vplu… in cyhal_adc_channel_init_diff() argument
2050 CY_ASSERT(obj != NULL); in cyhal_adc_channel_init_diff()
2055 memset(obj, 0, sizeof(cyhal_adc_channel_t)); in cyhal_adc_channel_init_diff()
2056 obj->vplus = NC; in cyhal_adc_channel_init_diff()
2058 obj->vminus = NC; in cyhal_adc_channel_init_diff()
2096 obj->adc = adc; in cyhal_adc_channel_init_diff()
2097 obj->channel_idx = chosen_channel; in cyhal_adc_channel_init_diff()
2098 obj->adc->channel_config[chosen_channel] = obj; in cyhal_adc_channel_init_diff()
2099 obj->minimum_acquisition_ns = (cfg->min_acquisition_ns > _CYHAL_ADC_MIN_ACQUISITION_TIME_NS) in cyhal_adc_channel_init_diff()
2132 obj->vplus = vplus; in cyhal_adc_channel_init_diff()
2142 obj->vminus = vminus; in cyhal_adc_channel_init_diff()
2144 result = _cyhal_adc_populate_acquisition_timers(obj->adc); in cyhal_adc_channel_init_diff()
2151 _cyhal_adc_extract_channel_conf(obj->adc, channel_configs); in cyhal_adc_channel_init_diff()
2152 channel_configs[obj->channel_idx] = _CYHAL_ADC_DEFAULT_PDL_CHAN_CONFIG; in cyhal_adc_channel_init_diff()
2153 channel_configs[obj->channel_idx].pinAddress = in cyhal_adc_channel_init_diff()
2164 _cyhal_adc_vbg_channels[block_idx].minimum_acquisition_ns = obj->minimum_acquisition_ns; in cyhal_adc_channel_init_diff()
2169 … _cyhal_adc_channel_update_config(obj, &channel_configs[_CYHAL_ADC_VBG_CHANNEL_IDX], cfg); in cyhal_adc_channel_init_diff()
2175 _cyhal_adc_channel_update_config(obj, &channel_configs[obj->channel_idx], cfg); in cyhal_adc_channel_init_diff()
2176 result = _cyhal_adc_apply_channel_configs(obj->adc, channel_configs); in cyhal_adc_channel_init_diff()
2181 _CYHAL_ADC_SET_SWITCH(obj->adc->base, fw_ctrl_plus, true); in cyhal_adc_channel_init_diff()
2182 Cy_SAR_SetSwitchSarSeqCtrl(obj->adc->base, mux_ctrl_plus, _CYHAL_ADC_SARSEQ_STATE(true)); in cyhal_adc_channel_init_diff()
2189 _CYHAL_ADC_SET_SWITCH(obj->adc->base, fw_ctrl_minus, true); in cyhal_adc_channel_init_diff()
2190 … Cy_SAR_SetSwitchSarSeqCtrl(obj->adc->base, mux_ctrl_minus, _CYHAL_ADC_SARSEQ_STATE(true)); in cyhal_adc_channel_init_diff()
2193 _cyhal_adc_channel_set_pin_config(obj, obj->vplus, obj->vminus); in cyhal_adc_channel_init_diff()
2194 result = cyhal_adc_channel_configure(obj, cfg); in cyhal_adc_channel_init_diff()
2200 cyhal_adc_channel_free(obj); in cyhal_adc_channel_init_diff()
2206 cy_rslt_t cyhal_adc_channel_configure(cyhal_adc_channel_t *obj, const cyhal_adc_channel_config_t *c… in cyhal_adc_channel_configure() argument
2208 CY_ASSERT(NULL != obj); in cyhal_adc_channel_configure()
2210 obj->minimum_acquisition_ns = (config->min_acquisition_ns > _CYHAL_ADC_MIN_ACQUISITION_TIME_NS) in cyhal_adc_channel_configure()
2215 _cyhal_adc_extract_channel_conf(obj->adc, channel_configs); in cyhal_adc_channel_configure()
2216 _cyhal_adc_channel_update_config(obj, &channel_configs[obj->channel_idx], config); in cyhal_adc_channel_configure()
2217 return _cyhal_adc_apply_channel_configs(obj->adc, channel_configs); in cyhal_adc_channel_configure()
2219 _cyhal_adc_channel_update_config(obj, config); in cyhal_adc_channel_configure()
2222 obj->adc->base->CHAN_EN |= 1u << obj->channel_idx; in cyhal_adc_channel_configure()
2226 obj->adc->base->CHAN_EN &= ~(1u << obj->channel_idx); in cyhal_adc_channel_configure()
2228 _cyhal_adc_update_chan_offset(obj); in cyhal_adc_channel_configure()
2229 return _cyhal_adc_populate_acquisition_timers(obj->adc); in cyhal_adc_channel_configure()
2233 void cyhal_adc_channel_free(cyhal_adc_channel_t *obj) in cyhal_adc_channel_free() argument
2235 if(obj->adc != NULL) in cyhal_adc_channel_free()
2238 obj->adc->channel_config[obj->channel_idx] = NULL; in cyhal_adc_channel_free()
2241 if(false == obj->adc->owned_by_configurator) in cyhal_adc_channel_free()
2243 if(NC != obj->vplus) in cyhal_adc_channel_free()
2245 uint32_t fw_ctrl_plus = _cyhal_adc_get_fw_switch_control(obj->vplus, true); in cyhal_adc_channel_free()
2246 uint32_t mux_ctrl_plus = _cyhal_adc_get_mux_switch_control(obj->vplus); in cyhal_adc_channel_free()
2248 _CYHAL_ADC_SET_SWITCH(obj->adc->base, fw_ctrl_plus, false); in cyhal_adc_channel_free()
2249 … Cy_SAR_SetSwitchSarSeqCtrl(obj->adc->base, mux_ctrl_plus, _CYHAL_ADC_SARSEQ_STATE(false)); in cyhal_adc_channel_free()
2252 if(NC != obj->vminus) in cyhal_adc_channel_free()
2254 uint32_t mux_ctrl_minus = _cyhal_adc_get_mux_switch_control(obj->vminus); in cyhal_adc_channel_free()
2255 uint32_t fw_ctrl_minus = _cyhal_adc_get_fw_switch_control(obj->vminus, false); in cyhal_adc_channel_free()
2257 _CYHAL_ADC_SET_SWITCH(obj->adc->base, fw_ctrl_minus, false); in cyhal_adc_channel_free()
2258 … Cy_SAR_SetSwitchSarSeqCtrl(obj->adc->base, mux_ctrl_minus, _CYHAL_ADC_SARSEQ_STATE(false)); in cyhal_adc_channel_free()
2261 obj->adc->base->CHAN_CONFIG[obj->channel_idx] = 0; in cyhal_adc_channel_free()
2263 Cy_SAR2_Channel_DeInit(obj->adc->base, obj->channel_idx); in cyhal_adc_channel_free()
2266 if(false == obj->adc->owned_by_configurator) in cyhal_adc_channel_free()
2268 _cyhal_utils_release_if_used(&(obj->vplus)); in cyhal_adc_channel_free()
2270 _cyhal_utils_release_if_used(&(obj->vminus)); in cyhal_adc_channel_free()
2275 if (obj->adc->vbg_chan_inited) in cyhal_adc_channel_free()
2282 if(NULL != obj->adc->channel_config[chan_idx]) in cyhal_adc_channel_free()
2296 Cy_SAR2_Channel_DeInit(obj->adc->base, _CYHAL_ADC_VBG_CHANNEL_IDX); in cyhal_adc_channel_free()
2297 obj->adc->vbg_chan_inited = false; in cyhal_adc_channel_free()
2302 obj->adc = NULL; in cyhal_adc_channel_free()
2306 uint16_t cyhal_adc_read_u16(const cyhal_adc_channel_t *obj) in cyhal_adc_read_u16() argument
2308 int32_t signed_result = cyhal_adc_read(obj); in cyhal_adc_read_u16()
2311 …const uint8_t RESULT_SCALING_FACTOR = UINT16_MAX / ((1 << obj->adc->resolution) - 1); // 12-bit SA… in cyhal_adc_read_u16()
2330 int32_t cyhal_adc_read(const cyhal_adc_channel_t *obj) in cyhal_adc_read() argument
2335 …bool isInterleaved = (CY_SAR_AVG_MODE_INTERLEAVED == (SAR_SAMPLE_CTRL(obj->adc->base) & SAR_SAMPLE… in cyhal_adc_read()
2342 if(!obj->adc->continuous_scanning) in cyhal_adc_read()
2347 _cyhal_adc_extract_channel_conf(obj->adc, channel_configs); in cyhal_adc_read()
2352 … channel_configs[i].channelHwEnable = (obj->channel_idx == i) || (_CYHAL_ADC_VBG_CHANNEL_IDX == i); in cyhal_adc_read()
2354 _cyhal_adc_apply_channel_configs(obj->adc, channel_configs); in cyhal_adc_read()
2356 …bool isChannelAveraging = (obj->adc->base->CHAN_CONFIG[obj->channel_idx] & SAR_CHAN_CONFIG_AVG_EN_… in cyhal_adc_read()
2358 old_en_mask = SAR_CHAN_EN(obj->adc->base); in cyhal_adc_read()
2359 Cy_SAR_SetChanMask(obj->adc->base, (uint32_t) (1U << obj->channel_idx)); in cyhal_adc_read()
2362 obj->adc->conversion_complete = false; in cyhal_adc_read()
2364 obj->adc->stop_after_scan = isChannelInterleaved; in cyhal_adc_read()
2366 _cyhal_adc_update_intr_mask(obj->adc); in cyhal_adc_read()
2377 Cy_SAR2_Channel_SoftwareTrigger(obj->adc->base, _cyhal_adc_first_enabled(obj->adc)); in cyhal_adc_read()
2379 …Cy_SAR_StartConvert(obj->adc->base, (isChannelInterleaved) ? CY_SAR_START_CONVERT_CONTINUOUS : CY_… in cyhal_adc_read()
2387 while(!obj->adc->conversion_complete) { } in cyhal_adc_read()
2392 …int32_t result = (int32_t)(Cy_SAR2_Channel_GetResult(obj->adc->base, obj->channel_idx, NULL /* We … in cyhal_adc_read()
2393 …obj->adc->vbg_last_value = Cy_SAR2_Channel_GetResult(obj->adc->base, _CYHAL_ADC_VBG_CHANNEL_IDX, N… in cyhal_adc_read()
2395 int32_t result = Cy_SAR_GetResult32(obj->adc->base, obj->channel_idx); in cyhal_adc_read()
2398 if(!obj->adc->continuous_scanning) in cyhal_adc_read()
2405 _cyhal_adc_apply_channel_configs(obj->adc, channel_configs); in cyhal_adc_read()
2407 Cy_SAR_SetChanMask(obj->adc->base, old_en_mask); in cyhal_adc_read()
2414 int32_t cyhal_adc_read_uv(const cyhal_adc_channel_t *obj) in cyhal_adc_read_uv() argument
2416 CY_ASSERT(NULL != obj); in cyhal_adc_read_uv()
2418 int32_t counts = cyhal_adc_read(obj); in cyhal_adc_read_uv()
2419 return _cyhal_adc_counts_to_uvolts(obj->adc, obj->channel_idx, counts); in cyhal_adc_read_uv()
2422 void _cyhal_adc_start_async_read(cyhal_adc_t* obj, size_t num_scan, int32_t* result_list) in _cyhal_adc_start_async_read() argument
2424 CY_ASSERT(NULL == obj->async_buff_next); /* Transfer already in progress */ in _cyhal_adc_start_async_read()
2426 obj->async_scans_remaining = num_scan; in _cyhal_adc_start_async_read()
2427 obj->async_buff_next = obj->async_buff_orig = result_list; in _cyhal_adc_start_async_read()
2428 _cyhal_adc_update_intr_mask(obj); in _cyhal_adc_start_async_read()
2430 if(false == obj->continuous_scanning) in _cyhal_adc_start_async_read()
2432 _cyhal_adc_start_convert(obj); in _cyhal_adc_start_async_read()
2437 cy_rslt_t cyhal_adc_read_async(cyhal_adc_t* obj, size_t num_scan, int32_t* result_list) in cyhal_adc_read_async() argument
2439 CY_ASSERT(NULL != obj); in cyhal_adc_read_async()
2440 obj->async_transfer_in_uv = false; in cyhal_adc_read_async()
2441 _cyhal_adc_start_async_read(obj, num_scan, result_list); in cyhal_adc_read_async()
2445 cy_rslt_t cyhal_adc_read_async_uv(cyhal_adc_t* obj, size_t num_scan, int32_t* result_list) in cyhal_adc_read_async_uv() argument
2447 CY_ASSERT(NULL != obj); in cyhal_adc_read_async_uv()
2448 obj->async_transfer_in_uv = true; in cyhal_adc_read_async_uv()
2449 _cyhal_adc_start_async_read(obj, num_scan, result_list); in cyhal_adc_read_async_uv()
2453 cy_rslt_t cyhal_adc_set_async_mode(cyhal_adc_t *obj, cyhal_async_mode_t mode, uint8_t dma_priority) in cyhal_adc_set_async_mode() argument
2455 CY_ASSERT(NULL != obj); in cyhal_adc_set_async_mode()
2456 CY_ASSERT(NULL == obj->async_buff_next); /* Can't swap mode while a transfer is running */ in cyhal_adc_set_async_mode()
2463 … result = cyhal_dma_init(&(obj->dma), CYHAL_DMA_PRIORITY_DEFAULT, CYHAL_DMA_DIRECTION_PERIPH2MEM); in cyhal_adc_set_async_mode()
2466 cyhal_dma_register_callback(&(obj->dma), &_cyhal_adc_dma_handler, obj); in cyhal_adc_set_async_mode()
2467 cyhal_dma_enable_event(&(obj->dma), CYHAL_DMA_TRANSFER_COMPLETE, dma_priority, true); in cyhal_adc_set_async_mode()
2478 if(CYHAL_RSC_INVALID != obj->dma.resource.type) in cyhal_adc_set_async_mode()
2480 cyhal_dma_free(&obj->dma); in cyhal_adc_set_async_mode()
2481 obj->dma.resource.type = CYHAL_RSC_INVALID; in cyhal_adc_set_async_mode()
2488 obj->async_mode = mode; in cyhal_adc_set_async_mode()
2493 void cyhal_adc_register_callback(cyhal_adc_t *obj, cyhal_adc_event_callback_t callback, void *callb… in cyhal_adc_register_callback() argument
2495 CY_ASSERT(NULL != obj); in cyhal_adc_register_callback()
2498 obj->callback_data.callback = (cy_israddress) callback; in cyhal_adc_register_callback()
2499 obj->callback_data.callback_arg = callback_arg; in cyhal_adc_register_callback()
2503 void cyhal_adc_enable_event(cyhal_adc_t *obj, cyhal_adc_event_t event, uint8_t intr_priority, bool … in cyhal_adc_enable_event() argument
2507 obj->user_enabled_events |= event; in cyhal_adc_enable_event()
2511 obj->user_enabled_events &= ~event; in cyhal_adc_enable_event()
2514 _cyhal_adc_update_intr_mask(obj); in cyhal_adc_enable_event()
2519 _cyhal_system_irq_t irqn = _cyhal_adc_calc_channel_irq(obj->resource.block_num, i); in cyhal_adc_enable_event()
2523 _cyhal_system_irq_t irqn = _cyhal_adc_irq_n[obj->resource.block_num]; in cyhal_adc_enable_event()
2534 cy_rslt_t cyhal_adc_connect_digital(cyhal_adc_t *obj, cyhal_source_t source, cyhal_adc_input_t inpu… in cyhal_adc_connect_digital() argument
2539 Cy_SAR_SetConvertMode(obj->base, CY_SAR_TRIGGER_MODE_FW_AND_HWEDGE); in cyhal_adc_connect_digital()
2541 cyhal_dest_t dest = _cyhal_adc_calculate_dest(obj->resource.block_num); in cyhal_adc_connect_digital()
2548 cy_rslt_t cyhal_adc_enable_output(cyhal_adc_t *obj, cyhal_adc_output_t output, cyhal_source_t *sour… in cyhal_adc_enable_output() argument
2553 SAR_SAMPLE_CTRL(obj->base) |= SAR_SAMPLE_CTRL_EOS_DSI_OUT_EN_Msk; in cyhal_adc_enable_output()
2555 SAR_SAMPLE_CTRL(obj->base) |= SAR_SAMPLE_CTRL_TRIGGER_OUT_EN_Msk; in cyhal_adc_enable_output()
2557 *source = _cyhal_adc_calculate_source(obj); in cyhal_adc_enable_output()
2564 cy_rslt_t cyhal_adc_disconnect_digital(cyhal_adc_t *obj, cyhal_source_t source, cyhal_adc_input_t … in cyhal_adc_disconnect_digital() argument
2570 Cy_SAR_SetConvertMode(obj->base, CY_SAR_TRIGGER_MODE_FW_ONLY); in cyhal_adc_disconnect_digital()
2572 cyhal_dest_t dest = _cyhal_adc_calculate_dest(obj->resource.block_num); in cyhal_adc_disconnect_digital()
2579 cy_rslt_t cyhal_adc_disable_output(cyhal_adc_t *obj, cyhal_adc_output_t output) in cyhal_adc_disable_output() argument
2587 SAR_SAMPLE_CTRL(obj->base) &= ~SAR_SAMPLE_CTRL_EOS_DSI_OUT_EN_Msk; in cyhal_adc_disable_output()
2590 CY_UNUSED_PARAMETER(obj); in cyhal_adc_disable_output()
2592 SAR_SAMPLE_CTRL(obj->base) &= ~SAR_SAMPLE_CTRL_TRIGGER_OUT_EN_Msk; in cyhal_adc_disable_output()