31 if (adc_ctrl == NULL ||
39 uint32_t en_ctrl_reg = ADC_CTRL_ADC_EN_CTL_REG_RESVAL;
40 uint32_t pd_ctrl_reg = ADC_CTRL_ADC_PD_CTL_REG_RESVAL;
41 uint32_t lp_sample_ctrl_reg = ADC_CTRL_ADC_LP_SAMPLE_CTL_REG_RESVAL;
42 uint32_t np_sample_ctrl_reg = ADC_CTRL_ADC_SAMPLE_CTL_REG_RESVAL;
44 switch (config.
mode) {
46 pd_ctrl_reg = bitfield_bit32_write(pd_ctrl_reg,
47 ADC_CTRL_ADC_PD_CTL_LP_MODE_BIT,
true);
48 pd_ctrl_reg = bitfield_field32_write(
49 pd_ctrl_reg, ADC_CTRL_ADC_PD_CTL_WAKEUP_TIME_FIELD,
51 lp_sample_ctrl_reg = bitfield_field32_write(
52 lp_sample_ctrl_reg, ADC_CTRL_ADC_LP_SAMPLE_CTL_LP_SAMPLE_CNT_FIELD,
56 np_sample_ctrl_reg = bitfield_field32_write(
57 np_sample_ctrl_reg, ADC_CTRL_ADC_SAMPLE_CTL_NP_SAMPLE_CNT_FIELD,
61 en_ctrl_reg = bitfield_bit32_write(
62 en_ctrl_reg, ADC_CTRL_ADC_EN_CTL_ONESHOT_MODE_BIT,
true);
71 bitfield_field32_write(pd_ctrl_reg, ADC_CTRL_ADC_PD_CTL_PWRUP_TIME_FIELD,
73 mmio_region_write32(adc_ctrl->
base_addr, ADC_CTRL_ADC_EN_CTL_REG_OFFSET,
75 mmio_region_write32(adc_ctrl->
base_addr, ADC_CTRL_ADC_PD_CTL_REG_OFFSET,
78 ADC_CTRL_ADC_LP_SAMPLE_CTL_REG_OFFSET,
80 mmio_region_write32(adc_ctrl->
base_addr, ADC_CTRL_ADC_SAMPLE_CTL_REG_OFFSET,
90 if (adc_ctrl == NULL || config.
min_voltage > 1023 ||
95 ptrdiff_t filter_ctrl_reg_offset;
101#define DIF_ADC_CTRL_CHANNEL0_FILTER_CONFIG_CASE_(filter_) \
102 case kDifAdcCtrlFilter##filter_: \
103 filter_ctrl_reg_offset = \
104 ADC_CTRL_ADC_CHN0_FILTER_CTL_##filter_##_REG_OFFSET; \
105 min_voltage_field = \
106 ADC_CTRL_ADC_CHN0_FILTER_CTL_##filter_##_MIN_V_##filter_##_FIELD; \
107 max_voltage_field = \
108 ADC_CTRL_ADC_CHN0_FILTER_CTL_##filter_##_MAX_V_##filter_##_FIELD; \
110 ADC_CTRL_ADC_CHN0_FILTER_CTL_##filter_##_COND_##filter_##_BIT; \
111 enable_bit = ADC_CTRL_ADC_CHN0_FILTER_CTL_##filter_##_EN_##filter_##_BIT; \
114#define DIF_ADC_CTRL_CHANNEL1_FILTER_CONFIG_CASE_(filter_) \
115 case kDifAdcCtrlFilter##filter_: \
116 filter_ctrl_reg_offset = \
117 ADC_CTRL_ADC_CHN1_FILTER_CTL_##filter_##_REG_OFFSET; \
118 min_voltage_field = \
119 ADC_CTRL_ADC_CHN1_FILTER_CTL_##filter_##_MIN_V_##filter_##_FIELD; \
120 max_voltage_field = \
121 ADC_CTRL_ADC_CHN1_FILTER_CTL_##filter_##_MAX_V_##filter_##_FIELD; \
123 ADC_CTRL_ADC_CHN1_FILTER_CTL_##filter_##_COND_##filter_##_BIT; \
124 enable_bit = ADC_CTRL_ADC_CHN1_FILTER_CTL_##filter_##_EN_##filter_##_BIT; \
128 case kDifAdcCtrlChannel0:
135 case kDifAdcCtrlChannel1:
146#undef DIF_ADC_CTRL_CHANNEL0_FILTER_CONFIG_CASE_
147#undef DIF_ADC_CTRL_CHANNEL1_FILTER_CONFIG_CASE_
150 uint32_t filter_ctrl_reg =
151 bitfield_field32_write(0, min_voltage_field, config.
min_voltage);
152 filter_ctrl_reg = bitfield_field32_write(filter_ctrl_reg, max_voltage_field,
155 bitfield_bit32_write(filter_ctrl_reg, in_range_bit, !config.
in_range);
156 filter_ctrl_reg = bitfield_bit32_write(filter_ctrl_reg, enable_bit,
157 dif_toggle_to_bool(enabled));
158 mmio_region_write32(adc_ctrl->
base_addr, filter_ctrl_reg_offset,
162 uint32_t wakeup_ctrl_reg = mmio_region_read32(
163 adc_ctrl->
base_addr, ADC_CTRL_ADC_WAKEUP_CTL_REG_OFFSET);
164 wakeup_ctrl_reg = bitfield_bit32_write(wakeup_ctrl_reg, config.
filter,
166 mmio_region_write32(adc_ctrl->
base_addr, ADC_CTRL_ADC_WAKEUP_CTL_REG_OFFSET,
170 uint32_t intr_ctrl_reg =
171 mmio_region_read32(adc_ctrl->
base_addr, ADC_CTRL_ADC_INTR_CTL_REG_OFFSET);
172 intr_ctrl_reg = bitfield_bit32_write(intr_ctrl_reg, config.
filter,
174 mmio_region_write32(adc_ctrl->
base_addr, ADC_CTRL_ADC_INTR_CTL_REG_OFFSET,
182 if (adc_ctrl == NULL || !dif_is_valid_toggle(enabled)) {
186 uint32_t en_ctrl_reg =
187 mmio_region_read32(adc_ctrl->
base_addr, ADC_CTRL_ADC_EN_CTL_REG_OFFSET);
189 bitfield_bit32_write(en_ctrl_reg, ADC_CTRL_ADC_EN_CTL_ADC_ENABLE_BIT,
190 dif_toggle_to_bool(enabled));
191 mmio_region_write32(adc_ctrl->
base_addr, ADC_CTRL_ADC_EN_CTL_REG_OFFSET,
199 if (adc_ctrl == NULL || is_enabled == NULL) {
203 uint32_t en_ctrl_reg =
204 mmio_region_read32(adc_ctrl->
base_addr, ADC_CTRL_ADC_EN_CTL_REG_OFFSET);
205 *is_enabled = dif_bool_to_toggle(
206 bitfield_bit32_read(en_ctrl_reg, ADC_CTRL_ADC_EN_CTL_ADC_ENABLE_BIT));
293 if (adc_ctrl == NULL || !dif_is_valid_toggle(enabled)) {
297 ptrdiff_t filter_ctrl_reg_offset;
299 if (!get_filter_offset(channel, filter, &filter_ctrl_reg_offset)) {
302 if (!get_filter_enable_bit(channel, filter, &enable_bit)) {
306 uint32_t filter_ctrl_reg =
307 mmio_region_read32(adc_ctrl->
base_addr, filter_ctrl_reg_offset);
308 filter_ctrl_reg = bitfield_bit32_write(filter_ctrl_reg, enable_bit,
309 dif_toggle_to_bool(enabled));
310 mmio_region_write32(adc_ctrl->
base_addr, filter_ctrl_reg_offset,
320 if (adc_ctrl == NULL || is_enabled == NULL) {
324 ptrdiff_t filter_ctrl_reg_offset;
326 if (!get_filter_offset(channel, filter, &filter_ctrl_reg_offset)) {
329 if (!get_filter_enable_bit(channel, filter, &enable_bit)) {
333 uint32_t filter_ctrl_reg =
334 mmio_region_read32(adc_ctrl->
base_addr, filter_ctrl_reg_offset);
336 dif_bool_to_toggle(bitfield_bit32_read(filter_ctrl_reg, enable_bit));
441 mmio_region_write32(adc_ctrl->
base_addr, ADC_CTRL_FILTER_STATUS_REG_OFFSET,
445 mmio_region_write32(adc_ctrl->
base_addr, ADC_CTRL_ADC_INTR_STATUS_REG_OFFSET,
454 if (adc_ctrl == NULL || filter >= (ADC_CTRL_PARAM_NUM_ADC_FILTER + 1) ||
455 !dif_is_valid_toggle(enabled)) {
459 uint32_t wakeup_ctrl_reg = mmio_region_read32(
460 adc_ctrl->
base_addr, ADC_CTRL_ADC_WAKEUP_CTL_REG_OFFSET);
461 wakeup_ctrl_reg = bitfield_bit32_write(wakeup_ctrl_reg, filter,
462 dif_toggle_to_bool(enabled));
463 mmio_region_write32(adc_ctrl->
base_addr, ADC_CTRL_ADC_WAKEUP_CTL_REG_OFFSET,
472 if (adc_ctrl == NULL || filter >= (ADC_CTRL_PARAM_NUM_ADC_FILTER + 1) ||
473 is_enabled == NULL) {
477 uint32_t wakeup_ctrl_reg = mmio_region_read32(
478 adc_ctrl->
base_addr, ADC_CTRL_ADC_WAKEUP_CTL_REG_OFFSET);
480 dif_bool_to_toggle(bitfield_bit32_read(wakeup_ctrl_reg, filter));
489 !dif_is_valid_toggle(enabled)) {
493 uint32_t enabled_causes =
494 mmio_region_read32(adc_ctrl->
base_addr, ADC_CTRL_ADC_INTR_CTL_REG_OFFSET);
496 enabled_causes &= ~causes;
498 enabled_causes |= causes;
500 mmio_region_write32(adc_ctrl->
base_addr, ADC_CTRL_ADC_INTR_CTL_REG_OFFSET,