Zynq.GlobalTimer.Mos 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. MODULE GlobalTimer;
  2. IMPORT Platform, SYSTEM, Bit, KernelUtils, Trace;
  3. CONST
  4. COMPAUTOINC = 3;
  5. IRQENABLE = 2;
  6. COMPENABLE = 1;
  7. TIMERENABLE = 0;
  8. VAR
  9. PROCEDURE EnableTimer*();
  10. VAR
  11. reg : SET;
  12. BEGIN
  13. SYSTEM.PUT32( Platform.GlobalTimerCounterRegister0, 0 );
  14. SYSTEM.PUT32( Platform.GlobalTimerCounterRegister1, 0 );
  15. SYSTEM.GET( Platform.GlobalTimerControlRegister, reg );
  16. reg := reg + { TIMERENABLE };
  17. SYSTEM.PUT( Platform.GlobalTimerControlRegister, reg );
  18. END EnableTimer;
  19. PROCEDURE DisableTimer*();
  20. VAR
  21. reg : SET;
  22. BEGIN
  23. SYSTEM.GET( Platform.GlobalTimerControlRegister, reg );
  24. reg := reg - { TIMERENABLE };
  25. SYSTEM.PUT( Platform.GlobalTimerControlRegister, reg );
  26. END DisableTimer;
  27. PROCEDURE ShowTimer*();
  28. CONST
  29. COFF = 22;
  30. VAR
  31. sreg : SET;
  32. reg : LONGINT;
  33. BEGIN
  34. Trace.Ln;
  35. Trace.Ln;
  36. Trace.StringLn("*** Global Timer Configuration ***");
  37. Trace.Ln;
  38. Trace.Ln;
  39. (* load the timer control register *)
  40. SYSTEM.GET( Platform.GlobalTimerControlRegister, sreg );
  41. (* show the boolean flags of the timer *)
  42. Trace.StringA("Timer Enabled", COFF, TRUE );
  43. IF ( TIMERENABLE IN sreg ) THEN
  44. Trace.StringLn("TRUE");
  45. ELSE
  46. Trace.StringLn("FALSE");
  47. END;
  48. Trace.StringA("Compare Enabled", COFF, TRUE );
  49. IF ( COMPENABLE IN sreg ) THEN
  50. Trace.StringLn("TRUE");
  51. ELSE
  52. Trace.StringLn("FALSE");
  53. END;
  54. Trace.StringA("IRQ Enabled", COFF, TRUE );
  55. IF ( IRQENABLE IN sreg ) THEN
  56. Trace.StringLn("TRUE");
  57. ELSE
  58. Trace.StringLn("FALSE");
  59. END;
  60. Trace.StringA("Auto Inc Enabled", COFF, TRUE );
  61. IF ( COMPAUTOINC IN sreg ) THEN
  62. Trace.StringLn("TRUE");
  63. ELSE
  64. Trace.StringLn("FALSE");
  65. END;
  66. (* extract the divider used for the counter *)
  67. reg := KernelUtils.GetSetAsInteger( sreg );
  68. reg := reg DIV 100H;
  69. reg := Bit.AND( reg, 0FFH );
  70. Trace.StringA("Timer Prescaler", COFF, TRUE );
  71. Trace.Int( reg, 3 ); Trace.Ln;
  72. END ShowTimer;
  73. PROCEDURE GetTimerValue( VAR upper, lower : LONGINT );
  74. VAR
  75. high, low : LONGINT;
  76. tmp : LONGINT;
  77. running : BOOLEAN;
  78. BEGIN
  79. high := 0;
  80. running := TRUE;
  81. SYSTEM.GET( Platform.GlobalTimerCounterRegister1, high );
  82. WHILE ( running ) DO
  83. SYSTEM.GET( Platform.GlobalTimerCounterRegister0, low );
  84. SYSTEM.GET( Platform.GlobalTimerCounterRegister1, tmp );
  85. IF ( tmp = high ) THEN
  86. running := FALSE;
  87. ELSE
  88. high := tmp;
  89. END;
  90. END;
  91. (* assign the values and exit *)
  92. upper := high;
  93. lower := low;
  94. END GetTimerValue;
  95. PROCEDURE GetTimerLowValue*() : LONGINT;
  96. VAR
  97. high, low : LONGINT;
  98. BEGIN
  99. GetTimerValue( high, low );
  100. RETURN low;
  101. END GetTimerLowValue;
  102. PROCEDURE GetTime*(): HUGEINT;
  103. TYPE
  104. Hugeint = ARRAY 2 OF LONGINT;
  105. VAR
  106. time: HUGEINT;
  107. BEGIN
  108. GetTimerValue(SYSTEM.VAL(Hugeint, time)[1], SYSTEM.VAL(Hugeint, time)[0]);
  109. RETURN time
  110. END GetTime;
  111. PROCEDURE ShowValue*();
  112. VAR
  113. high, low : LONGINT;
  114. BEGIN
  115. GetTimerValue( high, low );
  116. Trace.Ln;
  117. Trace.StringLn("Timer Values");
  118. Trace.Int( high, 8 ); Trace.Ln;
  119. Trace.Int( low, 8 ); Trace.Ln;
  120. Trace.Ln;
  121. END ShowValue;
  122. BEGIN
  123. END GlobalTimer.
  124. GlobalTimer.ShowValue
  125. GlobalTimer.ShowTimer