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