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