7 #include "gtest/gtest.h"
9 #include "sw/device/lib/base/mock_mmio.h"
13 #include "pinmux_regs.h"
15 namespace dif_pinmux_unittest {
23 void SetUp() {
ASSERT_DIF_OK(dif_pinmux_init(dev().region(), &dif_pinmux_)); }
25 dif_pinmux_t dif_pinmux_;
43 pad_attr_arg, &pad_attr_arg));
45 &dif_pinmux_, index_arg, pad_kind_arg, pad_attr_arg,
nullptr));
53 pad_kind_arg, sleep_mode_arg));
57 pad_kind_arg, &bool_arg));
59 pad_kind_arg,
nullptr));
69 uint32_t uint32_arg{};
73 TEST_F(PinmuxTest, LockConfig) {
75 EXPECT_READ32(PINMUX_MIO_PERIPH_INSEL_REGWEN_0_REG_OFFSET, 1);
78 EXPECT_FALSE(is_locked);
80 EXPECT_READ32(PINMUX_DIO_PAD_SLEEP_REGWEN_1_REG_OFFSET, 0);
83 EXPECT_TRUE(is_locked);
85 EXPECT_WRITE32(PINMUX_MIO_PAD_SLEEP_REGWEN_2_REG_OFFSET, 0);
90 TEST_F(PinmuxTest, InputSelection) {
91 EXPECT_READ32(PINMUX_MIO_PERIPH_INSEL_REGWEN_0_REG_OFFSET, 0);
96 EXPECT_READ32(PINMUX_MIO_PERIPH_INSEL_REGWEN_2_REG_OFFSET, 1);
97 EXPECT_WRITE32(PINMUX_MIO_PERIPH_INSEL_2_REG_OFFSET, 1);
102 TEST_F(PinmuxTest, OutputSelection) {
103 EXPECT_READ32(PINMUX_MIO_OUTSEL_REGWEN_1_REG_OFFSET, 0);
108 EXPECT_READ32(PINMUX_MIO_OUTSEL_REGWEN_3_REG_OFFSET, 1);
109 EXPECT_WRITE32(PINMUX_MIO_OUTSEL_3_REG_OFFSET, 4);
114 TEST_F(PinmuxTest, PadAttributes) {
119 kDifPinmuxPadAttrInvertLevel | kDifPinmuxPadAttrPullResistorEnable |
120 kDifPinmuxPadAttrPullResistorUp | kDifPinmuxPadAttrInputDisable),
123 EXPECT_READ32(PINMUX_MIO_PAD_ATTR_REGWEN_1_REG_OFFSET, 0);
129 EXPECT_READ32(PINMUX_DIO_PAD_ATTR_REGWEN_2_REG_OFFSET, 0);
135 EXPECT_READ32(PINMUX_MIO_PAD_ATTR_REGWEN_1_REG_OFFSET, 1);
136 EXPECT_READ32(PINMUX_MIO_PAD_ATTR_1_REG_OFFSET, 0);
137 EXPECT_WRITE32(PINMUX_MIO_PAD_ATTR_1_REG_OFFSET,
139 {PINMUX_MIO_PAD_ATTR_1_INVERT_1_BIT, 1},
140 {PINMUX_MIO_PAD_ATTR_1_PULL_EN_1_BIT, 1},
141 {PINMUX_MIO_PAD_ATTR_1_PULL_SELECT_1_BIT, 1},
142 {PINMUX_MIO_PAD_ATTR_1_INPUT_DISABLE_1_BIT, 1},
143 {PINMUX_MIO_PAD_ATTR_1_SLEW_RATE_1_OFFSET, 2},
144 {PINMUX_MIO_PAD_ATTR_1_DRIVE_STRENGTH_1_OFFSET, 5},
146 EXPECT_READ32(PINMUX_MIO_PAD_ATTR_1_REG_OFFSET,
148 {PINMUX_MIO_PAD_ATTR_1_INVERT_1_BIT, 1},
149 {PINMUX_MIO_PAD_ATTR_1_PULL_EN_1_BIT, 1},
150 {PINMUX_MIO_PAD_ATTR_1_PULL_SELECT_1_BIT, 1},
151 {PINMUX_MIO_PAD_ATTR_1_INPUT_DISABLE_1_BIT, 1},
152 {PINMUX_MIO_PAD_ATTR_1_SLEW_RATE_1_OFFSET, 2},
153 {PINMUX_MIO_PAD_ATTR_1_DRIVE_STRENGTH_1_OFFSET, 5},
162 EXPECT_READ32(PINMUX_DIO_PAD_ATTR_REGWEN_3_REG_OFFSET, 1);
163 EXPECT_READ32(PINMUX_DIO_PAD_ATTR_3_REG_OFFSET, 0);
164 EXPECT_WRITE32(PINMUX_DIO_PAD_ATTR_3_REG_OFFSET,
166 {PINMUX_DIO_PAD_ATTR_3_INVERT_3_BIT, 1},
167 {PINMUX_DIO_PAD_ATTR_3_PULL_EN_3_BIT, 1},
168 {PINMUX_DIO_PAD_ATTR_3_PULL_SELECT_3_BIT, 1},
169 {PINMUX_DIO_PAD_ATTR_3_INPUT_DISABLE_3_BIT, 1},
170 {PINMUX_DIO_PAD_ATTR_3_SLEW_RATE_3_OFFSET, 2},
171 {PINMUX_DIO_PAD_ATTR_3_DRIVE_STRENGTH_3_OFFSET, 5},
173 EXPECT_READ32(PINMUX_DIO_PAD_ATTR_3_REG_OFFSET,
175 {PINMUX_DIO_PAD_ATTR_3_INVERT_3_BIT, 0},
176 {PINMUX_DIO_PAD_ATTR_3_PULL_EN_3_BIT, 1},
177 {PINMUX_DIO_PAD_ATTR_3_PULL_SELECT_3_BIT, 1},
178 {PINMUX_DIO_PAD_ATTR_3_INPUT_DISABLE_3_BIT, 1},
179 {PINMUX_DIO_PAD_ATTR_3_SLEW_RATE_3_OFFSET, 2},
180 {PINMUX_DIO_PAD_ATTR_3_DRIVE_STRENGTH_3_OFFSET, 5},
188 EXPECT_EQ(attrs_check.
flags, kDifPinmuxPadAttrPullResistorEnable |
189 kDifPinmuxPadAttrPullResistorUp |
190 kDifPinmuxPadAttrInputDisable);
192 EXPECT_READ32(PINMUX_MIO_PAD_ATTR_1_REG_OFFSET,
194 {PINMUX_MIO_PAD_ATTR_1_KEEPER_EN_1_BIT, 1},
195 {PINMUX_MIO_PAD_ATTR_1_OD_EN_1_BIT, 1},
196 {PINMUX_MIO_PAD_ATTR_1_INPUT_DISABLE_1_BIT, 1},
197 {PINMUX_MIO_PAD_ATTR_1_SLEW_RATE_1_OFFSET, 1},
198 {PINMUX_MIO_PAD_ATTR_1_DRIVE_STRENGTH_1_OFFSET, 3},
204 EXPECT_EQ(attrs_check.
flags, kDifPinmuxPadAttrKeeper |
205 kDifPinmuxPadAttrOpenDrain |
206 kDifPinmuxPadAttrInputDisable);
209 TEST_F(PinmuxTest, SleepModeConfig) {
210 EXPECT_READ32(PINMUX_MIO_PAD_SLEEP_REGWEN_0_REG_OFFSET, 0);
216 EXPECT_READ32(PINMUX_DIO_PAD_SLEEP_REGWEN_1_REG_OFFSET, 0);
221 EXPECT_READ32(PINMUX_MIO_PAD_SLEEP_REGWEN_1_REG_OFFSET, 1);
222 EXPECT_WRITE32(PINMUX_MIO_PAD_SLEEP_MODE_1_REG_OFFSET,
224 EXPECT_WRITE32(PINMUX_MIO_PAD_SLEEP_EN_1_REG_OFFSET,
225 {{PINMUX_MIO_PAD_SLEEP_EN_1_EN_1_BIT, 1}});
229 EXPECT_READ32(PINMUX_DIO_PAD_SLEEP_REGWEN_2_REG_OFFSET, 1);
230 EXPECT_WRITE32(PINMUX_DIO_PAD_SLEEP_EN_2_REG_OFFSET,
231 {{PINMUX_DIO_PAD_SLEEP_EN_2_EN_2_BIT, 0}});
236 TEST_F(PinmuxTest, SleepStatus) {
238 EXPECT_READ32(PINMUX_MIO_PAD_SLEEP_STATUS_0_REG_OFFSET, 0xfffffff7u);
241 EXPECT_FALSE(in_sleep_mode);
243 EXPECT_READ32(PINMUX_DIO_PAD_SLEEP_STATUS_REG_OFFSET, 0x00000004u);
246 EXPECT_TRUE(in_sleep_mode);
248 EXPECT_READ32(PINMUX_MIO_PAD_SLEEP_STATUS_0_REG_OFFSET, 0xffff7777u);
249 EXPECT_WRITE32(PINMUX_MIO_PAD_SLEEP_STATUS_0_REG_OFFSET, 0xffff7757u);
254 TEST_F(PinmuxTest, WakeupConfig) {
260 .counter_threshold = 23,
262 EXPECT_READ32(PINMUX_WKUP_DETECTOR_REGWEN_1_REG_OFFSET, 0);
266 EXPECT_READ32(PINMUX_WKUP_DETECTOR_REGWEN_0_REG_OFFSET, 0);
271 EXPECT_READ32(PINMUX_WKUP_DETECTOR_REGWEN_2_REG_OFFSET, 1);
272 EXPECT_WRITE32(PINMUX_WKUP_DETECTOR_EN_2_REG_OFFSET, 0);
276 EXPECT_READ32(PINMUX_WKUP_DETECTOR_REGWEN_3_REG_OFFSET, 1);
277 EXPECT_WRITE32(PINMUX_WKUP_DETECTOR_EN_3_REG_OFFSET, 0);
278 EXPECT_WRITE32(PINMUX_WKUP_DETECTOR_3_REG_OFFSET,
280 {PINMUX_WKUP_DETECTOR_3_MODE_3_OFFSET,
281 PINMUX_WKUP_DETECTOR_0_MODE_0_VALUE_TIMEDHIGH},
282 {PINMUX_WKUP_DETECTOR_3_FILTER_3_BIT, 0},
283 {PINMUX_WKUP_DETECTOR_3_MIODIO_3_BIT, 0},
285 EXPECT_WRITE32(PINMUX_WKUP_DETECTOR_CNT_TH_3_REG_OFFSET, 23);
286 EXPECT_WRITE32(PINMUX_WKUP_DETECTOR_PADSEL_3_REG_OFFSET, 4);
287 EXPECT_WRITE32(PINMUX_WKUP_DETECTOR_EN_3_REG_OFFSET, 1);
295 EXPECT_READ32(PINMUX_WKUP_DETECTOR_REGWEN_3_REG_OFFSET, 1);
296 EXPECT_WRITE32(PINMUX_WKUP_DETECTOR_EN_3_REG_OFFSET, 0);
297 EXPECT_WRITE32(PINMUX_WKUP_DETECTOR_3_REG_OFFSET,
299 {PINMUX_WKUP_DETECTOR_3_MODE_3_OFFSET,
300 PINMUX_WKUP_DETECTOR_0_MODE_0_VALUE_EDGE},
301 {PINMUX_WKUP_DETECTOR_3_FILTER_3_BIT, 1},
302 {PINMUX_WKUP_DETECTOR_3_MIODIO_3_BIT, 1},
304 EXPECT_WRITE32(PINMUX_WKUP_DETECTOR_PADSEL_3_REG_OFFSET, 3);
305 EXPECT_WRITE32(PINMUX_WKUP_DETECTOR_EN_3_REG_OFFSET, 1);
310 TEST_F(PinmuxTest, WakeupCause) {
311 uint32_t detector_map;
312 EXPECT_READ32(PINMUX_WKUP_CAUSE_REG_OFFSET, 0x4);
314 EXPECT_EQ(detector_map, 4);
316 EXPECT_WRITE32(PINMUX_WKUP_CAUSE_REG_OFFSET, 0x0);