1 //
2 // Copyright (c) 2010-2024 Antmicro
3 //
4 // This file is licensed under the MIT License.
5 // Full license text is available in 'licenses/MIT.txt'.
6 //
7 
8 using System;
9 using Antmicro.Renode.Core;
10 using Antmicro.Renode.Core.Structure.Registers;
11 using Antmicro.Renode.Logging;
12 
13 namespace Antmicro.Renode.Peripherals.GPIOPort
14 {
15     public class RenesasRA_GPIOMisc : BasicBytePeripheral, IKnownSize
16     {
RenesasRA_GPIOMisc(IMachine machine, Version version = Version.Default)17         public RenesasRA_GPIOMisc(IMachine machine, Version version = Version.Default) : base(machine)
18         {
19             this.version = version;
20             DefineRegisters();
21         }
22 
Reset()23         public override void Reset()
24         {
25             base.Reset();
26             PFSWriteEnabled = false;
27         }
28 
29         public bool PFSWriteEnabled { get; private set; }
30 
31         public long Size
32         {
33             get
34             {
35                 switch(version)
36                 {
37                     case Version.Default:
38                         return 0x10;
39                     case Version.RA8:
40                         return 0x20;
41                     default:
42                         throw new Exception("unreachable");
43                 }
44             }
45         }
46 
DefineRegisters()47         protected override void DefineRegisters()
48         {
49             switch(version)
50             {
51                 case Version.Default:
52                     DefineRegistersDefault();
53                     break;
54                 case Version.RA8:
55                     DefineRegistersRA8();
56                     break;
57                 default:
58                     throw new Exception("unreachable");
59             }
60         }
61 
DefineRegistersDefault()62         private void DefineRegistersDefault()
63         {
64             Registers.EthernetControl.Define(this)
65                 .WithReservedBits(0, 4)
66                 .WithTaggedFlag("PHYMODE0", 4)
67                 .WithReservedBits(5, 3)
68             ;
69 
70             DefineWriteProtectRegister(Registers.WriteProtect);
71         }
72 
DefineRegistersRA8()73         private void DefineRegistersRA8()
74         {
75             RegistersRA8.EthernetControl.Define(this)
76                 .WithReservedBits(0, 4)
77                 .WithTaggedFlag("PHYMODE0", 4)
78                 .WithReservedBits(5, 3)
79             ;
80 
81             DefineWriteProtectRegister(RegistersRA8.WriteProtectSecure);
82         }
83 
84         private void DefineWriteProtectRegister<T>(T register)
85             where T : IConvertible
86         {
87             RegistersCollection.DefineRegister(Convert.ToInt64(register), 0x80)
88                 .WithReservedBits(0, 6)
89                 .WithFlag(6, name: "PFSWE",
90                     valueProviderCallback: _ => PFSWriteEnabled,
91                     changeCallback: (_, value) =>
92                     {
93                         if(pfsWriteEnableDisabled.Value)
94                         {
95                             this.Log(LogLevel.Warning, "Trying to write PFSE, but B0WI is asserted");
96                             return;
97                         }
98 
99                         PFSWriteEnabled = value;
100                     }
101                 )
102                 // This is defined _after_ PFSWE to assert that this field will be
103                 // written zero before any change to PFSWE field.
104                 .WithFlag(7, out pfsWriteEnableDisabled, name: "B0WI")
105             ;
106         }
107 
108         private IFlagRegisterField pfsWriteEnableDisabled;
109 
110         private readonly Version version;
111 
112         public enum Version
113         {
114             Default,
115             RA8,
116         }
117 
118         private enum Registers
119         {
120             EthernetControl = 0x00,
121             WriteProtect = 0x03,
122             WriteProtectForSecure = 0x05,
123         }
124 
125         private enum RegistersRA8
126         {
127             EthernetControl     = 0x00,
128             WriteProtect        = 0x0C,
129             WriteProtectSecure  = 0x14,
130         }
131     }
132 }
133