1 // 2 // Copyright (c) 2010-2020 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.Collections.Generic; 9 using Antmicro.Renode.Core; 10 using Antmicro.Renode.Core.Structure.Registers; 11 using Antmicro.Renode.Logging; 12 using Antmicro.Renode.Peripherals.Bus; 13 14 namespace Antmicro.Renode.Peripherals.Miscellaneous 15 { 16 public class K6xF_SIM : IDoubleWordPeripheral, IKnownSize 17 { K6xF_SIM(uint? uniqueIdHigh = null, uint? uniqueIdMidHigh = null, uint? uniqueIdMidLow = null, uint? uniqueIdLow = null)18 public K6xF_SIM(uint? uniqueIdHigh = null, uint? uniqueIdMidHigh = null, uint? uniqueIdMidLow = null, uint? uniqueIdLow = null) 19 { 20 var rng = EmulationManager.Instance.CurrentEmulation.RandomGenerator; 21 22 this.uniqueIdHigh = uniqueIdHigh.HasValue ? uniqueIdHigh.Value : (uint)rng.Next(); 23 this.uniqueIdMidHigh = uniqueIdMidHigh.HasValue ? uniqueIdMidHigh.Value : (uint)rng.Next(); 24 this.uniqueIdMidLow = uniqueIdMidLow.HasValue ? uniqueIdMidLow.Value : (uint)rng.Next(); 25 this.uniqueIdLow = uniqueIdLow.HasValue ? uniqueIdLow.Value : (uint)rng.Next(); 26 27 var registersMap = new Dictionary<long, DoubleWordRegister> 28 { 29 {(long)Registers.UniqueIdHigh, new DoubleWordRegister(this) 30 .WithValueField(0, 32, FieldMode.Read, valueProviderCallback: _ => 31 { 32 return this.uniqueIdHigh; 33 }, name: "SIM_UIDH") 34 }, 35 {(long)Registers.UniqueIdMidHigh, new DoubleWordRegister(this) 36 .WithValueField(0, 32, FieldMode.Read, valueProviderCallback: _ => 37 { 38 return this.uniqueIdMidHigh; 39 }, name: "SIM_UIDMH") 40 }, 41 {(long)Registers.UniqueIdMidLow, new DoubleWordRegister(this) 42 .WithValueField(0, 32, FieldMode.Read, valueProviderCallback: _ => 43 { 44 return this.uniqueIdMidLow; 45 }, name: "SIM_UIDML") 46 }, 47 {(long)Registers.UniqueIdLow, new DoubleWordRegister(this) 48 .WithValueField(0, 32, FieldMode.Read, valueProviderCallback: _ => 49 { 50 return this.uniqueIdLow; 51 }, name: "SIM_UIDL") 52 } 53 }; 54 55 registers = new DoubleWordRegisterCollection(this, registersMap); 56 } 57 ReadDoubleWord(long offset)58 public uint ReadDoubleWord(long offset) 59 { 60 return registers.Read(offset); 61 } 62 Reset()63 public void Reset() 64 { 65 registers.Reset(); 66 } 67 WriteDoubleWord(long offset, uint value)68 public void WriteDoubleWord(long offset, uint value) 69 { 70 registers.Write(offset, value); 71 } 72 73 public long Size => 0x1060; 74 75 private readonly DoubleWordRegisterCollection registers; 76 private readonly uint uniqueIdHigh; 77 private readonly uint uniqueIdMidHigh; 78 private readonly uint uniqueIdMidLow; 79 private readonly uint uniqueIdLow; 80 81 private enum Registers 82 { 83 Options1 = 0x0, 84 Configuration = 0x4, 85 Options2 = 0x1004, 86 Options4 = 0x100C, 87 Options5 = 0x1010, 88 Options7 = 0x1018, 89 DeviceID = 0x1024, 90 ClockGatingControl1 = 0x1028, 91 ClockGatingControl2 = 0x102C, 92 ClockGatingControl3 = 0x1030, 93 ClockGatingControl4 = 0x1034, 94 ClockGatingControl5 = 0x1038, 95 ClockGatingControl6 = 0x103C, 96 ClockGatingControl7 = 0x1040, 97 ClockDiv1 = 0x1044, 98 ClockDiv2 = 0x1048, 99 FlashConfig1 = 0x104C, 100 FlashConfig2 = 0x1050, 101 UniqueIdHigh = 0x1054, 102 UniqueIdMidHigh = 0x1058, 103 UniqueIdMidLow = 0x105C, 104 UniqueIdLow = 0x1060 105 } 106 } 107 } 108