5 #include "sw/device/silicon_creator/lib/drivers/uart.h"
9 #include "gtest/gtest.h"
12 #include "sw/device/lib/base/mock_abs_mmio.h"
13 #include "sw/device/silicon_creator/testing/rom_test.h"
16 #include "uart_regs.h"
18 namespace uart_unittest {
27 uint64_t ibex_mcycle() {
29 clock_gettime(CLOCK_MONOTONIC, &tp);
30 return tp.tv_sec * 1000000 + tp.tv_nsec / 1000;
37 const std::vector<uint8_t> kBytesArray = {
38 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'a',
39 'b',
'c',
'd',
'e',
'f',
'g',
'h',
'i',
'j',
'k',
'l',
40 'm',
'n',
'o',
'p',
'q',
'r',
's',
't',
'u',
'v',
46 rom_test::MockAbsMmio mmio_;
48 void ExpectDeviceReset() {
49 EXPECT_ABS_WRITE32(base_ + UART_CTRL_REG_OFFSET, 0);
50 EXPECT_ABS_WRITE32(base_ + UART_FIFO_CTRL_REG_OFFSET,
52 {UART_FIFO_CTRL_RXRST_BIT,
true},
53 {UART_FIFO_CTRL_TXRST_BIT,
true},
55 EXPECT_ABS_WRITE32(base_ + UART_OVRD_REG_OFFSET, 0);
56 EXPECT_ABS_WRITE32(base_ + UART_TIMEOUT_CTRL_REG_OFFSET, 0);
57 EXPECT_ABS_WRITE32(base_ + UART_INTR_ENABLE_REG_OFFSET, 0);
58 EXPECT_ABS_WRITE32(base_ + UART_INTR_STATE_REG_OFFSET,
59 std::numeric_limits<uint32_t>::max());
68 EXPECT_ABS_WRITE32(base_ + UART_CTRL_REG_OFFSET,
70 {UART_CTRL_TX_BIT,
true},
71 {UART_CTRL_NCO_OFFSET, 1},
73 EXPECT_ABS_WRITE32(base_ + UART_INTR_ENABLE_REG_OFFSET, 0);
87 ASSERT_LE(num_elements, kBytesArray.size());
88 for (
int i = 0; i < num_elements; ++i) {
89 uint32_t value =
static_cast<uint32_t
>(kBytesArray[i]);
90 EXPECT_ABS_READ32(base_ + UART_STATUS_REG_OFFSET,
91 {{UART_STATUS_TXFULL_BIT,
false}});
92 EXPECT_ABS_WRITE32(base_ + UART_WDATA_REG_OFFSET, value);
93 EXPECT_ABS_READ32(base_ + UART_STATUS_REG_OFFSET,
94 {{UART_STATUS_TXIDLE_BIT,
true}});
99 TEST_F(BytesSendTest, SendBuffer) {
102 uart_write(kBytesArray.data(), kBytesArray.size());
105 TEST_F(BytesSendTest, SendByteBusy) {
107 EXPECT_ABS_READ32(base_ + UART_STATUS_REG_OFFSET,
108 {{UART_STATUS_TXFULL_BIT,
true}});
109 EXPECT_ABS_READ32(base_ + UART_STATUS_REG_OFFSET,
110 {{UART_STATUS_TXFULL_BIT,
false}});
113 EXPECT_ABS_WRITE32(base_ + UART_WDATA_REG_OFFSET,
'X');
116 EXPECT_ABS_READ32(base_ + UART_STATUS_REG_OFFSET,
117 {{UART_STATUS_TXIDLE_BIT,
false}});
118 EXPECT_ABS_READ32(base_ + UART_STATUS_REG_OFFSET,
119 {{UART_STATUS_TXIDLE_BIT,
true}});
124 TEST_F(UartTest, RecvByte) {
125 EXPECT_ABS_READ32(base_ + UART_STATUS_REG_OFFSET,
126 {{UART_STATUS_RXEMPTY_BIT,
false}});
127 EXPECT_ABS_READ32(base_ + UART_RDATA_REG_OFFSET,
'A');
128 int result = uart_getchar(1);
129 EXPECT_EQ(result,
'A');
132 TEST_F(UartTest, RecvTimeout) {
135 EXPECT_CALL(::rom_test::MockAbsMmio::Instance(),
136 Read32(base_ + UART_STATUS_REG_OFFSET))
137 .WillRepeatedly(testing::Return(
138 mock_mmio::ToInt<uint32_t>({{UART_STATUS_RXEMPTY_BIT,
true}})));
139 int result = uart_getchar(1);
140 EXPECT_EQ(result, -1);
143 TEST_F(UartTest, BreakDetect) {
147 EXPECT_CALL(::rom_test::MockAbsMmio::Instance(),
148 Read32(base_ + UART_VAL_REG_OFFSET))
149 .WillRepeatedly(testing::Return(mock_mmio::ToInt<uint32_t>(0)));
154 TEST_F(UartTest, NoBreakDetect) {
158 EXPECT_ABS_READ32(base_ + UART_VAL_REG_OFFSET, 1);