13 #include "adc_ctrl_regs.h"
15 static_assert(ADC_CTRL_PARAM_NUM_ADC_CHANNEL == 2,
16 "Expected two ADC Controller channels.");
17 static_assert(ADC_CTRL_PARAM_NUM_ADC_FILTER == 8,
18 "Expected eight ADC Controller filters.");
19 static_assert(ADC_CTRL_ADC_CHN0_FILTER_CTL_MIN_V_FIELD_WIDTH == 10,
20 "Expected channel-0 filter min-voltage field to be 10 bits.");
21 static_assert(ADC_CTRL_ADC_CHN1_FILTER_CTL_MIN_V_FIELD_WIDTH == 10,
22 "Expected channel-1 filter min-voltage field to be 10 bits.");
23 static_assert(ADC_CTRL_ADC_CHN0_FILTER_CTL_MAX_V_FIELD_WIDTH == 10,
24 "Expected channel-0 filter max-voltage field to be 10 bits.");
25 static_assert(ADC_CTRL_ADC_CHN1_FILTER_CTL_MAX_V_FIELD_WIDTH == 10,
26 "Expected channel-1 filter max-voltage field to be 10 bits.");
30 if (adc_ctrl == NULL ||
38 uint32_t en_ctrl_reg = ADC_CTRL_ADC_EN_CTL_REG_RESVAL;
39 uint32_t pd_ctrl_reg = ADC_CTRL_ADC_PD_CTL_REG_RESVAL;
40 uint32_t lp_sample_ctrl_reg = ADC_CTRL_ADC_LP_SAMPLE_CTL_REG_RESVAL;
41 uint32_t np_sample_ctrl_reg = ADC_CTRL_ADC_SAMPLE_CTL_REG_RESVAL;
43 switch (config.
mode) {
46 ADC_CTRL_ADC_PD_CTL_LP_MODE_BIT,
true);
48 pd_ctrl_reg, ADC_CTRL_ADC_PD_CTL_WAKEUP_TIME_FIELD,
51 lp_sample_ctrl_reg, ADC_CTRL_ADC_LP_SAMPLE_CTL_LP_SAMPLE_CNT_FIELD,
56 np_sample_ctrl_reg, ADC_CTRL_ADC_SAMPLE_CTL_NP_SAMPLE_CNT_FIELD,
61 en_ctrl_reg, ADC_CTRL_ADC_EN_CTL_ONESHOT_MODE_BIT,
true);
72 mmio_region_write32(adc_ctrl->
base_addr, ADC_CTRL_ADC_EN_CTL_REG_OFFSET,
74 mmio_region_write32(adc_ctrl->
base_addr, ADC_CTRL_ADC_PD_CTL_REG_OFFSET,
77 ADC_CTRL_ADC_LP_SAMPLE_CTL_REG_OFFSET,
79 mmio_region_write32(adc_ctrl->
base_addr, ADC_CTRL_ADC_SAMPLE_CTL_REG_OFFSET,
89 if (adc_ctrl == NULL || config.
min_voltage > 1023 ||
94 ptrdiff_t filter_ctrl_reg_offset;
100 #define DIF_ADC_CTRL_CHANNEL0_FILTER_CONFIG_CASE_(filter_) \
101 case kDifAdcCtrlFilter##filter_: \
102 filter_ctrl_reg_offset = \
103 ADC_CTRL_ADC_CHN0_FILTER_CTL_##filter_##_REG_OFFSET; \
104 min_voltage_field = \
105 ADC_CTRL_ADC_CHN0_FILTER_CTL_##filter_##_MIN_V_##filter_##_FIELD; \
106 max_voltage_field = \
107 ADC_CTRL_ADC_CHN0_FILTER_CTL_##filter_##_MAX_V_##filter_##_FIELD; \
109 ADC_CTRL_ADC_CHN0_FILTER_CTL_##filter_##_COND_##filter_##_BIT; \
110 enable_bit = ADC_CTRL_ADC_CHN0_FILTER_CTL_##filter_##_EN_##filter_##_BIT; \
113 #define DIF_ADC_CTRL_CHANNEL1_FILTER_CONFIG_CASE_(filter_) \
114 case kDifAdcCtrlFilter##filter_: \
115 filter_ctrl_reg_offset = \
116 ADC_CTRL_ADC_CHN1_FILTER_CTL_##filter_##_REG_OFFSET; \
117 min_voltage_field = \
118 ADC_CTRL_ADC_CHN1_FILTER_CTL_##filter_##_MIN_V_##filter_##_FIELD; \
119 max_voltage_field = \
120 ADC_CTRL_ADC_CHN1_FILTER_CTL_##filter_##_MAX_V_##filter_##_FIELD; \
122 ADC_CTRL_ADC_CHN1_FILTER_CTL_##filter_##_COND_##filter_##_BIT; \
123 enable_bit = ADC_CTRL_ADC_CHN1_FILTER_CTL_##filter_##_EN_##filter_##_BIT; \
127 case kDifAdcCtrlChannel0:
134 case kDifAdcCtrlChannel1:
145 #undef DIF_ADC_CTRL_CHANNEL0_FILTER_CONFIG_CASE_
146 #undef DIF_ADC_CTRL_CHANNEL1_FILTER_CONFIG_CASE_
149 uint32_t filter_ctrl_reg =
157 mmio_region_write32(adc_ctrl->
base_addr, filter_ctrl_reg_offset,
161 uint32_t wakeup_ctrl_reg = mmio_region_read32(
162 adc_ctrl->
base_addr, ADC_CTRL_ADC_WAKEUP_CTL_REG_OFFSET);
165 mmio_region_write32(adc_ctrl->
base_addr, ADC_CTRL_ADC_WAKEUP_CTL_REG_OFFSET,
169 uint32_t intr_ctrl_reg =
170 mmio_region_read32(adc_ctrl->
base_addr, ADC_CTRL_ADC_INTR_CTL_REG_OFFSET);
173 mmio_region_write32(adc_ctrl->
base_addr, ADC_CTRL_ADC_INTR_CTL_REG_OFFSET,
185 uint32_t en_ctrl_reg =
186 mmio_region_read32(adc_ctrl->
base_addr, ADC_CTRL_ADC_EN_CTL_REG_OFFSET);
190 mmio_region_write32(adc_ctrl->
base_addr, ADC_CTRL_ADC_EN_CTL_REG_OFFSET,
198 if (adc_ctrl == NULL || is_enabled == NULL) {
202 uint32_t en_ctrl_reg =
203 mmio_region_read32(adc_ctrl->
base_addr, ADC_CTRL_ADC_EN_CTL_REG_OFFSET);
212 ptrdiff_t *filter_ctrl_reg_offset) {
213 #define DIF_ADC_CTRL_CHANNEL0_FILTER_CTRL_REG_CASE_(filter_) \
214 case kDifAdcCtrlFilter##filter_: \
215 *filter_ctrl_reg_offset = \
216 ADC_CTRL_ADC_CHN0_FILTER_CTL_##filter_##_REG_OFFSET; \
219 #define DIF_ADC_CTRL_CHANNEL1_FILTER_CTRL_REG_CASE_(filter_) \
220 case kDifAdcCtrlFilter##filter_: \
221 *filter_ctrl_reg_offset = \
222 ADC_CTRL_ADC_CHN1_FILTER_CTL_##filter_##_REG_OFFSET; \
226 case kDifAdcCtrlChannel0:
233 case kDifAdcCtrlChannel1:
244 #undef DIF_ADC_CTRL_CHANNEL0_FILTER_CTRL_REG_CASE_
245 #undef DIF_ADC_CTRL_CHANNEL1_FILTER_CTRL_REG_CASE_
253 #define DIF_ADC_CTRL_CHANNEL0_FILTER_ENABLE_CASE_(filter_) \
254 case kDifAdcCtrlFilter##filter_: \
255 *enable_bit = ADC_CTRL_ADC_CHN0_FILTER_CTL_##filter_##_EN_##filter_##_BIT; \
258 #define DIF_ADC_CTRL_CHANNEL1_FILTER_ENABLE_CASE_(filter_) \
259 case kDifAdcCtrlFilter##filter_: \
260 *enable_bit = ADC_CTRL_ADC_CHN1_FILTER_CTL_##filter_##_EN_##filter_##_BIT; \
264 case kDifAdcCtrlChannel0:
271 case kDifAdcCtrlChannel1:
282 #undef DIF_ADC_CTRL_CHANNEL0_FILTER_ENABLE_CASE_
283 #undef DIF_ADC_CTRL_CHANNEL1_FILTER_ENABLE_CASE_
296 ptrdiff_t filter_ctrl_reg_offset;
298 if (!get_filter_offset(channel, filter, &filter_ctrl_reg_offset)) {
301 if (!get_filter_enable_bit(channel, filter, &enable_bit)) {
305 uint32_t filter_ctrl_reg =
306 mmio_region_read32(adc_ctrl->
base_addr, filter_ctrl_reg_offset);
309 mmio_region_write32(adc_ctrl->
base_addr, filter_ctrl_reg_offset,
319 if (adc_ctrl == NULL || is_enabled == NULL) {
323 ptrdiff_t filter_ctrl_reg_offset;
325 if (!get_filter_offset(channel, filter, &filter_ctrl_reg_offset)) {
328 if (!get_filter_enable_bit(channel, filter, &enable_bit)) {
332 uint32_t filter_ctrl_reg =
333 mmio_region_read32(adc_ctrl->
base_addr, filter_ctrl_reg_offset);
343 if (adc_ctrl == NULL || value == NULL) {
349 #define DIF_ADC_CTRL_CHANNEL_TRIG_VALUE_CASE_(channel_) \
350 case kDifAdcCtrlChannel##channel_: \
351 value_reg = mmio_region_read32( \
352 adc_ctrl->base_addr, ADC_CTRL_ADC_CHN_VAL_##channel_##_REG_OFFSET); \
353 *value = (uint16_t)bitfield_field32_read( \
355 ADC_CTRL_ADC_CHN_VAL_##channel_##_ADC_CHN_VALUE_INTR_##channel_##_FIELD); \
364 #undef DIF_ADC_CTRL_CHANNEL_TRIG_VALUE_CASE_
372 if (adc_ctrl == NULL || value == NULL) {
378 #define DIF_ADC_CTRL_CHANNEL_LATEST_VALUE_CASE_(channel_) \
379 case kDifAdcCtrlChannel##channel_: \
380 value_reg = mmio_region_read32( \
381 adc_ctrl->base_addr, ADC_CTRL_ADC_CHN_VAL_##channel_##_REG_OFFSET); \
382 *value = (uint16_t)bitfield_field32_read( \
384 ADC_CTRL_ADC_CHN_VAL_##channel_##_ADC_CHN_VALUE_##channel_##_FIELD); \
393 #undef DIF_ADC_CTRL_CHANNEL_LATEST_VALUE_CASE_
399 if (adc_ctrl == NULL) {
403 mmio_region_write32(adc_ctrl->
base_addr, ADC_CTRL_ADC_FSM_RST_REG_OFFSET, 1);
404 mmio_region_write32(adc_ctrl->
base_addr, ADC_CTRL_ADC_FSM_RST_REG_OFFSET, 0);
411 if (adc_ctrl == NULL || causes == NULL) {
415 *causes = mmio_region_read32(adc_ctrl->
base_addr,
416 ADC_CTRL_ADC_INTR_STATUS_REG_OFFSET);
423 if (adc_ctrl == NULL ||
status == NULL) {
428 ADC_CTRL_FILTER_STATUS_REG_OFFSET);
440 mmio_region_write32(adc_ctrl->
base_addr, ADC_CTRL_FILTER_STATUS_REG_OFFSET,
444 mmio_region_write32(adc_ctrl->
base_addr, ADC_CTRL_ADC_INTR_STATUS_REG_OFFSET,
453 if (adc_ctrl == NULL || filter >= (ADC_CTRL_PARAM_NUM_ADC_FILTER + 1) ||
458 uint32_t wakeup_ctrl_reg = mmio_region_read32(
459 adc_ctrl->
base_addr, ADC_CTRL_ADC_WAKEUP_CTL_REG_OFFSET);
462 mmio_region_write32(adc_ctrl->
base_addr, ADC_CTRL_ADC_WAKEUP_CTL_REG_OFFSET,
471 if (adc_ctrl == NULL || filter >= (ADC_CTRL_PARAM_NUM_ADC_FILTER + 1) ||
472 is_enabled == NULL) {
476 uint32_t wakeup_ctrl_reg = mmio_region_read32(
477 adc_ctrl->
base_addr, ADC_CTRL_ADC_WAKEUP_CTL_REG_OFFSET);
492 uint32_t enabled_causes =
493 mmio_region_read32(adc_ctrl->
base_addr, ADC_CTRL_ADC_INTR_CTL_REG_OFFSET);
495 enabled_causes &= ~causes;
497 enabled_causes |= causes;
499 mmio_region_write32(adc_ctrl->
base_addr, ADC_CTRL_ADC_INTR_CTL_REG_OFFSET,
506 uint32_t *enabled_causes) {
507 if (adc_ctrl == NULL || enabled_causes == NULL) {
512 mmio_region_read32(adc_ctrl->
base_addr, ADC_CTRL_ADC_INTR_CTL_REG_OFFSET);