9 #include "gtest/gtest.h"
11 #include "sw/device/lib/base/mock_mmio.h"
14 #include "gpio_regs.h"
16 namespace dif_gpio_unittest {
20 constexpr uint32_t kAllOnes = std::numeric_limits<uint32_t>::max();
22 uint32_t AllZerosExcept(uint32_t index) {
return 1 << index; }
24 uint32_t AllOnesExcept(uint32_t index) {
return ~AllZerosExcept(index); }
33 const dif_gpio_t gpio_ = {.base_addr = dev().region()};
41 TEST_F(ResetTest, Reset) {
42 EXPECT_WRITE32(GPIO_INTR_ENABLE_REG_OFFSET, 0);
43 EXPECT_WRITE32(GPIO_DIRECT_OE_REG_OFFSET, 0);
44 EXPECT_WRITE32(GPIO_DIRECT_OUT_REG_OFFSET, 0);
45 EXPECT_WRITE32(GPIO_INTR_CTRL_EN_RISING_REG_OFFSET, 0);
46 EXPECT_WRITE32(GPIO_INTR_CTRL_EN_FALLING_REG_OFFSET, 0);
47 EXPECT_WRITE32(GPIO_INTR_CTRL_EN_LVLHIGH_REG_OFFSET, 0);
48 EXPECT_WRITE32(GPIO_INTR_CTRL_EN_LVLLOW_REG_OFFSET, 0);
49 EXPECT_WRITE32(GPIO_CTRL_EN_INPUT_FILTER_REG_OFFSET, 0);
50 EXPECT_WRITE32(GPIO_INTR_STATE_REG_OFFSET, kAllOnes);
72 TEST_F(ReadTest, AllPins) {
73 constexpr uint32_t kVal = 0xA5A5A5A5;
74 EXPECT_READ32(GPIO_DATA_IN_REG_OFFSET, kVal);
78 EXPECT_EQ(pin_values, kVal);
81 TEST_F(ReadTest, SinglePin) {
82 for (uint32_t pin = 0; pin < 32; ++pin) {
83 for (
const bool exp_pin_val : {
true,
false}) {
84 const uint32_t reg_val =
85 exp_pin_val ? AllZerosExcept(pin) : AllOnesExcept(pin);
86 EXPECT_READ32(GPIO_DATA_IN_REG_OFFSET, reg_val);
88 bool pin_val = !exp_pin_val;
90 EXPECT_EQ(pin_val, exp_pin_val);
105 TEST_F(WriteTest, AllPins) {
106 constexpr uint32_t kVal = 0xA5A5A5A5;
107 EXPECT_WRITE32(GPIO_DIRECT_OUT_REG_OFFSET, kVal);
132 TEST_F(WriteTest, SinglePin) {
133 EXPECT_WRITE32(GPIO_MASKED_OUT_LOWER_REG_OFFSET, {{16, 1}, {0, 1}});
136 EXPECT_WRITE32(GPIO_MASKED_OUT_LOWER_REG_OFFSET, {{31, 1}, {15, 0}});
139 EXPECT_WRITE32(GPIO_MASKED_OUT_UPPER_REG_OFFSET, {{16, 1}, {0, 1}});
142 EXPECT_WRITE32(GPIO_MASKED_OUT_UPPER_REG_OFFSET, {{31, 1}, {15, 0}});
146 TEST_F(WriteTest, Masked) {
147 EXPECT_WRITE32(GPIO_MASKED_OUT_LOWER_REG_OFFSET, 0xCDCD3322);
148 EXPECT_WRITE32(GPIO_MASKED_OUT_UPPER_REG_OFFSET, 0xABAB5544);
151 EXPECT_WRITE32(GPIO_MASKED_OUT_UPPER_REG_OFFSET, 0xABAB5544);
154 EXPECT_WRITE32(GPIO_MASKED_OUT_LOWER_REG_OFFSET, 0xCDCD3322);
170 TEST_F(OutputModeTest, AllPins) {
171 constexpr uint32_t kVal = 0xA5A5A5A5;
172 EXPECT_WRITE32(GPIO_DIRECT_OE_REG_OFFSET, kVal);
177 TEST_F(OutputModeTest, SinglePin) {
178 EXPECT_WRITE32(GPIO_MASKED_OE_LOWER_REG_OFFSET, {{16, 1}, {0, 1}});
181 EXPECT_WRITE32(GPIO_MASKED_OE_LOWER_REG_OFFSET, {{31, 1}, {15, 0}});
184 EXPECT_WRITE32(GPIO_MASKED_OE_UPPER_REG_OFFSET, {{16, 1}, {0, 1}});
187 EXPECT_WRITE32(GPIO_MASKED_OE_UPPER_REG_OFFSET, {{31, 1}, {15, 0}});
191 TEST_F(OutputModeTest, Masked) {
192 EXPECT_WRITE32(GPIO_MASKED_OE_LOWER_REG_OFFSET, 0xCDCD3322);
193 EXPECT_WRITE32(GPIO_MASKED_OE_UPPER_REG_OFFSET, 0xABAB5544);
197 EXPECT_WRITE32(GPIO_MASKED_OE_LOWER_REG_OFFSET, 0xCDCD3322);
201 EXPECT_WRITE32(GPIO_MASKED_OE_UPPER_REG_OFFSET, 0xABAB5544);
216 TEST_F(InputFilterTest, MaskedEnable) {
217 constexpr uint32_t kVal = 0xABABABAB;
218 EXPECT_READ32(GPIO_CTRL_EN_INPUT_FILTER_REG_OFFSET, 0x0);
219 EXPECT_WRITE32(GPIO_CTRL_EN_INPUT_FILTER_REG_OFFSET, kVal);
225 TEST_F(InputFilterTest, MaskedDisable) {
226 constexpr uint32_t kVal = 0xABABABAB;
227 EXPECT_READ32(GPIO_CTRL_EN_INPUT_FILTER_REG_OFFSET, kAllOnes);
228 EXPECT_WRITE32(GPIO_CTRL_EN_INPUT_FILTER_REG_OFFSET, ~kVal);
238 void ExpectIrqTriggerMaskedDisable(uint32_t pins) {
239 EXPECT_READ32(GPIO_INTR_CTRL_EN_RISING_REG_OFFSET, kAllOnes);
240 EXPECT_WRITE32(GPIO_INTR_CTRL_EN_RISING_REG_OFFSET, ~pins);
241 EXPECT_READ32(GPIO_INTR_CTRL_EN_FALLING_REG_OFFSET, kAllOnes);
242 EXPECT_WRITE32(GPIO_INTR_CTRL_EN_FALLING_REG_OFFSET, ~pins);
243 EXPECT_READ32(GPIO_INTR_CTRL_EN_LVLHIGH_REG_OFFSET, kAllOnes);
244 EXPECT_WRITE32(GPIO_INTR_CTRL_EN_LVLHIGH_REG_OFFSET, ~pins);
245 EXPECT_READ32(GPIO_INTR_CTRL_EN_LVLLOW_REG_OFFSET, kAllOnes);
246 EXPECT_WRITE32(GPIO_INTR_CTRL_EN_LVLLOW_REG_OFFSET, ~pins);
250 TEST_F(
IrqTest, MaskedConfigTriggerEdgeRising) {
251 SCOPED_TRACE(
"IrqTest.MaskedConfigTriggerEdgeRising");
252 constexpr uint32_t kVal = 0xABABABAB;
253 ExpectIrqTriggerMaskedDisable(kVal);
254 EXPECT_READ32(GPIO_INTR_CTRL_EN_RISING_REG_OFFSET, 0);
255 EXPECT_WRITE32(GPIO_INTR_CTRL_EN_RISING_REG_OFFSET, kVal);
261 TEST_F(IrqTest, MaskedConfigTriggerEdgeFalling) {
262 SCOPED_TRACE(
"IrqTest.MaskedConfigTriggerEdgeFalling");
263 constexpr uint32_t kVal = 0xABABABAB;
264 ExpectIrqTriggerMaskedDisable(kVal);
265 EXPECT_READ32(GPIO_INTR_CTRL_EN_FALLING_REG_OFFSET, 0);
266 EXPECT_WRITE32(GPIO_INTR_CTRL_EN_FALLING_REG_OFFSET, kVal);
272 TEST_F(IrqTest, MaskedConfigTriggerLevelLow) {
273 SCOPED_TRACE(
"IrqTest.MaskedConfigTriggerLevelLow");
274 constexpr uint32_t kVal = 0xABABABAB;
275 ExpectIrqTriggerMaskedDisable(kVal);
276 EXPECT_READ32(GPIO_INTR_CTRL_EN_LVLLOW_REG_OFFSET, 0);
277 EXPECT_WRITE32(GPIO_INTR_CTRL_EN_LVLLOW_REG_OFFSET, kVal);
283 TEST_F(IrqTest, MaskedConfigTriggerLevelHigh) {
284 SCOPED_TRACE(
"IrqTest.MaskedConfigTriggerLevelHigh");
285 constexpr uint32_t kVal = 0xABABABAB;
286 ExpectIrqTriggerMaskedDisable(kVal);
287 EXPECT_READ32(GPIO_INTR_CTRL_EN_LVLHIGH_REG_OFFSET, 0);
288 EXPECT_WRITE32(GPIO_INTR_CTRL_EN_LVLHIGH_REG_OFFSET, kVal);
294 TEST_F(IrqTest, MaskedConfigTriggerEdgeRisingFalling) {
295 SCOPED_TRACE(
"IrqTest.MaskedConfigTriggerEdgeRisingFalling");
296 constexpr uint32_t kVal = 0xABABABAB;
297 ExpectIrqTriggerMaskedDisable(kVal);
298 EXPECT_READ32(GPIO_INTR_CTRL_EN_RISING_REG_OFFSET, 0);
299 EXPECT_WRITE32(GPIO_INTR_CTRL_EN_RISING_REG_OFFSET, kVal);
300 EXPECT_READ32(GPIO_INTR_CTRL_EN_FALLING_REG_OFFSET, 0);
301 EXPECT_WRITE32(GPIO_INTR_CTRL_EN_FALLING_REG_OFFSET, kVal);
307 TEST_F(IrqTest, MaskedConfigTriggerEdgeRisingLevelLow) {
308 SCOPED_TRACE(
"IrqTest.MaskedConfigTriggerEdgeRisingLevelLow");
309 constexpr uint32_t kVal = 0xABABABAB;
310 ExpectIrqTriggerMaskedDisable(kVal);
311 EXPECT_READ32(GPIO_INTR_CTRL_EN_RISING_REG_OFFSET, 0);
312 EXPECT_WRITE32(GPIO_INTR_CTRL_EN_RISING_REG_OFFSET, kVal);
313 EXPECT_READ32(GPIO_INTR_CTRL_EN_LVLLOW_REG_OFFSET, 0);
314 EXPECT_WRITE32(GPIO_INTR_CTRL_EN_LVLLOW_REG_OFFSET, kVal);
320 TEST_F(IrqTest, MaskedConfigTriggerEdgeFallingLevelHigh) {
321 SCOPED_TRACE(
"IrqTest.MaskedConfigTriggerEdgeFallingLevelHigh");
322 constexpr uint32_t kVal = 0xABABABAB;
323 ExpectIrqTriggerMaskedDisable(kVal);
324 EXPECT_READ32(GPIO_INTR_CTRL_EN_FALLING_REG_OFFSET, 0);
325 EXPECT_WRITE32(GPIO_INTR_CTRL_EN_FALLING_REG_OFFSET, kVal);
326 EXPECT_READ32(GPIO_INTR_CTRL_EN_LVLHIGH_REG_OFFSET, 0);
327 EXPECT_WRITE32(GPIO_INTR_CTRL_EN_LVLHIGH_REG_OFFSET, kVal);
333 TEST_F(IrqTest, MaskedConfigTriggerGeneralError) {
334 SCOPED_TRACE(
"IrqTest.MaskedConfigTriggerGeneralError");
335 constexpr uint32_t kVal = 0xABABABAB;
336 ExpectIrqTriggerMaskedDisable(kVal);