7 #include "gtest/gtest.h"
9 #include "sw/device/lib/base/mock_mmio.h"
12 #include "uart_regs.h"
14 namespace dif_uart_unittest {
22 const std::vector<uint8_t> kBytesArray = {
23 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'a',
24 'b',
'c',
'd',
'e',
'f',
'g',
'h',
'i',
'j',
'k',
'l',
25 'm',
'n',
'o',
'p',
'q',
'r',
's',
't',
'u',
'v',
30 void ExpectDeviceReset() {
31 EXPECT_WRITE32(UART_CTRL_REG_OFFSET, 0);
32 EXPECT_WRITE32(UART_FIFO_CTRL_REG_OFFSET,
34 {UART_FIFO_CTRL_RXRST_BIT,
true},
35 {UART_FIFO_CTRL_TXRST_BIT,
true},
37 EXPECT_WRITE32(UART_OVRD_REG_OFFSET, 0);
38 EXPECT_WRITE32(UART_TIMEOUT_CTRL_REG_OFFSET, 0);
39 EXPECT_WRITE32(UART_INTR_ENABLE_REG_OFFSET, 0);
40 EXPECT_WRITE32(UART_INTR_STATE_REG_OFFSET,
41 std::numeric_limits<uint32_t>::max());
45 .base_addr = dev().region(),
53 .clk_freq_hz = 1048576,
67 TEST_F(ConfigTest, BadRxBreakLevel) {
73 TEST_F(ConfigTest, DefaultTxRxEnabled) {
75 EXPECT_WRITE32(UART_CTRL_REG_OFFSET, {
76 {UART_CTRL_TX_BIT,
true},
77 {UART_CTRL_RX_BIT,
true},
78 {UART_CTRL_NCO_OFFSET, 1},
80 EXPECT_WRITE32(UART_INTR_ENABLE_REG_OFFSET, 0);
84 TEST_F(ConfigTest, DefaultTxEnabled) {
86 EXPECT_WRITE32(UART_CTRL_REG_OFFSET, {
87 {UART_CTRL_TX_BIT,
true},
88 {UART_CTRL_NCO_OFFSET, 1},
90 EXPECT_WRITE32(UART_INTR_ENABLE_REG_OFFSET, 0);
95 TEST_F(ConfigTest, DefaultRxEnabled) {
97 EXPECT_WRITE32(UART_CTRL_REG_OFFSET, {
98 {UART_CTRL_RX_BIT,
true},
99 {UART_CTRL_NCO_OFFSET, 1},
101 EXPECT_WRITE32(UART_INTR_ENABLE_REG_OFFSET, 0);
106 TEST_F(ConfigTest, DefaultTxRxDisabled) {
108 EXPECT_WRITE32(UART_CTRL_REG_OFFSET, {{UART_CTRL_NCO_OFFSET, 1}});
109 EXPECT_WRITE32(UART_INTR_ENABLE_REG_OFFSET, 0);
115 TEST_F(ConfigTest, ParityEven) {
121 EXPECT_WRITE32(UART_CTRL_REG_OFFSET, {
122 {UART_CTRL_TX_BIT,
true},
123 {UART_CTRL_RX_BIT,
true},
124 {UART_CTRL_PARITY_EN_BIT,
true},
125 {UART_CTRL_NCO_OFFSET, 1},
128 EXPECT_WRITE32(UART_INTR_ENABLE_REG_OFFSET, 0);
133 TEST_F(ConfigTest, ParityOdd) {
139 EXPECT_WRITE32(UART_CTRL_REG_OFFSET, {
140 {UART_CTRL_TX_BIT,
true},
141 {UART_CTRL_RX_BIT,
true},
142 {UART_CTRL_PARITY_EN_BIT,
true},
143 {UART_CTRL_PARITY_ODD_BIT,
true},
144 {UART_CTRL_NCO_OFFSET, 1},
147 EXPECT_WRITE32(UART_INTR_ENABLE_REG_OFFSET, 0);
159 TEST_F(RxBreakLevelSetTest, Success) {
160 EXPECT_MASK32(UART_CTRL_REG_OFFSET,
162 {UART_CTRL_RXBLVL_OFFSET, UART_CTRL_RXBLVL_MASK,
163 UART_CTRL_RXBLVL_VALUE_BREAK2},
167 EXPECT_MASK32(UART_CTRL_REG_OFFSET,
169 {UART_CTRL_RXBLVL_OFFSET, UART_CTRL_RXBLVL_MASK,
170 UART_CTRL_RXBLVL_VALUE_BREAK16},
187 EXPECT_MASK32(UART_FIFO_CTRL_REG_OFFSET,
189 {UART_FIFO_CTRL_RXILVL_OFFSET, UART_FIFO_CTRL_RXILVL_MASK,
190 UART_FIFO_CTRL_RXILVL_VALUE_RXLVL1},
194 EXPECT_MASK32(UART_FIFO_CTRL_REG_OFFSET,
196 {UART_FIFO_CTRL_RXILVL_OFFSET, UART_FIFO_CTRL_RXILVL_MASK,
197 UART_FIFO_CTRL_RXILVL_VALUE_RXLVL62},
208 TEST_F(WatermarkTxSetTest, InvalidWatermark) {
217 EXPECT_MASK32(UART_FIFO_CTRL_REG_OFFSET,
219 {UART_FIFO_CTRL_TXILVL_OFFSET, UART_FIFO_CTRL_TXILVL_MASK,
220 UART_FIFO_CTRL_TXILVL_VALUE_TXLVL1},
224 EXPECT_MASK32(UART_FIFO_CTRL_REG_OFFSET,
226 {UART_FIFO_CTRL_TXILVL_OFFSET, UART_FIFO_CTRL_TXILVL_MASK,
227 UART_FIFO_CTRL_TXILVL_VALUE_TXLVL16},
239 TEST_F(SetEnableTest, BadEnabled) {
244 TEST_F(SetEnableTest, BadDatapath) {
245 EXPECT_READ32(UART_CTRL_REG_OFFSET, 0);
251 TEST_F(SetEnableTest, SuccessRxEnabledDisabled) {
252 EXPECT_READ32(UART_CTRL_REG_OFFSET, {
253 {UART_CTRL_RX_BIT, 0},
254 {UART_CTRL_TX_BIT, 1},
256 EXPECT_WRITE32(UART_CTRL_REG_OFFSET, {
257 {UART_CTRL_RX_BIT, 1},
258 {UART_CTRL_TX_BIT, 1},
263 EXPECT_READ32(UART_CTRL_REG_OFFSET, {
264 {UART_CTRL_RX_BIT, 1},
265 {UART_CTRL_TX_BIT, 1},
267 EXPECT_WRITE32(UART_CTRL_REG_OFFSET, {
268 {UART_CTRL_RX_BIT, 0},
269 {UART_CTRL_TX_BIT, 1},
275 TEST_F(SetEnableTest, SuccessTxEnabledDisabled) {
276 EXPECT_READ32(UART_CTRL_REG_OFFSET, {
277 {UART_CTRL_RX_BIT, 1},
278 {UART_CTRL_TX_BIT, 0},
280 EXPECT_WRITE32(UART_CTRL_REG_OFFSET, {
281 {UART_CTRL_RX_BIT, 1},
282 {UART_CTRL_TX_BIT, 1},
287 EXPECT_READ32(UART_CTRL_REG_OFFSET, {
288 {UART_CTRL_RX_BIT, 1},
289 {UART_CTRL_TX_BIT, 1},
291 EXPECT_WRITE32(UART_CTRL_REG_OFFSET, {
292 {UART_CTRL_RX_BIT, 1},
293 {UART_CTRL_TX_BIT, 0},
299 TEST_F(SetEnableTest, SuccessRxTxEnabledDisabled) {
300 EXPECT_READ32(UART_CTRL_REG_OFFSET, {
301 {UART_CTRL_RX_BIT, 0},
302 {UART_CTRL_TX_BIT, 0},
304 EXPECT_WRITE32(UART_CTRL_REG_OFFSET, {
305 {UART_CTRL_RX_BIT, 1},
306 {UART_CTRL_TX_BIT, 1},
311 EXPECT_READ32(UART_CTRL_REG_OFFSET, {
312 {UART_CTRL_RX_BIT, 1},
313 {UART_CTRL_TX_BIT, 1},
315 EXPECT_WRITE32(UART_CTRL_REG_OFFSET, {
316 {UART_CTRL_RX_BIT, 0},
317 {UART_CTRL_TX_BIT, 0},
332 ASSERT_LE(num_elements, kBytesArray.size());
333 for (
int i = 0; i < num_elements; ++i) {
334 uint32_t value =
static_cast<uint32_t
>(kBytesArray[i]);
335 EXPECT_READ32(UART_STATUS_REG_OFFSET, 0);
336 EXPECT_WRITE32(UART_WDATA_REG_OFFSET, value);
341 TEST_F(BytesSendTest, NullArgs) {
350 TEST_F(BytesSendTest, TxFifoEmptyBytesWrittenNull) {
353 kBytesArray.size(),
nullptr));
356 TEST_F(BytesSendTest, TxFifoEmpty) {
359 size_t bytes_written;
361 kBytesArray.size(), &bytes_written));
362 EXPECT_EQ(bytes_written, kBytesArray.size());
365 TEST_F(BytesSendTest, TxFifoFull) {
366 EXPECT_READ32(UART_STATUS_REG_OFFSET, {{UART_STATUS_TXFULL_BIT,
true}});
368 size_t bytes_written;
370 kBytesArray.size(), &bytes_written));
371 EXPECT_EQ(bytes_written, 0);
383 for (
int i = 0; i < num_elements; ++i) {
384 uint32_t value =
static_cast<uint32_t
>(kBytesArray[i]);
385 EXPECT_READ32(UART_STATUS_REG_OFFSET, 0);
386 EXPECT_READ32(UART_RDATA_REG_OFFSET, value);
391 TEST_F(BytesReceiveTest, UartNull) {
392 std::vector<uint8_t> receive_bytes(1);
396 EXPECT_THAT(receive_bytes, Each(Eq(0)));
403 TEST_F(BytesReceiveTest, RxFifoFullBytesWrittenNull) {
404 uint8_t num_bytes = kBytesArray.size();
405 ExpectReceiveBytes(num_bytes);
407 std::vector<uint8_t> receive_bytes(num_bytes);
410 EXPECT_EQ(receive_bytes, kBytesArray);
413 TEST_F(BytesReceiveTest, RxFifoFull) {
414 uint8_t num_bytes = kBytesArray.size();
415 ExpectReceiveBytes(num_bytes);
418 std::vector<uint8_t> receive_bytes(num_bytes);
421 EXPECT_EQ(bytes_read, num_bytes);
422 EXPECT_EQ(receive_bytes, kBytesArray);
425 TEST_F(BytesReceiveTest, RxFifoEmpty) {
426 EXPECT_READ32(UART_STATUS_REG_OFFSET, {{UART_STATUS_RXEMPTY_BIT,
true}});
428 uint8_t num_bytes = kBytesArray.size();
431 std::vector<uint8_t> receive_bytes(num_bytes);
434 EXPECT_EQ(bytes_read, 0);
435 EXPECT_THAT(receive_bytes, Each(
Eq(0)));
445 TEST_F(BytesSendPolledTest, Success) {
447 EXPECT_READ32(UART_STATUS_REG_OFFSET, {{UART_STATUS_TXFULL_BIT,
true}});
448 EXPECT_READ32(UART_STATUS_REG_OFFSET, {{UART_STATUS_TXFULL_BIT,
false}});
451 EXPECT_READ32(UART_STATUS_REG_OFFSET, {{UART_STATUS_TXFULL_BIT,
false}});
452 EXPECT_WRITE32(UART_WDATA_REG_OFFSET,
'X');
455 EXPECT_READ32(UART_STATUS_REG_OFFSET, {{UART_STATUS_TXIDLE_BIT,
false}});
456 EXPECT_READ32(UART_STATUS_REG_OFFSET, {{UART_STATUS_TXIDLE_BIT,
true}});
472 TEST_F(BytesReceivePolledTest, Success) {
474 EXPECT_READ32(UART_STATUS_REG_OFFSET, {{UART_STATUS_RXEMPTY_BIT,
true}});
475 EXPECT_READ32(UART_STATUS_REG_OFFSET, {{UART_STATUS_RXEMPTY_BIT,
false}});
478 EXPECT_READ32(UART_STATUS_REG_OFFSET, {{UART_STATUS_RXEMPTY_BIT,
false}});
479 EXPECT_READ32(UART_RDATA_REG_OFFSET,
'X');
483 EXPECT_EQ(
byte,
'X');
497 TEST_F(RxBytesAvailableTest, FifoFull) {
499 EXPECT_READ32(UART_FIFO_STATUS_REG_OFFSET,
507 TEST_F(RxBytesAvailableTest, FifoEmpty) {
509 EXPECT_READ32(UART_FIFO_STATUS_REG_OFFSET,
510 {{UART_FIFO_STATUS_RXLVL_OFFSET, 0}});
514 EXPECT_EQ(num_bytes, 0);
528 TEST_F(TxBytesAvailableTest, FifoFull) {
530 EXPECT_READ32(UART_FIFO_STATUS_REG_OFFSET,
535 EXPECT_EQ(num_bytes, 0);
538 TEST_F(TxBytesAvailableTest, FifoEmpty) {
540 EXPECT_READ32(UART_FIFO_STATUS_REG_OFFSET,
541 {{UART_FIFO_STATUS_TXLVL_OFFSET, 0}});
555 TEST_F(FifoResetTest, Success) {
556 EXPECT_READ32(UART_FIFO_CTRL_REG_OFFSET, 0);
557 EXPECT_WRITE32(UART_FIFO_CTRL_REG_OFFSET, {{UART_FIFO_CTRL_RXRST_BIT,
true}});
560 EXPECT_READ32(UART_FIFO_CTRL_REG_OFFSET, 0);
561 EXPECT_WRITE32(UART_FIFO_CTRL_REG_OFFSET, {{UART_FIFO_CTRL_TXRST_BIT,
true}});
564 EXPECT_READ32(UART_FIFO_CTRL_REG_OFFSET, 0);
565 EXPECT_WRITE32(UART_FIFO_CTRL_REG_OFFSET,
567 {UART_FIFO_CTRL_RXRST_BIT,
true},
568 {UART_FIFO_CTRL_TXRST_BIT,
true},
580 TEST_F(LoopbackSetTest, Success) {
581 EXPECT_MASK32(UART_CTRL_REG_OFFSET, {{UART_CTRL_SLPBK_BIT, 0x1,
true}});
585 EXPECT_MASK32(UART_CTRL_REG_OFFSET, {{UART_CTRL_SLPBK_BIT, 0x1,
false}});
589 EXPECT_MASK32(UART_CTRL_REG_OFFSET, {{UART_CTRL_LLPBK_BIT, 0x1,
true}});
593 EXPECT_MASK32(UART_CTRL_REG_OFFSET, {{UART_CTRL_LLPBK_BIT, 0x1,
false}});
610 TEST_F(RxTimeoutTest, OutOfRange) {
616 TEST_F(RxTimeoutTest, Enable) {
618 const uint32_t duration = 0x123;
619 EXPECT_WRITE32(UART_TIMEOUT_CTRL_REG_OFFSET,
620 {{UART_TIMEOUT_CTRL_VAL_OFFSET, duration},
621 {UART_TIMEOUT_CTRL_EN_BIT,
true}});
625 TEST_F(RxTimeoutTest, Disable) {
628 UART_TIMEOUT_CTRL_REG_OFFSET,
629 {{UART_TIMEOUT_CTRL_VAL_OFFSET, 0}, {UART_TIMEOUT_CTRL_EN_BIT,
false}});
633 TEST_F(RxTimeoutTest, GetStatusOnly) {
635 const uint32_t duration = 0x800000;
636 EXPECT_WRITE32(UART_TIMEOUT_CTRL_REG_OFFSET,
637 {{UART_TIMEOUT_CTRL_VAL_OFFSET, duration},
638 {UART_TIMEOUT_CTRL_EN_BIT,
true}});
643 EXPECT_READ32(UART_TIMEOUT_CTRL_REG_OFFSET,
644 {{UART_TIMEOUT_CTRL_VAL_OFFSET, duration},
645 {UART_TIMEOUT_CTRL_EN_BIT,
true}});
650 TEST_F(RxTimeoutTest, GetAll) {
652 const uint32_t duration = 0xf0f0f0;
653 EXPECT_WRITE32(UART_TIMEOUT_CTRL_REG_OFFSET,
654 {{UART_TIMEOUT_CTRL_VAL_OFFSET, duration},
655 {UART_TIMEOUT_CTRL_EN_BIT,
true}});
661 EXPECT_READ32(UART_TIMEOUT_CTRL_REG_OFFSET,
662 {{UART_TIMEOUT_CTRL_VAL_OFFSET, duration},
663 {UART_TIMEOUT_CTRL_EN_BIT,
true}});
666 EXPECT_EQ(out, duration);