7 #include "gtest/gtest.h"
9 #include "sw/device/lib/base/mock_mmio.h"
13 #include "adc_ctrl_regs.h"
15 namespace dif_adc_ctrl_unittest {
17 using ::mock_mmio::LeInt;
18 using ::mock_mmio::MmioTest;
19 using ::mock_mmio::MockDevice;
23 dif_adc_ctrl_t adc_ctrl_ = {.base_addr = dev().region()};
26 .power_up_time_aon_cycles = 8,
27 .wake_up_time_aon_cycles = 128,
28 .num_low_power_samples = 4,
29 .num_normal_power_samples = 32,
32 .
filter = kDifAdcCtrlFilter2,
36 .generate_wakeup_on_match =
true,
37 .generate_irq_on_match =
true,
47 TEST_F(ConfigTest, BadMode) {
52 TEST_F(ConfigTest, BadPowerUpTime) {
53 config_.power_up_time_aon_cycles = ADC_CTRL_ADC_PD_CTL_PWRUP_TIME_MASK + 1;
57 TEST_F(ConfigTest, BadWakeUpTime) {
58 config_.wake_up_time_aon_cycles = ADC_CTRL_ADC_PD_CTL_WAKEUP_TIME_MASK + 1;
62 TEST_F(ConfigTest, BadNumLowPowerSamples) {
63 config_.num_low_power_samples = 0;
67 TEST_F(ConfigTest, BadNumNormalPowerSamples) {
68 config_.num_normal_power_samples = 0;
72 TEST_F(ConfigTest, LowPowerModeSuccess) {
73 EXPECT_WRITE32(ADC_CTRL_ADC_EN_CTL_REG_OFFSET, 0);
74 EXPECT_WRITE32(ADC_CTRL_ADC_PD_CTL_REG_OFFSET,
75 {{ADC_CTRL_ADC_PD_CTL_WAKEUP_TIME_OFFSET,
76 config_.wake_up_time_aon_cycles},
77 {ADC_CTRL_ADC_PD_CTL_PWRUP_TIME_OFFSET,
78 config_.power_up_time_aon_cycles},
79 {ADC_CTRL_ADC_PD_CTL_LP_MODE_BIT, 1}});
80 EXPECT_WRITE32(ADC_CTRL_ADC_LP_SAMPLE_CTL_REG_OFFSET,
81 {{ADC_CTRL_ADC_LP_SAMPLE_CTL_LP_SAMPLE_CNT_OFFSET,
82 config_.num_low_power_samples}});
83 EXPECT_WRITE32(ADC_CTRL_ADC_SAMPLE_CTL_REG_OFFSET,
84 {{ADC_CTRL_ADC_SAMPLE_CTL_NP_SAMPLE_CNT_OFFSET,
85 config_.num_normal_power_samples}});
89 TEST_F(ConfigTest, NormalPowerModeSuccess) {
91 EXPECT_WRITE32(ADC_CTRL_ADC_EN_CTL_REG_OFFSET, 0);
92 EXPECT_WRITE32(ADC_CTRL_ADC_PD_CTL_REG_OFFSET,
93 {{ADC_CTRL_ADC_PD_CTL_PWRUP_TIME_OFFSET,
94 config_.power_up_time_aon_cycles},
95 {ADC_CTRL_ADC_PD_CTL_WAKEUP_TIME_OFFSET, 0x640}});
96 EXPECT_WRITE32(ADC_CTRL_ADC_LP_SAMPLE_CTL_REG_OFFSET,
97 ADC_CTRL_ADC_LP_SAMPLE_CTL_REG_RESVAL);
98 EXPECT_WRITE32(ADC_CTRL_ADC_SAMPLE_CTL_REG_OFFSET,
99 {{ADC_CTRL_ADC_SAMPLE_CTL_NP_SAMPLE_CNT_OFFSET,
100 config_.num_normal_power_samples}});
104 TEST_F(ConfigTest, OneshotModeSuccess) {
106 EXPECT_WRITE32(ADC_CTRL_ADC_EN_CTL_REG_OFFSET,
107 {{ADC_CTRL_ADC_EN_CTL_ONESHOT_MODE_BIT,
true}});
108 EXPECT_WRITE32(ADC_CTRL_ADC_PD_CTL_REG_OFFSET,
109 {{ADC_CTRL_ADC_PD_CTL_PWRUP_TIME_OFFSET,
110 config_.power_up_time_aon_cycles},
111 {ADC_CTRL_ADC_PD_CTL_WAKEUP_TIME_OFFSET, 0x640}});
112 EXPECT_WRITE32(ADC_CTRL_ADC_LP_SAMPLE_CTL_REG_OFFSET,
113 ADC_CTRL_ADC_LP_SAMPLE_CTL_REG_RESVAL);
114 EXPECT_WRITE32(ADC_CTRL_ADC_SAMPLE_CTL_REG_OFFSET,
115 ADC_CTRL_ADC_SAMPLE_CTL_REG_RESVAL);
126 TEST_F(FilterConfigTest, BadMinVoltage) {
127 filter_config_.min_voltage = 1024;
132 TEST_F(FilterConfigTest, BadMaxVoltage) {
133 filter_config_.max_voltage = 1024;
138 TEST_F(FilterConfigTest, BadChannel) {
145 TEST_F(FilterConfigTest, BadFilter) {
146 filter_config_.filter =
154 TEST_F(FilterConfigTest, Success) {
155 EXPECT_WRITE32(ADC_CTRL_ADC_CHN1_FILTER_CTL_2_REG_OFFSET,
156 {{ADC_CTRL_ADC_CHN1_FILTER_CTL_2_MIN_V_2_OFFSET,
157 filter_config_.min_voltage},
158 {ADC_CTRL_ADC_CHN1_FILTER_CTL_2_MAX_V_2_OFFSET,
159 filter_config_.max_voltage},
160 {ADC_CTRL_ADC_CHN1_FILTER_CTL_2_COND_2_BIT,
false},
161 {ADC_CTRL_ADC_CHN1_FILTER_CTL_2_EN_2_BIT,
true}});
162 EXPECT_READ32(ADC_CTRL_ADC_WAKEUP_CTL_REG_OFFSET, 0);
163 EXPECT_WRITE32(ADC_CTRL_ADC_WAKEUP_CTL_REG_OFFSET,
164 {{filter_config_.filter,
true}});
165 EXPECT_READ32(ADC_CTRL_ADC_INTR_CTL_REG_OFFSET, 0);
166 EXPECT_WRITE32(ADC_CTRL_ADC_INTR_CTL_REG_OFFSET,
167 {{filter_config_.filter,
true}});
171 EXPECT_WRITE32(ADC_CTRL_ADC_CHN0_FILTER_CTL_6_REG_OFFSET,
172 {{ADC_CTRL_ADC_CHN0_FILTER_CTL_6_MIN_V_6_OFFSET,
173 filter_config_.min_voltage},
174 {ADC_CTRL_ADC_CHN0_FILTER_CTL_6_MAX_V_6_OFFSET,
175 filter_config_.max_voltage},
176 {ADC_CTRL_ADC_CHN0_FILTER_CTL_6_COND_6_BIT,
false},
177 {ADC_CTRL_ADC_CHN0_FILTER_CTL_6_EN_6_BIT,
true}});
178 EXPECT_READ32(ADC_CTRL_ADC_WAKEUP_CTL_REG_OFFSET, 0x4);
179 EXPECT_WRITE32(ADC_CTRL_ADC_WAKEUP_CTL_REG_OFFSET, 0x44);
180 EXPECT_READ32(ADC_CTRL_ADC_INTR_CTL_REG_OFFSET, 0x4);
181 EXPECT_WRITE32(ADC_CTRL_ADC_INTR_CTL_REG_OFFSET, 0x44);
182 filter_config_.filter = kDifAdcCtrlFilter6;
193 TEST_F(SetEnabledTest, BadArgs) {
198 TEST_F(SetEnabledTest, Success) {
199 EXPECT_READ32(ADC_CTRL_ADC_EN_CTL_REG_OFFSET, 0);
200 EXPECT_WRITE32(ADC_CTRL_ADC_EN_CTL_REG_OFFSET,
201 {{ADC_CTRL_ADC_EN_CTL_ADC_ENABLE_BIT,
true}});
204 EXPECT_READ32(ADC_CTRL_ADC_EN_CTL_REG_OFFSET,
205 {{ADC_CTRL_ADC_EN_CTL_ONESHOT_MODE_BIT,
true},
206 {ADC_CTRL_ADC_EN_CTL_ADC_ENABLE_BIT,
true}});
207 EXPECT_WRITE32(ADC_CTRL_ADC_EN_CTL_REG_OFFSET,
208 {{ADC_CTRL_ADC_EN_CTL_ONESHOT_MODE_BIT,
true},
209 {ADC_CTRL_ADC_EN_CTL_ADC_ENABLE_BIT,
false}});
221 TEST_F(GetEnabledTest, Success) {
224 EXPECT_READ32(ADC_CTRL_ADC_EN_CTL_REG_OFFSET,
225 {{ADC_CTRL_ADC_EN_CTL_ADC_ENABLE_BIT,
true}});
229 EXPECT_READ32(ADC_CTRL_ADC_EN_CTL_REG_OFFSET, 0);
241 TEST_F(SetFilterEnabledTest, BadChannel) {
247 TEST_F(SetFilterEnabledTest, BadFilter) {
249 &adc_ctrl_, kDifAdcCtrlChannel0,
253 &adc_ctrl_, kDifAdcCtrlChannel1,
258 TEST_F(SetFilterEnabledTest, BadEnabled) {
260 &adc_ctrl_, kDifAdcCtrlChannel0, kDifAdcCtrlFilter3,
264 TEST_F(SetFilterEnabledTest, Success) {
265 EXPECT_READ32(ADC_CTRL_ADC_CHN1_FILTER_CTL_2_REG_OFFSET,
266 {{ADC_CTRL_ADC_CHN1_FILTER_CTL_2_MIN_V_2_OFFSET,
267 filter_config_.min_voltage},
268 {ADC_CTRL_ADC_CHN1_FILTER_CTL_2_MAX_V_2_OFFSET,
269 filter_config_.max_voltage},
270 {ADC_CTRL_ADC_CHN1_FILTER_CTL_2_COND_2_BIT,
true},
271 {ADC_CTRL_ADC_CHN1_FILTER_CTL_2_EN_2_BIT,
false}});
272 EXPECT_WRITE32(ADC_CTRL_ADC_CHN1_FILTER_CTL_2_REG_OFFSET,
273 {{ADC_CTRL_ADC_CHN1_FILTER_CTL_2_MIN_V_2_OFFSET,
274 filter_config_.min_voltage},
275 {ADC_CTRL_ADC_CHN1_FILTER_CTL_2_MAX_V_2_OFFSET,
276 filter_config_.max_voltage},
277 {ADC_CTRL_ADC_CHN1_FILTER_CTL_2_COND_2_BIT,
true},
278 {ADC_CTRL_ADC_CHN1_FILTER_CTL_2_EN_2_BIT,
true}});
282 EXPECT_READ32(ADC_CTRL_ADC_CHN0_FILTER_CTL_7_REG_OFFSET,
283 {{ADC_CTRL_ADC_CHN0_FILTER_CTL_7_MIN_V_7_OFFSET,
284 filter_config_.min_voltage},
285 {ADC_CTRL_ADC_CHN0_FILTER_CTL_7_MAX_V_7_OFFSET,
286 filter_config_.max_voltage},
287 {ADC_CTRL_ADC_CHN0_FILTER_CTL_7_COND_7_BIT,
true},
288 {ADC_CTRL_ADC_CHN0_FILTER_CTL_7_EN_7_BIT,
true}});
289 EXPECT_WRITE32(ADC_CTRL_ADC_CHN0_FILTER_CTL_7_REG_OFFSET,
290 {{ADC_CTRL_ADC_CHN0_FILTER_CTL_7_MIN_V_7_OFFSET,
291 filter_config_.min_voltage},
292 {ADC_CTRL_ADC_CHN0_FILTER_CTL_7_MAX_V_7_OFFSET,
293 filter_config_.max_voltage},
294 {ADC_CTRL_ADC_CHN0_FILTER_CTL_7_COND_7_BIT,
true},
295 {ADC_CTRL_ADC_CHN0_FILTER_CTL_7_EN_7_BIT,
false}});
305 nullptr, kDifAdcCtrlChannel0, kDifAdcCtrlFilter3, &is_enabled));
307 &adc_ctrl_, kDifAdcCtrlChannel0, kDifAdcCtrlFilter3,
nullptr));
310 TEST_F(GetFilterEnabledTest, BadChannel) {
317 TEST_F(GetFilterEnabledTest, BadFilter) {
320 &adc_ctrl_, kDifAdcCtrlChannel0,
324 &adc_ctrl_, kDifAdcCtrlChannel1,
329 TEST_F(GetFilterEnabledTest, Success) {
332 EXPECT_READ32(ADC_CTRL_ADC_CHN0_FILTER_CTL_7_REG_OFFSET,
333 {{ADC_CTRL_ADC_CHN0_FILTER_CTL_7_EN_7_BIT,
true}});
335 &adc_ctrl_, kDifAdcCtrlChannel0, kDifAdcCtrlFilter7, &is_enabled));
338 EXPECT_READ32(ADC_CTRL_ADC_CHN1_FILTER_CTL_4_REG_OFFSET, 0);
340 &adc_ctrl_, kDifAdcCtrlChannel1, kDifAdcCtrlFilter4, &is_enabled));
351 &adc_ctrl_, kDifAdcCtrlChannel0,
nullptr));
354 TEST_F(GetTriggeredValueTest, BadChannel) {
362 TEST_F(GetTriggeredValueTest, Success) {
364 EXPECT_READ32(ADC_CTRL_ADC_CHN_VAL_0_REG_OFFSET,
365 {{ADC_CTRL_ADC_CHN_VAL_0_ADC_CHN_VALUE_INTR_0_OFFSET, 1023}});
367 kDifAdcCtrlChannel0, &value));
368 EXPECT_EQ(value, 1023);
381 TEST_F(GetLatestValueTest, BadChannel) {
389 TEST_F(GetLatestValueTest, Success) {
391 EXPECT_READ32(ADC_CTRL_ADC_CHN_VAL_0_REG_OFFSET,
392 {{ADC_CTRL_ADC_CHN_VAL_0_ADC_CHN_VALUE_0_OFFSET, 1023}});
395 EXPECT_EQ(value, 1023);
404 TEST_F(ResetFsmTest, Success) {
405 EXPECT_WRITE32(ADC_CTRL_ADC_FSM_RST_REG_OFFSET, 1);
406 EXPECT_WRITE32(ADC_CTRL_ADC_FSM_RST_REG_OFFSET, 0);
418 TEST_F(FilterStatusTest, Success) {
420 EXPECT_READ32(ADC_CTRL_FILTER_STATUS_REG_OFFSET, 0x1FF);
433 TEST_F(IrqGetCausesTest, Success) {
435 EXPECT_READ32(ADC_CTRL_ADC_INTR_STATUS_REG_OFFSET, 0x1FF);
437 EXPECT_EQ(causes, 0x1FF);
447 TEST_F(IrqClearCausesTest, BadCauses) {
449 &adc_ctrl_, 1U << (ADC_CTRL_PARAM_NUM_ADC_FILTER + 2)));
452 TEST_F(IrqClearCausesTest, Success) {
453 EXPECT_WRITE32(ADC_CTRL_FILTER_STATUS_REG_OFFSET, 0x9);
454 EXPECT_WRITE32(ADC_CTRL_ADC_INTR_STATUS_REG_OFFSET, 0x9);
456 &adc_ctrl_, kDifAdcCtrlIrqCauseFilter0 | kDifAdcCtrlIrqCauseFilter3));
458 EXPECT_WRITE32(ADC_CTRL_FILTER_STATUS_REG_OFFSET, 0x102);
459 EXPECT_WRITE32(ADC_CTRL_ADC_INTR_STATUS_REG_OFFSET, 0x102);
463 EXPECT_WRITE32(ADC_CTRL_FILTER_STATUS_REG_OFFSET, 0x001);
464 EXPECT_WRITE32(ADC_CTRL_ADC_INTR_STATUS_REG_OFFSET, 0x201);
476 TEST_F(FilterMatchWakeupSetEnabledTest, BadFilter) {
483 TEST_F(FilterMatchWakeupSetEnabledTest, BadEnabled) {
485 &adc_ctrl_, kDifAdcCtrlFilter7,
static_cast<dif_toggle_t>(2)));
488 TEST_F(FilterMatchWakeupSetEnabledTest, Success) {
489 EXPECT_READ32(ADC_CTRL_ADC_WAKEUP_CTL_REG_OFFSET, 0xF);
490 EXPECT_WRITE32(ADC_CTRL_ADC_WAKEUP_CTL_REG_OFFSET, 0x8F);
494 EXPECT_READ32(ADC_CTRL_ADC_WAKEUP_CTL_REG_OFFSET, 0x8F);
495 EXPECT_WRITE32(ADC_CTRL_ADC_WAKEUP_CTL_REG_OFFSET, 0xF);
499 EXPECT_READ32(ADC_CTRL_ADC_WAKEUP_CTL_REG_OFFSET, 0xF);
500 EXPECT_WRITE32(ADC_CTRL_ADC_WAKEUP_CTL_REG_OFFSET, 0x10F);
510 nullptr, kDifAdcCtrlFilter3, &is_enabled));
512 &adc_ctrl_, kDifAdcCtrlFilter3,
nullptr));
515 TEST_F(FilterMatchWakeupGetEnabledTest, BadFilter) {
523 TEST_F(FilterMatchWakeupGetEnabledTest, Success) {
526 EXPECT_READ32(ADC_CTRL_ADC_WAKEUP_CTL_REG_OFFSET, 0x88);
528 &adc_ctrl_, kDifAdcCtrlFilter3, &is_enabled));
531 EXPECT_READ32(ADC_CTRL_ADC_WAKEUP_CTL_REG_OFFSET, 0x88);
533 &adc_ctrl_, kDifAdcCtrlFilter2, &is_enabled));
544 TEST_F(IrqCauseSetEnabledTest, BadCauses) {
549 TEST_F(IrqCauseSetEnabledTest, BadEnabled) {
554 TEST_F(IrqCauseSetEnabledTest, Success) {
555 EXPECT_READ32(ADC_CTRL_ADC_INTR_CTL_REG_OFFSET, 0x33);
556 EXPECT_WRITE32(ADC_CTRL_ADC_INTR_CTL_REG_OFFSET, 0x3F);
558 &adc_ctrl_, kDifAdcCtrlIrqCauseFilter2 | kDifAdcCtrlIrqCauseFilter3,
561 EXPECT_READ32(ADC_CTRL_ADC_INTR_CTL_REG_OFFSET, 0x3F);
562 EXPECT_WRITE32(ADC_CTRL_ADC_INTR_CTL_REG_OFFSET, 0x33);
564 &adc_ctrl_, kDifAdcCtrlIrqCauseFilter2 | kDifAdcCtrlIrqCauseFilter3,
571 uint32_t enabled_causes;
577 TEST_F(IrqCauseGetEnabledTest, Success) {
578 uint32_t enabled_causes;
579 EXPECT_READ32(ADC_CTRL_ADC_INTR_CTL_REG_OFFSET, 0x1AA);
582 EXPECT_EQ(enabled_causes, 0x1AA);