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 using System;
8 using System.Collections.Generic;
9 using Antmicro.Renode.Core;
10 using Antmicro.Renode.Core.Structure;
11 using Antmicro.Renode.Core.Structure.Registers;
12 using Antmicro.Renode.Exceptions;
13 using Antmicro.Renode.Logging;
14 using Antmicro.Renode.Peripherals.Bus;
15 using Antmicro.Renode.Peripherals.SPI;
16 using Antmicro.Renode.Utilities;
17 using Antmicro.Renode.Peripherals.UART.Silabs;
18 
19 namespace Antmicro.Renode.Peripherals.UART
20 {
21     [AllowedTranslations(AllowedTranslation.ByteToDoubleWord | AllowedTranslation.DoubleWordToByte)]
22     public class EFR32xG22_USART : EFR32_GenericUSART, IDoubleWordPeripheral
23     {
EFR32xG22_USART(IMachine machine, uint clockFrequency = 19000000)24         public EFR32xG22_USART(IMachine machine, uint clockFrequency = 19000000) : base(machine, clockFrequency)
25         {
26             var registersMap = new Dictionary<long, DoubleWordRegister>
27             {
28                 {(long)Registers.IpVersion, new DoubleWordRegister(this)
29                     .WithTag("IPVERSION", 0, 32)
30                 },
31                 {(long)Registers.Enable, new DoubleWordRegister(this)
32                     .WithTaggedFlag("ENABLE", 0)
33                     .WithReservedBits(1, 31)
34                 },
35                 {(long)Registers.Control, GenerateControlRegister()},
36                 {(long)Registers.FrameFormat, GenerateFrameFormatRegister()},
37                 {(long)Registers.TriggerControl, GenerateTriggerControlRegister()},
38                 {(long)Registers.Command, GenerateCommandRegister()},
39                 {(long)Registers.Status, GenerateStatusRegister()},
40                 {(long)Registers.ClockControl, GenerateClockControlRegister()},
41                 {(long)Registers.RxBufferDataExtended, GenerateRxBufferDataExtendedRegister()},
42                 {(long)Registers.RxBufferData, GenerateRxBufferDataRegister()},
43                 {(long)Registers.RxBufferDoubleDataExtended, GenerateRxBufferDoubleDataExtendedRegister()},
44                 {(long)Registers.RxBufferDoubleData, GenerateRxBufferDoubleDataRegister()},
45                 {(long)Registers.RxBufferDataExtendedPeek, GenerateRxBufferDataExtendedPeekRegister()},
46                 {(long)Registers.RxBufferDoubleDataExtendedPeek, GenerateRxBufferDoubleDataExtendedPeekRegister()},
47                 {(long)Registers.TxBufferDataExtended, GenerateTxBufferDataExtendedRegister()},
48                 {(long)Registers.TxBufferData, GenerateTxBufferDataRegister()},
49                 {(long)Registers.TxBufferDoubleDataExtended, GenerateTxBufferDoubleDataExtendedRegister()},
50                 {(long)Registers.TxBufferDoubleData, GenerateTxBufferDoubleDataRegister()},
51                 {(long)Registers.InterruptFlag, GenerateInterruptFlagRegister()},
52                 {(long)Registers.InterruptEnable, GenerateInterruptEnableRegister()},
53                 {(long)Registers.IrDAControl, GenerateIrDAControlRegister()},
54                 {(long)Registers.I2SControl, GenerateI2SControlRegister()},
55                 {(long)Registers.Timing, GenerateTimingRegister()},
56                 {(long)Registers.ControlExtended, GenerateControlExtendedRegister()},
57                 {(long)Registers.TimeCompare0, GenerateTimeCompare0Register()},
58                 {(long)Registers.TimeCompare1, GenerateTimeCompare1Register()},
59                 {(long)Registers.TimeCompare2, GenerateTimeCompare2Register()},
60             };
61             registers = new DoubleWordRegisterCollection(this, registersMap);
62         }
63 
ReadDoubleWord(long offset)64         public uint ReadDoubleWord(long offset)
65         {
66             return registers.Read(offset);
67         }
68 
WriteDoubleWord(long address, uint value)69         public void WriteDoubleWord(long address, uint value)
70         {
71             registers.Write(address, value);
72         }
73 
Reset()74         public override void Reset()
75         {
76             base.Reset();
77         }
78 
79         private enum Registers
80         {
81             IpVersion = 0x0,
82             Enable = 0x4,
83             Control = 0x8,
84             FrameFormat = 0xC,
85             TriggerControl = 0x10,
86             Command = 0x14,
87             Status = 0x18,
88             ClockControl = 0x1C,
89             RxBufferDataExtended = 0x20,
90             RxBufferData = 0x24,
91             RxBufferDoubleDataExtended = 0x28,
92             RxBufferDoubleData = 0x2C,
93             RxBufferDataExtendedPeek = 0x30,
94             RxBufferDoubleDataExtendedPeek = 0x34,
95             TxBufferDataExtended = 0x38,
96             TxBufferData = 0x3C,
97             TxBufferDoubleDataExtended = 0x40,
98             TxBufferDoubleData = 0x44,
99             InterruptFlag = 0x48,
100             InterruptEnable = 0x4C,
101             IrDAControl = 0x50,
102             I2SControl = 0x54,
103             Timing = 0x58,
104             ControlExtended = 0x5c,
105             TimeCompare0 = 0x60,
106             TimeCompare1 = 0x64,
107             TimeCompare2 = 0x68,
108         }
109 
110         private readonly DoubleWordRegisterCollection registers;
111     }
112 }
113