Zynq.Initializer.Mos 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. MODULE ZynqInitializer;
  2. IMPORT SYSTEM, Platform, Board, TclInit;
  3. CONST
  4. InitialStackPointer = 30000H;
  5. (* initialization, minimal setup: setup initial stack pointer and mask interrupts*)
  6. (* PROCEDURE {INITIAL} Init; *)
  7. (*PROCEDURE {NOPAF, FIXED(Board.StartAddress)} Init;
  8. CODE
  9. ; set IRQ vector base register to zero
  10. mov r0, #0
  11. mcr p15, 0, r0, c12, c0, 0
  12. ; disable MMU
  13. mrc p15, 0, r0, c1, c0, 0
  14. bic r0, r0, #1
  15. mcr p15, 0, r0, c1, c0, 0
  16. ldr fp, [pc, #InitialFP-$-8] ; set stack pointer
  17. ldr sp, [pc, #InitialFP-$-8] ; set frame pointer
  18. ; have to skip the constants because this is not a procedure that had been called, we are natively in initial code
  19. ldr r0, [pc, #Initialize-$-8]
  20. blx r0
  21. ;bl InitializeTcl
  22. b end
  23. ; constants used
  24. InitialFP: d32 30000H;InitialStackPointer ; initial frame pointer address, internal memory bank
  25. Initialize: d32 InitializeTcl
  26. end:
  27. END Init;*)
  28. PROCEDURE {FINAL} Finalize;
  29. BEGIN
  30. LOOP END;
  31. END Finalize;
  32. (** Performs initialization specified in a TCL subset *)
  33. PROCEDURE InitSubset(CONST data: ARRAY [*] OF ADDRESS);
  34. VAR val, valo, mask: SET; i, j: LONGINT; opcode, adr: LONGINT;
  35. BEGIN
  36. (*IF LEN(data, 0) = 1 THEN RETURN END;*)
  37. i := 0;
  38. WHILE i < LEN(data,0) DO
  39. opcode := data[i];
  40. IF opcode = TclInit.mask_write THEN
  41. adr := data[i+1]; mask := SYSTEM.VAL(SET,data[i+2]); val := SYSTEM.VAL(SET,data[i+3]); INC(i,4);
  42. SYSTEM.GET(adr, valo);
  43. val := mask*val + (-mask) * valo;
  44. SYSTEM.PUT(adr, val);
  45. ELSIF opcode = TclInit.mask_poll THEN
  46. adr := data[i+1]; mask := SYSTEM.VAL(SET, data[i+2]); INC(i,3);
  47. REPEAT
  48. SYSTEM.GET(adr, val)
  49. UNTIL val * mask # {}
  50. ELSIF opcode = TclInit.mask_delay THEN
  51. INC(i, 3);
  52. FOR j := 0 TO 1000000 DO END
  53. ELSE
  54. INC(i)
  55. END;
  56. END;
  57. END InitSubset;
  58. (** Perform TCL initialization *)
  59. PROCEDURE InitializeTcl;
  60. VAR siliconVersion: LONGINT;
  61. BEGIN
  62. siliconVersion := LSH(SYSTEM.GET32(Platform.DevCfgBase + Platform.DevCfgMctrlOffset), -Platform.DevCfgMctrlPsVersionOfs) MOD 4;
  63. CASE siliconVersion OF
  64. Platform.DevCfgMctrlPsVersion10:
  65. InitSubset(TclInit.ps7_mio_init_data_1_0);
  66. InitSubset(TclInit.ps7_pll_init_data_1_0);
  67. InitSubset(TclInit.ps7_clock_init_data_1_0);
  68. InitSubset(TclInit.ps7_ddr_init_data_1_0);
  69. InitSubset(TclInit.ps7_peripherals_init_data_1_0)
  70. |Platform.DevCfgMctrlPsVersion20:
  71. InitSubset(TclInit.ps7_mio_init_data_2_0);
  72. InitSubset(TclInit.ps7_pll_init_data_2_0);
  73. InitSubset(TclInit.ps7_clock_init_data_2_0);
  74. InitSubset(TclInit.ps7_ddr_init_data_2_0);
  75. InitSubset(TclInit.ps7_peripherals_init_data_2_0)
  76. |Platform.DevCfgMctrlPsVersion30, Platform.DevCfgMctrlPsVersion31:
  77. InitSubset(TclInit.ps7_mio_init_data_3_0);
  78. InitSubset(TclInit.ps7_pll_init_data_3_0);
  79. InitSubset(TclInit.ps7_clock_init_data_3_0);
  80. InitSubset(TclInit.ps7_ddr_init_data_3_0);
  81. InitSubset(TclInit.ps7_peripherals_init_data_3_0)
  82. END
  83. END InitializeTcl;
  84. BEGIN
  85. InitializeTcl
  86. END ZynqInitializer.