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