blob: b51f323b02fb9cb216f9bf69b85c9d84f6c61926 [file] [log] [blame]
// Copyright 2020 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 <lib/uart/amlogic.h>
#include <lib/uart/mock.h>
#include <lib/uart/uart.h>
#include <zxtest/zxtest.h>
namespace {
using SimpleTestDriver =
uart::KernelDriver<uart::amlogic::Driver, uart::mock::IoProvider, uart::UnsynchronizedPolicy>;
constexpr zbi_dcfg_simple_t kTestConfig = {};
void ExpectInit(SimpleTestDriver& driver) {
driver.io()
.mock()
.ExpectRead(uint32_t{0b1001'0000'0000'0000'1000'0000'0000'0000}, 0x8) // Initial settings.
// Non-interrupt settings are preserved on Init().
.ExpectWrite(uint32_t{0b1000'0001'1100'0000'1011'0000'0000'0000}, 0x8) // Init Reset
// Non-interrupt settings are preserved on Init().
.ExpectWrite(uint32_t{0b1000'0000'0000'0000'1011'0000'0000'0000},
0x8); // Init - Cleare reset
}
TEST(AmlogicTests, HelloWorld) {
SimpleTestDriver driver(kTestConfig);
ExpectInit(driver);
driver.io()
.mock()
.ExpectRead(uint32_t{0b0000'0000'0000'0000'0011'1111'0000'0000}, 0xc) // TxReady -> 1
.ExpectWrite(uint32_t{'h'}, 0x0) // Write
.ExpectRead(uint32_t{0b0000'0000'0000'0000'0100'0000'0000'0000}, 0xc) // TxReady -> 0
.ExpectRead(uint32_t{0b0000'0000'0000'0000'0011'1111'0000'0000}, 0xc) // TxReady -> 1
.ExpectWrite(uint32_t{'i'}, 0x0) // Write
// There is room to transmit two characters now.
.ExpectRead(uint32_t{0b0000'0000'0000'0000'0011'1110'0000'0000}, 0xc) // TxReady -> 2
.ExpectWrite(uint32_t{'\r'}, 0x0) // Write
.ExpectWrite(uint32_t{'\n'}, 0x0); // Write
driver.Init();
EXPECT_EQ(3, driver.Write("hi\n"));
}
TEST(AmlogicTests, Read) {
SimpleTestDriver driver(kTestConfig);
ExpectInit(driver);
driver.io()
.mock()
.ExpectRead(uint32_t{0b0000'0000'0000'0000'0011'1101'0000'0000}, 0xc) // TxReady -> 3
.ExpectWrite(uint32_t{'?'}, 0x0) // Write
.ExpectWrite(uint32_t{'\r'}, 0x0) // Write
.ExpectWrite(uint32_t{'\n'}, 0x0) // Write
.ExpectRead(uint32_t{0b0000'0000'0001'0000'0000'0000'0000'0000}, 0xc) // Read (rx_fifo_empty)
.ExpectRead(uint32_t{0b0000'0000'0000'0000'0000'0000'0000'0000},
0xc) // Read (!rx_fifo_empty)
.ExpectRead(uint32_t{'q'}, 0x4) // Read (data)
.ExpectRead(uint32_t{0b0000'0000'0000'0000'0000'0000'0000'0000},
0xc) // Read (!rx_fifo_empty)
.ExpectRead(uint32_t{'\r'}, 0x4); // Read (data)
driver.Init();
EXPECT_EQ(2, driver.Write("?\n"));
EXPECT_EQ(std::optional<uint32_t>{}, driver.Read());
EXPECT_EQ(uint32_t{'q'}, driver.Read());
EXPECT_EQ(uint32_t{'\r'}, driver.Read());
}
} // namespace