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.Collections.Generic; 8 using Antmicro.Renode.Core; 9 using Antmicro.Renode.Peripherals.Bus; 10 using Antmicro.Renode.Core.Structure.Registers; 11 12 namespace Antmicro.Renode.Peripherals.I2C 13 { 14 public class EFR32xG2_I2CController : EFR32_GenericI2CController, IDoubleWordPeripheral 15 { EFR32xG2_I2CController(IMachine machine)16 public EFR32xG2_I2CController(IMachine machine) : base(machine) 17 { 18 var map = new Dictionary<long, DoubleWordRegister> 19 { 20 {(long)Registers.IpVersion, new DoubleWordRegister(this) 21 .WithTag("IPVERSION", 0, 32) 22 }, 23 {(long)Registers.Enable, new DoubleWordRegister(this) 24 .WithTaggedFlag("ENABLE", 0) 25 .WithReservedBits(1, 31) 26 }, 27 {(long)Registers.Control, GenerateControlRegister()}, 28 {(long)Registers.Command, GenerateCommandRegister()}, 29 {(long)Registers.State, GenerateStateRegister()}, 30 {(long)Registers.Status, GenerateStatusRegister()}, 31 {(long)Registers.ClockDivision, GenerateClockDivisionRegister()}, 32 {(long)Registers.SlaveAddress, GenerateSlaveAddressRegister()}, 33 {(long)Registers.SlaveAddressMask, GenerateSlaveAddressMaskRegister()}, 34 {(long)Registers.ReceiveBufferData, GenerateReceiveBufferDataRegister()}, 35 {(long)Registers.ReceiveBufferDoubleData, GenerateReceiveBufferDoubleDataRegister()}, 36 {(long)Registers.ReceiveBufferDataPeek, GenerateReceiveBufferDataPeekRegister()}, 37 {(long)Registers.ReceiveBufferDoubleDataPeek, GenerateReceiveBufferDoubleDataPeekRegister()}, 38 {(long)Registers.TransmitBufferData, GenerateTransmitBufferDataRegister()}, 39 {(long)Registers.TransmitBufferDoubleData, GenerateTransmitBufferDoubleDataRegister()}, 40 {(long)Registers.InterruptFlag, GenerateInterruptFlagRegister()}, 41 {(long)Registers.InterruptEnable, GenerateInterruptEnableRegister()}, 42 {(long)Registers.InterruptFlagClear, GenerateInterruptFlagClearRegister()}, 43 }; 44 registers = new DoubleWordRegisterCollection(this, map); 45 } 46 ReadDoubleWord(long offset)47 public uint ReadDoubleWord(long offset) 48 { 49 return registers.Read(offset); 50 } 51 WriteDoubleWord(long offset, uint value)52 public void WriteDoubleWord(long offset, uint value) 53 { 54 registers.Write(offset, value); 55 } 56 Reset()57 public override void Reset() 58 { 59 base.Reset(); 60 registers.Reset(); 61 } 62 63 private readonly DoubleWordRegisterCollection registers; 64 65 private enum Registers 66 { 67 IpVersion = 0x0, 68 Enable = 0x4, 69 Control = 0x08, 70 Command = 0x0C, 71 State = 0x10, 72 Status = 0x14, 73 ClockDivision = 0x18, 74 SlaveAddress = 0x1C, 75 SlaveAddressMask = 0x20, 76 ReceiveBufferData = 0x24, 77 ReceiveBufferDoubleData = 0x28, 78 ReceiveBufferDataPeek = 0x2C, 79 ReceiveBufferDoubleDataPeek = 0x30, 80 TransmitBufferData = 0x34, 81 TransmitBufferDoubleData = 0x38, 82 InterruptFlag = 0x3C, 83 InterruptEnable = 0x40, 84 InterruptFlagClear = 0x203C 85 } 86 } 87 } 88