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