1 //
2 // Copyright (c) 2010-2022 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.Structure.Registers;
9 using Antmicro.Renode.Peripherals.Bus;
10 using Antmicro.Renode.Peripherals.Memory;
11 
12 namespace Antmicro.Renode.Peripherals.Miscellaneous.SiLabs
13 {
14     [AllowedTranslations(AllowedTranslation.ByteToDoubleWord | AllowedTranslation.WordToDoubleWord)]
15     public class EFR32xG12DeviceInformation : DeviceInformation, IDoubleWordPeripheral, IKnownSize
16     {
EFR32xG12DeviceInformation(DeviceFamily deviceFamily, ushort deviceNumber, MappedMemory flashDevice, MappedMemory sramDevice, byte productRevision = 0)17         public EFR32xG12DeviceInformation(DeviceFamily deviceFamily, ushort deviceNumber, MappedMemory flashDevice, MappedMemory sramDevice, byte productRevision = 0)
18             : base(deviceFamily, deviceNumber, flashDevice, sramDevice, productRevision)
19         {
20             registers = BuildRegisters();
21         }
22 
Reset()23         public void Reset()
24         {
25             registers.Reset();
26         }
27 
ReadDoubleWord(long offset)28         public uint ReadDoubleWord(long offset)
29         {
30             return registers.Read(offset);
31         }
32 
WriteDoubleWord(long offset, uint value)33         public void WriteDoubleWord(long offset, uint value)
34         {
35             registers.Write(offset, value);
36         }
37 
38         public long Size => 0x200;
39         public ulong EUI48 { get; set; }
40 
BuildRegisters()41         private DoubleWordRegisterCollection BuildRegisters()
42         {
43             var registerDictionary = new Dictionary<long, DoubleWordRegister>
44             {
45                 {(long)Registers.ModuleInfo, new DoubleWordRegister(this, 0xffffffff)
46                 },
47                 {(long)Registers.SoftwareFix, new DoubleWordRegister(this, 0x1)
48                     .WithTaggedFlag("PARANGE", 0)
49                     .WithTag("SPARE", 1, 31)
50                 },
51                 {(long)Registers.ExtendedUniqueIdentifier48Low, new DoubleWordRegister(this, 0x1)
52                     .WithValueField(0, 24, FieldMode.Read, valueProviderCallback: _ => (uint)(EUI48 >> 24), name: "UNIQUEID")
53                     .WithValueField(24, 8, FieldMode.Read, valueProviderCallback: _ => (uint)(EUI48 >> 16), name: "OUI48L")
54                 },
55                 {(long)Registers.ExtendedUniqueIdentifier48High, new DoubleWordRegister(this, 0x1)
56                     .WithValueField(0, 16, FieldMode.Read, valueProviderCallback: _ => (uint)EUI48, name: "OUI48H")
57                     .WithReservedBits(16, 16)
58                 },
59                 {(long)Registers.MemoryInfo, new DoubleWordRegister(this, 0x17D4C00)
60                     .WithTag("TEMPGRADE", 0, 8)
61                     .WithTag("PKGTYPE", 8, 8)
62                     .WithTag("PINCOUNT", 16, 8)
63                     .WithTag("FLASH_PAGE_SIZE", 24, 8)
64                 },
65                 {(long)Registers.SoftwareCapabilityVector0, new DoubleWordRegister(this, 0x111112)
66                     .WithTag("ZIGBEE", 0, 2)
67                     .WithReservedBits(2, 2)
68                     .WithTag("THREAD", 4, 2)
69                     .WithReservedBits(6, 2)
70                     .WithTag("RF4CE", 8, 2)
71                     .WithReservedBits(10, 2)
72                     .WithTag("BTSMART", 12, 2)
73                     .WithReservedBits(14, 2)
74                     .WithTag("CONNECT", 16, 2)
75                     .WithReservedBits(18, 2)
76                     .WithTag("SRI", 20, 2)
77                     .WithReservedBits(22, 10)
78                 },
79                 {(long)Registers.SoftwareCapabilityVector1, new DoubleWordRegister(this, 0x7)
80                     .WithTaggedFlag("RFMCUEN", 0)
81                     .WithTaggedFlag("NCPEN", 1)
82                     .WithTaggedFlag("GWEN", 2)
83                     .WithReservedBits(3, 29)
84                 },
85                 {(long)Registers.DeviceUniqueNumberLow, new DoubleWordRegister(this)
86                     .WithValueField(0, 32, FieldMode.Read, valueProviderCallback: _ => (uint)(Unique >> 32), name: "UNIQUEL")
87                 },
88                 {(long)Registers.DeviceUniqueNumberHigh, new DoubleWordRegister(this)
89                     .WithValueField(0, 32, FieldMode.Read, valueProviderCallback: _ => (uint)Unique, name: "UNIQUEH")
90                 },
91                 {(long)Registers.MemorySize, new DoubleWordRegister(this)
92                     .WithValueField(0, 16, FieldMode.Read, valueProviderCallback: _ => flashSize, name: "FLASH")
93                     .WithValueField(16, 16, FieldMode.Read, valueProviderCallback: _ => sramSize, name: "SRAM")
94                 },
95                 {(long)Registers.PartDescription, new DoubleWordRegister(this)
96                     .WithValueField(0, 16, FieldMode.Read, valueProviderCallback: _ => deviceNumber, name: "DEVICE_NUMBER")
97                     .WithValueField(16, 8, FieldMode.Read, valueProviderCallback: _ => (uint)deviceFamily, name: "DEVICE_FAMILY")
98                     .WithValueField(24, 8, FieldMode.Read, valueProviderCallback: _ => productRevision, name: "PROD_REV")
99                 },
100                 {(long)Registers.DeviceInformationPageRevision, new DoubleWordRegister(this, 0x1)
101                     .WithTag("DEVINFOREV", 0, 8)
102                     .WithReservedBits(8, 24)
103                 },
104             };
105 
106             return new DoubleWordRegisterCollection(this, registerDictionary);
107         }
108 
109         private readonly DoubleWordRegisterCollection registers;
110 
111         private enum Registers
112         {
113             CRCAndTemperatureCalibration                                                            = 0x000,
114             ModuleInfo                                                                              = 0x004,
115             IntermediateFrequencyProgrammableGainAmplifierCalibration0                              = 0x010,
116             IntermediateFrequencyProgrammableGainAmplifierCalibration1                              = 0x014,
117             IntermediateFrequencyProgrammableGainAmplifierCalibration2                              = 0x018,
118             IntermediateFrequencyProgrammableGainAmplifierCalibration3                              = 0x01C,
119             ExternalComponentDescription                                                            = 0x020,
120             SoftwareFix                                                                             = 0x024,
121             ExtendedUniqueIdentifier48Low                                                           = 0x028,
122             ExtendedUniqueIdentifier48High                                                          = 0x02C,
123             CustomInformation                                                                       = 0x030,
124             MemoryInfo                                                                              = 0x034,
125             SoftwareCapabilityVector0                                                               = 0x038,
126             SoftwareCapabilityVector1                                                               = 0x03C,
127             DeviceUniqueNumberLow                                                                   = 0x040,
128             DeviceUniqueNumberHigh                                                                  = 0x044,
129             MemorySize                                                                              = 0x048,
130             PartDescription                                                                         = 0x04C,
131             DeviceInformationPageRevision                                                           = 0x050,
132             EnergyManagmentUnitTemperatureCalibration                                               = 0x054,
133             AnalogToDigitalConverter0Calibration0                                                   = 0x060,
134             AnalogToDigitalConverter0Calibration1                                                   = 0x064,
135             AnalogToDigitalConverter0Calibration2                                                   = 0x068,
136             AnalogToDigitalConverter0Calibration3                                                   = 0x06C,
137             MediumAccuracyResistorCapacitorOscillatorCalibration0                                   = 0x080,
138             MediumAccuracyResistorCapacitorOscillatorCalibration3                                   = 0x08C,
139             MediumAccuracyResistorCapacitorOscillatorCalibration6                                   = 0x098,
140             MediumAccuracyResistorCapacitorOscillatorCalibration7                                   = 0x09C,
141             MediumAccuracyResistorCapacitorOscillatorCalibration8                                   = 0x0A0,
142             MediumAccuracyResistorCapacitorOscillatorCalibration10                                  = 0x0A8,
143             MediumAccuracyResistorCapacitorOscillatorCalibration11                                  = 0x0AC,
144             MediumAccuracyResistorCapacitorOscillatorCalibration12                                  = 0x0B0,
145             AuxiliaryMediumAccuracyResistorCapacitorOscillatorCalibration0                          = 0x0E0,
146             AuxiliaryMediumAccuracyResistorCapacitorOscillatorCalibration3                          = 0x0EC,
147             AuxiliaryMediumAccuracyResistorCapacitorOscillatorCalibration6                          = 0x0F8,
148             AuxiliaryMediumAccuracyResistorCapacitorOscillatorCalibration7                          = 0x0FC,
149             AuxiliaryMediumAccuracyResistorCapacitorOscillatorCalibration8                          = 0x100,
150             AuxiliaryMediumAccuracyResistorCapacitorOscillatorCalibration10                         = 0x108,
151             AuxiliaryMediumAccuracyResistorCapacitorOscillatorCalibration11                         = 0x10C,
152             AuxiliaryMediumAccuracyResistorCapacitorOscillatorCalibration12                         = 0x110,
153             VoltageMonitorCalibration0                                                              = 0x140,
154             VoltageMonitorCalibration1                                                              = 0x144,
155             VoltageMonitorCalibration2                                                              = 0x148,
156             VoltageMonitorCalibration3                                                              = 0x14C,
157             CurrentDigitalToAnalogConverter0Calibration0                                            = 0x158,
158             CurrentDigitalToAnalogConverter0Calibration1                                            = 0x15C,
159             DirectCurrentToDirectCurrentConverterLowNoiseReferenceVoltageCalibration0               = 0x168,
160             DirectCurrentToDirectCurrentConverterLowPowerReferenceVoltageCalibration0               = 0x16C,
161             DirectCurrentToDirectCurrentConverterLowPowerReferenceVoltageCalibration1               = 0x170,
162             DirectCurrentToDirectCurrentConverterLowPowerReferenceVoltageCalibration2               = 0x174,
163             DirectCurrentToDirectCurrentConverterLowPowerReferenceVoltageCalibration3               = 0x178,
164             DirectCurrentToDirectCurrentConverterLowPowerComparatorHysteresisSelectionCalibration0  = 0x17C,
165             DirectCurrentToDirectCurrentConverterLowPowerComparatorHysteresisSelectionCalibration1  = 0x180,
166             DigitalToAnalogConverter0MainPathCalibration                                            = 0x184,
167             DigitalToAnalogConverter0AlternatePathCalibration                                       = 0x188,
168             DigitalToAnalogConverter0Channel1Calibration                                            = 0x18C,
169             OperationalAmplifier0Calibration0                                                       = 0x190,
170             OperationalAmplifier0Calibration1                                                       = 0x194,
171             OperationalAmplifier0Calibration2                                                       = 0x198,
172             OperationalAmplifier0Calibration3                                                       = 0x19C,
173             OperationalAmplifier1Calibration0                                                       = 0x1A0,
174             OperationalAmplifier1Calibration1                                                       = 0x1A4,
175             OperationalAmplifier1Calibration2                                                       = 0x1A8,
176             OperationalAmplifier1Calibration3                                                       = 0x1AC,
177             OperationalAmplifier2Calibration0                                                       = 0x1B0,
178             OperationalAmplifier2Calibration1                                                       = 0x1B4,
179             OperationalAmplifier2Calibration2                                                       = 0x1B8,
180             OperationalAmplifier2Calibration3                                                       = 0x1BC,
181             CapacitiveSensorGainAdjustment                                                          = 0x1C0,
182         }
183     }
184 }
185