1 //
2 // Copyright (c) 2010-2018 Antmicro
3 // Copyright (c) 2011-2015 Realtime Embedded
4 //
5 // This file is licensed under the MIT License.
6 // Full license text is available in 'licenses/MIT.txt'.
7 //
8 using System;
9 using Antmicro.Renode.Logging;
10 using Antmicro.Renode.Peripherals.Bus;
11 using Antmicro.Renode.Core;
12 using Antmicro.Renode.Time;
13 
14 namespace Antmicro.Renode.Peripherals.Timers
15 {
16     public class TegraUsecTimer : LimitTimer, IDoubleWordPeripheral, IKnownSize
17     {
TegraUsecTimer(IMachine machine)18         public TegraUsecTimer (IMachine machine) : base(machine.ClockSource, 1000000, direction: Direction.Ascending, limit: uint.MaxValue, enabled: true)
19         {
20             Reset ();
21         }
22 
23         // THIS IS A WORKAROUND FOR A BUG IN MONO
24         // https://bugzilla.xamarin.com/show_bug.cgi?id=39444
OnLimitReached()25         protected override void OnLimitReached()
26         {
27             base.OnLimitReached();
28         }
29 
ReadDoubleWord(long offset)30         public uint ReadDoubleWord (long offset)
31         {
32             switch ((Registers)offset)
33             {
34             case Registers.Value:
35                 return (uint)Value;
36             case Registers.Config:
37                 return (uint)((usecDividend << 8) | usecDivisor);
38             case Registers.Freeze:
39                 return freeze;
40             default:
41                 this.LogUnhandledRead(offset);
42                 return 0;
43             }
44         }
45 
WriteDoubleWord(long offset, uint value)46         public void WriteDoubleWord (long offset, uint value)
47         {
48             switch ((Registers)offset)
49             {
50             case Registers.Value:
51                 this.Log(LogLevel.Warning, "Unexpected write to readonly register 0x{0:X}, value 0x{1:X}.", offset, value);
52                 break;
53             case Registers.Config:
54                 usecDivisor = (byte)(value & 0xF);
55                 usecDividend = (byte)((value >> 8) & 0xF);
56                 break;
57             case Registers.Freeze:
58                 freeze = (byte)value;
59                 break;
60             default:
61                 this.LogUnhandledWrite(offset, value);
62                 break;
63             }
64         }
65 
66         public long Size {
67             get
68             {
69                 return 64;
70             }
71         }
72 
Reset()73         public override void Reset()
74         {
75             usecDivisor = 0xc;
76             usecDividend = 0x0;
77         }
78 
79         private enum Registers
80         {
81             Value  = 0x00,
82             Config = 0x04,
83             Freeze = 0x3c,
84         }
85 
86         private byte usecDivisor;
87         private byte usecDividend;
88         private byte freeze;
89 
90     }
91 }
92 
93