1 // 2 // Copyright (c) 2010-2023 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; 8 using System.Linq; 9 using Antmicro.Renode.Core; 10 using Antmicro.Renode.Core.Structure.Registers; 11 using Antmicro.Renode.Peripherals.Bus; 12 using Antmicro.Renode.Utilities; 13 14 namespace Antmicro.Renode.Peripherals.GPIOPort 15 { 16 public class Murax_GPIO : BaseGPIOPort, IProvidesRegisterCollection<DoubleWordRegisterCollection>, IDoubleWordPeripheral, IKnownSize 17 { Murax_GPIO(IMachine machine)18 public Murax_GPIO(IMachine machine) : base(machine, 32) 19 { 20 RegistersCollection = new DoubleWordRegisterCollection(this); 21 DefineRegisters(); 22 } 23 ReadDoubleWord(long offset)24 public uint ReadDoubleWord(long offset) 25 { 26 return RegistersCollection.Read(offset); 27 } 28 WriteDoubleWord(long offset, uint value)29 public void WriteDoubleWord(long offset, uint value) 30 { 31 RegistersCollection.Write(offset, value); 32 } 33 Reset()34 public override void Reset() 35 { 36 base.Reset(); 37 RegistersCollection.Reset(); 38 } 39 40 public long Size => 0xC; 41 42 public DoubleWordRegisterCollection RegistersCollection { get; private set; } 43 DefineRegisters()44 private void DefineRegisters() 45 { 46 Registers.Output.Define(this) 47 .WithValueField(0, 32, out output, 48 writeCallback: (_, val) => RefreshConnectionsState(), 49 valueProviderCallback: _ => BitHelper.GetValueFromBitsArray(Connections.Where(x => x.Key >= 0).OrderBy(x => x.Key).Select(x => x.Value.IsSet))) 50 ; 51 52 Registers.OutputEnable.Define(this) 53 .WithValueField(0, 32, out outputEnable, 54 writeCallback: (_, val) => RefreshConnectionsState()) 55 ; 56 } 57 RefreshConnectionsState()58 private void RefreshConnectionsState() 59 { 60 var outputBits = BitHelper.GetBits((uint)outputEnable.Value); 61 var bits = BitHelper.GetBits((uint)output.Value); 62 for(var i = 0; i < 32; i++) 63 { 64 Connections[i].Set(bits[i] && outputBits[i]); 65 } 66 } 67 68 private IValueRegisterField outputEnable; 69 private IValueRegisterField output; 70 71 private enum Registers 72 { 73 Input = 0x0, 74 Output = 0x4, 75 OutputEnable = 0x8 76 } 77 } 78 } 79