1 // 2 // Copyright (c) 2010-2024 Antmicro 3 // Copyright (c) 2022 SICK AG 4 // 5 // This file is licensed under the MIT License. 6 // Full license text is available in 'licenses/MIT.txt'. 7 // 8 9 using System.Collections.Generic; 10 using Antmicro.Renode.Core; 11 using Antmicro.Renode.Core.Structure.Registers; 12 using Antmicro.Renode.Peripherals.Bus; 13 using Antmicro.Renode.Logging; 14 using Antmicro.Renode.Utilities; 15 16 namespace Antmicro.Renode.Peripherals.Miscellaneous 17 { 18 [AllowedTranslations(AllowedTranslation.ByteToDoubleWord | AllowedTranslation.WordToDoubleWord)] 19 public sealed class STM32_PWR : BasicDoubleWordPeripheral, IKnownSize 20 { STM32_PWR(IMachine machine)21 public STM32_PWR(IMachine machine) : base(machine) 22 { 23 DefineRegisters(); 24 } 25 DefineRegisters()26 private void DefineRegisters() 27 { 28 Registers.PowerControl.Define(this, 0xFCC00, name: "PWR_CR") 29 .WithTaggedFlag("LPDS", 0) 30 .WithTaggedFlag("PDDS", 1) 31 .WithTaggedFlag("CWUF", 2) 32 .WithTaggedFlag("CSBF", 3) 33 .WithTaggedFlag("PVDE", 4) 34 .WithEnumField<DoubleWordRegister, PvdLevelSelection>(5, 3, name: "PLS") 35 .WithFlag(8, name: "DBP") 36 .WithTaggedFlag("FPDS", 9) 37 .WithTaggedFlag("LPUDS", 10) 38 .WithTaggedFlag("MRUDS", 11) 39 .WithReservedBits(12, 1) 40 .WithTaggedFlag("ADCD1", 13) 41 .WithEnumField<DoubleWordRegister, RegulatorVoltageScalingOutputSelection>(14, 2, out vosValue, name: "VOS", writeCallback: (_, value) => 42 { 43 if(value == RegulatorVoltageScalingOutputSelection.Reserved) 44 { 45 vosValue.Value = RegulatorVoltageScalingOutputSelection.ScaleMode3; 46 } 47 vosrdyValue.Value = true; 48 }) 49 .WithFlag(16, name: "ODEN", writeCallback: (_, value) => 50 { 51 if(!value) 52 { 53 odswenValue.Value = false; 54 } 55 56 odrdyValue.Value = value; 57 }) 58 .WithFlag(17, out odswenValue, name: "ODSWEN", writeCallback: (_, value) => { odswrdyValue.Value = value; }) 59 .WithEnumField<DoubleWordRegister, UnderDriveEnableInStopMode>(18, 2, name: "UDEN") 60 .WithReservedBits(20, 12); 61 62 Registers.PowerControlStatus.Define(this, name: "PWR_CSR") 63 .WithTaggedFlag("WUF", 0) 64 .WithTaggedFlag("SBF", 1) 65 .WithTaggedFlag("PVDO", 2) 66 .WithTaggedFlag("BRR", 3) 67 .WithReservedBits(4, 4) 68 .WithTaggedFlag("EWUP", 8) 69 .WithTaggedFlag("BER", 9) 70 .WithReservedBits(10, 4) 71 .WithFlag(14, out vosrdyValue, FieldMode.Read, name: "VOSRDY") 72 .WithReservedBits(15, 1) 73 .WithFlag(16, out odrdyValue, FieldMode.Read, name: "ODRDY") 74 .WithFlag(17, out odswrdyValue, FieldMode.Read, name: "ODSWRDY") 75 .WithEnumField<DoubleWordRegister, UnderDriveReady>(18, 2, FieldMode.Read | FieldMode.WriteOneToClear, name: "UDRDY") 76 .WithReservedBits(20, 12); 77 } 78 79 public long Size => 0x400; 80 81 private IEnumRegisterField<RegulatorVoltageScalingOutputSelection> vosValue; 82 private IFlagRegisterField odswenValue; 83 private IFlagRegisterField vosrdyValue; 84 private IFlagRegisterField odrdyValue; 85 private IFlagRegisterField odswrdyValue; 86 87 private enum Registers 88 { 89 PowerControl = 0x0, 90 PowerControlStatus = 0x4 91 } 92 93 private enum PvdLevelSelection 94 { 95 V2_0, 96 V2_1, 97 V2_3, 98 V2_5, 99 V2_6, 100 V2_7, 101 V2_8, 102 V2_9 103 } 104 105 private enum RegulatorVoltageScalingOutputSelection 106 { 107 Reserved, 108 ScaleMode3, 109 ScaleMode2, 110 ScaleMode1 111 } 112 113 private enum UnderDriveEnableInStopMode 114 { 115 UnderDriveDisable, 116 Reserved1, 117 Reserved2, 118 UnderDriveEnable 119 } 120 121 private enum UnderDriveReady 122 { 123 UnderDriveDisabled, 124 Reserved1, 125 Reserved2, 126 UnderDriveActivated 127 } 128 } 129 } 130