Zynq.Clocks.Mos 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. MODULE Clocks;
  2. IMPORT Platform, SYSTEM, Bit, Trace;
  3. CONST
  4. COFF = 26;
  5. PLLINPUTFRE = LONGINT( 50000000 );
  6. TYPE
  7. ClockValueType = RECORD
  8. six21 : BOOLEAN;
  9. fdiv : LONGINT;
  10. divisor : LONGINT;
  11. pllclk : LONGINT;
  12. cpu6x4x : REAL;
  13. cpu3x2x : REAL;
  14. cpu2x : REAL;
  15. cpu1x : REAL;
  16. END;
  17. VAR
  18. me : ClockValueType;
  19. PROCEDURE GetPllDiv( reg : LONGINT ) : LONGINT;
  20. VAR
  21. res : LONGINT;
  22. BEGIN
  23. res := reg DIV 1000H;
  24. res := Bit.AND( res, 07FH );
  25. RETURN res;
  26. END GetPllDiv;
  27. PROCEDURE GetDivisor( reg : LONGINT ) : LONGINT;
  28. VAR
  29. res : LONGINT;
  30. BEGIN
  31. res := reg DIV 100H;
  32. res := Bit.AND( res, LONGINT( 03FH ));
  33. RETURN res;
  34. END GetDivisor;
  35. PROCEDURE GetTimerClock*() : LONGINT;
  36. BEGIN
  37. RETURN ENTIER( me.cpu3x2x );
  38. END GetTimerClock;
  39. (*
  40. PROCEDURE ShowPllSettings( VAR sreg : SET );
  41. VAR
  42. reg : LONGINT;
  43. BEGIN
  44. (* show the boolean flags of the PLL *)
  45. Trace.StringA("PLL Reset", COFF, TRUE );
  46. IF ( 0 IN sreg ) THEN
  47. Trace.StringLn("asserted");
  48. ELSE
  49. Trace.StringLn("de-asserted");
  50. END;
  51. Trace.StringA("PLL Power Down", COFF, TRUE );
  52. IF ( 1 IN sreg ) THEN
  53. Trace.StringLn("down");
  54. ELSE
  55. Trace.StringLn("running");
  56. END;
  57. Trace.StringA("PLL Bypass Source", COFF, TRUE );
  58. IF ( 3 IN sreg ) THEN
  59. Trace.StringLn("boot strap value");
  60. ELSE
  61. Trace.StringLn("bypass control bit");
  62. END;
  63. Trace.StringA("PLL Bypass Control Bit", COFF, TRUE );
  64. IF ( 4 IN sreg ) THEN
  65. Trace.StringLn("bypassed");
  66. ELSE
  67. Trace.StringLn("enabled, not bypassed");
  68. END;
  69. (* extract the divider used for the counter *)
  70. reg := GetPllDiv( SYSTEM.VAL(LONGINT, sreg ));
  71. Trace.StringA("PLL FDIV Value", COFF, TRUE );
  72. Trace.String("0x"); Trace.Hex( reg, -8 ); Trace.Ln;
  73. END ShowPllSettings;
  74. PROCEDURE ShowArmClock();
  75. VAR
  76. sreg : SET;
  77. reg : LONGINT;
  78. BEGIN
  79. Trace.StringLn("* ARM PLL Configuration *");
  80. Trace.Ln;
  81. (* load the arm pll control register *)
  82. (*SYSTEM.GET( Platform.SLCRARMPLL, sreg );*)
  83. sreg := SYSTEM.VAL(SET, Platform.slcr.ARM_PLL_CTRL);
  84. ShowPllSettings( sreg );
  85. Trace.Ln;
  86. Trace.StringLn("* ARM Clk Configuration *");
  87. Trace.Ln;
  88. (* load the clock control register *)
  89. (*SYSTEM.GET( Platform.SLCRARMCLKCONTROL, sreg );*)
  90. sreg := SYSTEM.VAL(SET, Platform.slcr.ARM_CLK_CTRL);
  91. Trace.StringA("Raw Register", COFF, TRUE );
  92. reg := SYSTEM.VAL( LONGINT, sreg );
  93. Trace.Hex( reg, -8 ); Trace.Ln;
  94. reg := reg DIV 10H;
  95. reg := Bit.AND( reg, 03H );
  96. Trace.StringA("Clock Source", COFF, TRUE );
  97. IF ( reg = 3 ) THEN
  98. Trace.StringLn("IO PLL");
  99. ELSIF ( reg = 2 ) THEN
  100. Trace.StringLn("DDR3 PLL");
  101. ELSE
  102. Trace.StringLn("ARM PLL");
  103. END;
  104. (* extract the clock divisor value *)
  105. reg := GetDivisor( SYSTEM.VAL( LONGINT, sreg ) );
  106. Trace.StringA("Clock Divider", COFF, TRUE );
  107. Trace.String("0x"); Trace.Hex( reg, -4 ); Trace.Ln;
  108. Trace.StringA("Clock 6x4x", COFF, TRUE );
  109. IF ( 24 IN sreg ) THEN
  110. Trace.StringLn("enabled");
  111. ELSE
  112. Trace.StringLn("disabled");
  113. END;
  114. Trace.StringA("Clock 3x2x", COFF, TRUE );
  115. IF ( 25 IN sreg ) THEN
  116. Trace.StringLn("enabled");
  117. ELSE
  118. Trace.StringLn("disabled");
  119. END;
  120. Trace.StringA("Clock 2x", COFF, TRUE );
  121. IF ( 26 IN sreg ) THEN
  122. Trace.StringLn("enabled");
  123. ELSE
  124. Trace.StringLn("disabled");
  125. END;
  126. Trace.StringA("Clock 1x", COFF, TRUE );
  127. IF ( 27 IN sreg ) THEN
  128. Trace.StringLn("enabled");
  129. ELSE
  130. Trace.StringLn("disabled");
  131. END;
  132. Trace.StringA("Clock CPU Peripherial", COFF, TRUE );
  133. IF ( 28 IN sreg ) THEN
  134. Trace.StringLn("enabled");
  135. ELSE
  136. Trace.StringLn("disabled");
  137. END;
  138. Trace.Ln;
  139. Trace.StringLn("* Clock Frequencies *");
  140. Trace.Ln;
  141. Trace.StringA("Sys Clk", COFF, TRUE ); Trace.Int( PLLINPUTFRE, 10 ); Trace.String(" Hz"); Trace.Ln;
  142. Trace.StringA("PLL Clk", COFF, TRUE ); Trace.Int( me.pllclk, 10 ); Trace.String(" Hz"); Trace.Ln;
  143. Trace.StringA("FDIV", COFF, TRUE ); Trace.Int( me.fdiv, 10 ); Trace.Ln;
  144. Trace.StringA("Divisor", COFF, TRUE ); Trace.Int( me.divisor, 10 ); Trace.Ln;
  145. Trace.StringA("CPU Clock", COFF, TRUE ); Trace.Real( me.cpu6x4x, 0, 10 ); Trace.String(" Hz"); Trace.Ln;
  146. Trace.StringA("CPU Clock 3x2x", COFF, TRUE ); Trace.Real( me.cpu3x2x, 0, 10 ); Trace.String(" Hz"); Trace.Ln;
  147. Trace.StringA("CPU Clock 2x", COFF, TRUE ); Trace.Real( me.cpu2x, 0, 10 ); Trace.String(" Hz"); Trace.Ln;
  148. Trace.StringA("CPU Clock 1x", COFF, TRUE ); Trace.Real( me.cpu1x, 0, 10 ); Trace.String(" Hz"); Trace.Ln;
  149. END ShowArmClock;
  150. PROCEDURE ShowDdrClock();
  151. VAR
  152. sreg : SET;
  153. BEGIN
  154. Trace.StringLn("* DDR PLL Configuration *");
  155. Trace.Ln;
  156. (* load the ddr pll control register *)
  157. (*SYSTEM.GET( Platform.SLCRDDRPLL, sreg );*)
  158. sreg := SYSTEM.VAL(SET, Platform.slcr.DDR_PLL_CTRL);
  159. ShowPllSettings( sreg );
  160. END ShowDdrClock;
  161. PROCEDURE ShowClock*();
  162. BEGIN
  163. Trace.Ln;
  164. Trace.Ln;
  165. Trace.StringLn("*** Global Clock Configuration ***");
  166. Trace.Ln;
  167. Trace.Ln;
  168. ShowArmClock();
  169. Trace.Ln;
  170. ShowDdrClock();
  171. Trace.Ln;
  172. Trace.Ln;
  173. END ShowClock;
  174. PROCEDURE ShowTimer*();
  175. BEGIN
  176. Trace.String("Timer Clock : "); Trace.Int( GetTimerClock(), 12); Trace.Ln;
  177. END ShowTimer;
  178. *)
  179. PROCEDURE InitClocks*();
  180. CONST
  181. OFFS = 12;
  182. VAR
  183. reg : LONGINT;
  184. f : LONGREAL;
  185. BEGIN
  186. reg := Platform.slcr.ARM_PLL_CTRL;
  187. (*SYSTEM.GET( Platform.SLCRARMPLL, reg );*)
  188. me.fdiv := GetPllDiv( reg );
  189. me.pllclk := me.fdiv * PLLINPUTFRE;
  190. reg := Platform.slcr.ARM_CLK_CTRL;
  191. (*SYSTEM.GET( Platform.SLCRARMCLKCONTROL, reg );*)
  192. me.divisor := GetDivisor( reg );
  193. IF ( me.six21 ) THEN
  194. (* 6:2:1 setting on clock distributor *)
  195. me.cpu6x4x := me.pllclk / me.divisor;
  196. me.cpu1x := me.cpu6x4x / 6;
  197. me.cpu2x := me.cpu6x4x / 3;
  198. me.cpu3x2x := me.cpu6x4x / 2;
  199. ELSE
  200. (* 4:2:1 setting on clock distributor *)
  201. END;
  202. END InitClocks;
  203. BEGIN
  204. me.six21 := TRUE; (* hardcoded for now *)
  205. InitClocks;
  206. END Clocks.
  207. Clocks.ShowClock
  208. TClocks.InitClocks
  209. TClocks.ShowTimer