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