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 }