blob: 2dbf9dc3bc4de6bb26174411541502ed2da8b673 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "as370-gpio.h"
#include <fbl/algorithm.h>
#include <lib/mock-function/mock-function.h>
#include <mock-mmio-reg/mock-mmio-reg.h>
#include <zxtest/zxtest.h>
namespace gpio {
class As370GpioTest : public As370Gpio {
public:
As370GpioTest()
: As370Gpio(nullptr, ddk::MmioBuffer({}), ddk::MmioBuffer({}), ddk::MmioBuffer({})),
mock_pinmux_regs_(pinmux_reg_array_, sizeof(uint32_t), fbl::count_of(pinmux_reg_array_)),
mock_gpio1_regs_(gpio1_reg_array_, sizeof(uint32_t), fbl::count_of(gpio1_reg_array_)),
mock_gpio2_regs_(gpio2_reg_array_, sizeof(uint32_t), fbl::count_of(gpio2_reg_array_)) {
pinmux_mmio_ = ddk::MmioBuffer(mock_pinmux_regs_.GetMmioBuffer());
gpio1_mmio_ = ddk::MmioBuffer(mock_gpio1_regs_.GetMmioBuffer());
gpio2_mmio_ = ddk::MmioBuffer(mock_gpio2_regs_.GetMmioBuffer());
}
void VerifyAll() {
mock_pinmux_regs_.VerifyAll();
mock_gpio1_regs_.VerifyAll();
mock_gpio2_regs_.VerifyAll();
mock_gpio_impl_write_.VerifyAndClear();
}
ddk_mock::MockMmioRegRegion& mock_pinmux_regs() { return mock_pinmux_regs_; }
ddk_mock::MockMmioRegRegion& mock_gpio1_regs() { return mock_gpio1_regs_; }
ddk_mock::MockMmioRegRegion& mock_gpio2_regs() { return mock_gpio2_regs_; }
auto& mock_GpioImplWrite() { return mock_gpio_impl_write_; }
zx_status_t GpioImplWrite(uint32_t index, uint8_t value) override {
if (mock_gpio_impl_write_.HasExpectations()) {
return mock_gpio_impl_write_.Call(index, value);
} else {
return As370Gpio::GpioImplWrite(index, value);
}
}
private:
ddk_mock::MockMmioReg pinmux_reg_array_[64];
ddk_mock::MockMmioReg gpio1_reg_array_[128];
ddk_mock::MockMmioReg gpio2_reg_array_[128];
ddk_mock::MockMmioRegRegion mock_pinmux_regs_;
ddk_mock::MockMmioRegRegion mock_gpio1_regs_;
ddk_mock::MockMmioRegRegion mock_gpio2_regs_;
mock_function::MockFunction<zx_status_t, uint32_t, uint8_t> mock_gpio_impl_write_;
};
TEST(As370GpioTest, ConfigIn) {
As370GpioTest dut;
dut.mock_gpio1_regs()[0x04]
.ExpectRead(0xdeadbeef)
.ExpectWrite(0xdeadbeee)
.ExpectRead(0xabcd1234)
.ExpectWrite(0xabcd0234)
.ExpectRead(0xfedc1234)
.ExpectWrite(0x7edc1234);
dut.mock_gpio2_regs()[0x04]
.ExpectRead(0xabcd4321)
.ExpectWrite(0xabcd4320)
.ExpectRead(0xcc7a2c98)
.ExpectWrite(0xc47a2c98)
.ExpectRead(0x89ab0123)
.ExpectWrite(0x09ab0123);
EXPECT_OK(dut.GpioImplConfigIn(0, GPIO_NO_PULL));
EXPECT_OK(dut.GpioImplConfigIn(12, GPIO_NO_PULL));
EXPECT_OK(dut.GpioImplConfigIn(31, GPIO_NO_PULL));
EXPECT_OK(dut.GpioImplConfigIn(32, GPIO_NO_PULL));
EXPECT_OK(dut.GpioImplConfigIn(59, GPIO_NO_PULL));
EXPECT_OK(dut.GpioImplConfigIn(63, GPIO_NO_PULL));
EXPECT_NE(ZX_OK, dut.GpioImplConfigIn(64, GPIO_NO_PULL));
dut.VerifyAll();
}
TEST(As370GpioTest, ConfigOut) {
As370GpioTest dut;
dut.mock_GpioImplWrite()
.ExpectCall(ZX_OK, 0, 0)
.ExpectCall(ZX_OK, 20, 1)
.ExpectCall(ZX_OK, 31, 0)
.ExpectCall(ZX_OK, 32, 1)
.ExpectCall(ZX_OK, 39, 0)
.ExpectCall(ZX_OK, 63, 1);
dut.mock_gpio1_regs()[0x04]
.ExpectRead(0xc8e4dc3c)
.ExpectWrite(0xc8e4dc3d)
.ExpectRead(0x89226125)
.ExpectWrite(0x89326125)
.ExpectRead(0x19b21f13)
.ExpectWrite(0x99b21f13);
dut.mock_gpio2_regs()[0x04]
.ExpectRead(0x9f5f0d82)
.ExpectWrite(0x9f5f0d83)
.ExpectRead(0x4b012478)
.ExpectWrite(0x4b0124f8)
.ExpectRead(0x468529a9)
.ExpectWrite(0xc68529a9);
EXPECT_OK(dut.GpioImplConfigOut(0, 0));
EXPECT_OK(dut.GpioImplConfigOut(20, 1));
EXPECT_OK(dut.GpioImplConfigOut(31, 0));
EXPECT_OK(dut.GpioImplConfigOut(32, 1));
EXPECT_OK(dut.GpioImplConfigOut(39, 0));
EXPECT_OK(dut.GpioImplConfigOut(63, 1));
EXPECT_NE(ZX_OK, dut.GpioImplConfigOut(64, 0));
dut.VerifyAll();
}
TEST(As370GpioTest, SetAltFunction) {
As370GpioTest dut;
dut.mock_pinmux_regs()[0x40].ExpectRead(0x7a695363).ExpectWrite(0x7a695367);
dut.mock_pinmux_regs()[0x44].ExpectRead(0x647b8955).ExpectWrite(0x649b8955);
dut.mock_pinmux_regs()[0x48].ExpectRead(0xac20b39d).ExpectWrite(0xac2cb39d);
dut.mock_pinmux_regs()[0x54].ExpectRead(0x2bfc508b).ExpectWrite(0x2b1c508b);
dut.mock_pinmux_regs()[0x48].ExpectRead(0x833d4afc).ExpectWrite(0x833d4b7c);
dut.mock_pinmux_regs()[0x48].ExpectRead(0xcd0f533b).ExpectWrite(0xcd0cd33b);
EXPECT_OK(dut.GpioImplSetAltFunction(0, 7));
EXPECT_OK(dut.GpioImplSetAltFunction(17, 4));
EXPECT_OK(dut.GpioImplSetAltFunction(18, 3));
EXPECT_OK(dut.GpioImplSetAltFunction(49, 0));
EXPECT_OK(dut.GpioImplSetAltFunction(68, 5));
EXPECT_OK(dut.GpioImplSetAltFunction(71, 1));
EXPECT_NE(ZX_OK, dut.GpioImplSetAltFunction(72, 0));
EXPECT_NE(ZX_OK, dut.GpioImplSetAltFunction(0, 8));
dut.VerifyAll();
}
TEST(As370GpioTest, Read) {
As370GpioTest dut;
dut.mock_gpio1_regs()[0x50].ExpectRead(0x833d4b7c).ExpectRead(0xa66346fe).ExpectRead(0x2962e9ab);
dut.mock_gpio2_regs()[0x50].ExpectRead(0x7054a9e7).ExpectRead(0xe5770561).ExpectRead(0xbd4bfdec);
uint8_t value;
EXPECT_OK(dut.GpioImplRead(0, &value));
EXPECT_EQ(0, value);
EXPECT_OK(dut.GpioImplRead(17, &value));
EXPECT_EQ(1, value);
EXPECT_OK(dut.GpioImplRead(31, &value));
EXPECT_EQ(0, value);
EXPECT_OK(dut.GpioImplRead(32, &value));
EXPECT_EQ(1, value);
EXPECT_OK(dut.GpioImplRead(55, &value));
EXPECT_EQ(0, value);
EXPECT_OK(dut.GpioImplRead(63, &value));
EXPECT_EQ(1, value);
EXPECT_NE(ZX_OK, dut.GpioImplRead(64, &value));
dut.VerifyAll();
}
TEST(As370GpioTest, Write) {
As370GpioTest dut;
dut.mock_gpio1_regs()[0x00]
.ExpectRead(0xfff6b928)
.ExpectWrite(0xfff6b929)
.ExpectRead(0x6a246060)
.ExpectWrite(0x6a246060)
.ExpectRead(0xaab6b6b7)
.ExpectWrite(0xaab6b6b7);
dut.mock_gpio2_regs()[0x00]
.ExpectRead(0x8a22ff3b)
.ExpectWrite(0x8a22ff3a)
.ExpectRead(0x07e37cb7)
.ExpectWrite(0x07e37db7)
.ExpectRead(0x833d4b7c)
.ExpectWrite(0x033d4b7c);
EXPECT_OK(dut.GpioImplWrite(0, 0x9c));
EXPECT_OK(dut.GpioImplWrite(12, 0x00));
EXPECT_OK(dut.GpioImplWrite(31, 0x1e));
EXPECT_OK(dut.GpioImplWrite(32, 0x00));
EXPECT_OK(dut.GpioImplWrite(40, 0xba));
EXPECT_OK(dut.GpioImplWrite(63, 0x00));
EXPECT_NE(ZX_OK, dut.GpioImplWrite(64, 0));
dut.VerifyAll();
}
} // namespace gpio