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