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