1 //
2 // Copyright (c) 2010-2023 Antmicro
3 //
4 // This file is licensed under the MIT License.
5 // Full license text is available in 'licenses/MIT.txt'.
6 //
7 
8 using System;
9 using NUnit.Framework;
10 using Antmicro.Renode.Core;
11 using Antmicro.Renode.Time;
12 using Antmicro.Renode.Peripherals.UART;
13 
14 namespace Antmicro.Renode.UnitTests
15 {
16     [TestFixture]
17     public class Cadence_UARTTests
18     {
19         [OneTimeSetUp]
CreatePeripheral()20         public void CreatePeripheral()
21         {
22             machine = new Machine();
23         }
24 
25         [Test]
ShouldClearInterruptStatusOnWriteOne()26         public void ShouldClearInterruptStatusOnWriteOne()
27         {
28             var uart = new Cadence_UART(machine, clearInterruptStatusOnRead: false);
29             uart.Reset();
30             EnableRx(uart);
31 
32             Assert.AreEqual(FlagsInitial, ReadInterruptStatus(uart));
33 
34             uart.WriteChar(0);
35             Assert.AreEqual(FlagsAfterCharWrite, ReadInterruptStatus(uart));
36             Assert.AreEqual(FlagsAfterCharWrite, ReadInterruptStatus(uart));
37 
38             WriteInterruptStatus(uart, FlagsAfterCharWrite);
39             Assert.AreEqual(InterruptFlag.TxFifoEmpty, ReadInterruptStatus(uart));
40         }
41 
42         [Test]
ShouldClearInterruptStatusOnRead()43         public void ShouldClearInterruptStatusOnRead()
44         {
45             var uart = new Cadence_UART(machine, clearInterruptStatusOnRead: true);
46             uart.Reset();
47             EnableRx(uart);
48 
49             Assert.AreEqual(FlagsInitial, ReadInterruptStatus(uart));
50 
51             uart.WriteChar(0);
52             Assert.AreEqual(FlagsAfterCharWrite, ReadInterruptStatus(uart));
53             Assert.AreEqual(InterruptFlag.TxFifoEmpty, ReadInterruptStatus(uart));
54         }
55 
EnableRx(Cadence_UART uart)56         private void EnableRx(Cadence_UART uart)
57         {
58             uart.WriteDoubleWord((long)Registers.Control, FlagEnableRx);
59         }
60 
WriteInterruptStatus(Cadence_UART uart, InterruptFlag statusFlags)61         private void WriteInterruptStatus(Cadence_UART uart, InterruptFlag statusFlags)
62         {
63             uart.WriteDoubleWord((long)Registers.ChannelInterruptStatus, (uint)statusFlags);
64         }
65 
ReadInterruptStatus(Cadence_UART uart)66         private InterruptFlag ReadInterruptStatus(Cadence_UART uart)
67         {
68             return (InterruptFlag)uart.ReadDoubleWord((long)Registers.ChannelInterruptStatus);
69         }
70 
71         private IMachine machine;
72 
73         private const uint FlagEnableRx = 1 << 2;
74         private const InterruptFlag FlagsInitial = InterruptFlag.TxFifoEmpty | InterruptFlag.RxFifoEmpty;
75         private const InterruptFlag FlagsAfterCharWrite = InterruptFlag.RxTimeoutError | FlagsInitial;
76 
77         [Flags]
78         private enum InterruptFlag : uint
79         {
80             RxTimeoutError = 1 << 8,
81             TxFifoEmpty = 1 << 3,
82             RxFifoEmpty = 1 << 1
83         }
84 
85         private enum Registers
86         {
87             Control = 0x00,
88             Mode = 0x04,
89             InterruptEnable = 0x08,
90             InterruptDisable = 0x0c,
91             InterruptMask = 0x10,
92             ChannelInterruptStatus = 0x14
93         }
94     }
95 }