Initializer.TCL.Zynq.Mod 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. MODULE ZynqInitializer;
  2. IMPORT SYSTEM;
  3. (** Performs hardware initialization, initial stack setup and interrupt vector setup *)
  4. PROCEDURE {INITIAL} Init;
  5. CODE
  6. ; interrupt vectors at address 0
  7. RESET: ldr pc, [pc, #reset-$-8]; RESET
  8. UNDEF: ldr pc, [pc, #undef-$-8]; UNDEF
  9. SWI: ldr pc, [pc, #swi-$-8]; SWI
  10. PREF: ldr pc, [pc, #prefetch-$-8]; Prefetch Abort
  11. DATA: ldr pc, [pc, #data-$-8]; Data Abort
  12. INVALID: B INVALID ; (not assigned)
  13. IRQ: ldr pc, [pc, #irq-$-8]; IRQ
  14. FIQ: ldr pc, [pc, #fiq-$-8]; FIQ
  15. ; initial interrupt vector setup such that inifinte loop is triggered
  16. reset: d32 init
  17. undef: d32 UNDEF
  18. swi: d32 SWI
  19. prefetch: d32 PREF
  20. data: d32 DATA
  21. empty: d32 0
  22. irq: d32 IRQ
  23. fiq: d32 FIQ
  24. init:
  25. ; let only processor 0 through
  26. mrc p15,0,r1,c0,c0,5
  27. and r1, r1, #0xf
  28. cmp r1, #0
  29. beq OKToRun
  30. EndlessLoop0:
  31. d32 0b11100011001000001111000000000010 ;WFE
  32. B EndlessLoop0
  33. OKToRun:
  34. ; call initialization script as provided by Xilinx Tools
  35. ldr FP, [pc, #InitialFP-$-8] ; set stack pointer
  36. ldr SP, [pc, #InitialFP-$-8] ; set frame pointer
  37. bl InitializeHW
  38. loop:
  39. b loop
  40. ; constants used
  41. InitialFP: d32 00030000H ; initial frame pointer address, internal memory bank
  42. END Init;
  43. CONST
  44. (* the following initialization sequences have been inferred from ps7_init.tcl and ps7_init.c for the Zynq board *)
  45. mask_write = 0;
  46. mask_poll = 1;
  47. ps7_pll_init_data = [
  48. mask_write ,0xF8000008 ,0x0000FFFF ,0x0000DF0D
  49. ,mask_write ,0xF8000110 ,0x003FFFF0 ,0x000FA220
  50. ,mask_write ,0xF8000100 ,0x0007F000 ,0x00028000
  51. ,mask_write ,0xF8000100 ,0x00000010 ,0x00000010
  52. ,mask_write ,0xF8000100 ,0x00000001 ,0x00000001
  53. ,mask_write ,0xF8000100 ,0x00000001 ,0x00000000
  54. ,mask_poll ,0xF800010C ,0x00000001
  55. ,mask_write ,0xF8000100 ,0x00000010 ,0x00000000
  56. ,mask_write ,0xF8000120 ,0x1F003F30 ,0x1F000200
  57. ,mask_write ,0xF8000114 ,0x003FFFF0 ,0x0012C220
  58. ,mask_write ,0xF8000104 ,0x0007F000 ,0x00020000
  59. ,mask_write ,0xF8000104 ,0x00000010 ,0x00000010
  60. ,mask_write ,0xF8000104 ,0x00000001 ,0x00000001
  61. ,mask_write ,0xF8000104 ,0x00000001 ,0x00000000
  62. ,mask_poll ,0xF800010C ,0x00000002
  63. ,mask_write ,0xF8000104 ,0x00000010 ,0x00000000
  64. ,mask_write ,0xF8000124 ,0xFFF00003 ,0x0C200003
  65. ,mask_write ,0xF8000118 ,0x003FFFF0 ,0x001452C0
  66. ,mask_write ,0xF8000108 ,0x0007F000 ,0x0001E000
  67. ,mask_write ,0xF8000108 ,0x00000010 ,0x00000010
  68. ,mask_write ,0xF8000108 ,0x00000001 ,0x00000001
  69. ,mask_write ,0xF8000108 ,0x00000001 ,0x00000000
  70. ,mask_poll ,0xF800010C ,0x00000004
  71. ,mask_write ,0xF8000108 ,0x00000010 ,0x00000000
  72. ,mask_write ,0xF8000004 ,0x0000FFFF ,0x0000767B
  73. ];
  74. ps7_clock_init_data=[
  75. mask_write ,0xF8000008 ,0x0000FFFF ,0x0000DF0D
  76. ,mask_write ,0xF8000128 ,0x03F03F01 ,0x00302301
  77. ,mask_write ,0xF8000138 ,0x00000011 ,0x00000001
  78. ,mask_write ,0xF8000140 ,0x03F03F71 ,0x00100801
  79. ,mask_write ,0xF800014C ,0x00003F31 ,0x00000721
  80. ,mask_write ,0xF8000150 ,0x00003F33 ,0x00001401
  81. ,mask_write ,0xF8000154 ,0x00003F33 ,0x00001402
  82. ,mask_write ,0xF8000168 ,0x00003F31 ,0x00000501
  83. ,mask_write ,0xF8000170 ,0x03F03F30 ,0x00100A00
  84. ,mask_write ,0xF8000180 ,0x03F03F30 ,0x00100700
  85. ,mask_write ,0xF8000190 ,0x03F03F30 ,0x00101400
  86. ,mask_write ,0xF80001A0 ,0x03F03F30 ,0x00101400
  87. ,mask_write ,0xF80001C4 ,0x00000001 ,0x00000001
  88. ,mask_write ,0xF800012C ,0x01FFCCCD ,0x01EC044D
  89. ,mask_write ,0xF8000004 ,0x0000FFFF ,0x0000767B
  90. ];
  91. ps7_ddr_init_data =[
  92. mask_write ,0xF8006000 ,0x0001FFFF ,0x00000080
  93. ,mask_write ,0xF8006004 ,0x1FFFFFFF ,0x00081081
  94. ,mask_write ,0xF8006008 ,0x03FFFFFF ,0x03C0780F
  95. ,mask_write ,0xF800600C ,0x03FFFFFF ,0x02001001
  96. ,mask_write ,0xF8006010 ,0x03FFFFFF ,0x00014001
  97. ,mask_write ,0xF8006014 ,0x001FFFFF ,0x0004159B
  98. ,mask_write ,0xF8006018 ,0xF7FFFFFF ,0x452460D2
  99. ,mask_write ,0xF800601C ,0xFFFFFFFF ,0x720238E5
  100. ,mask_write ,0xF8006020 ,0xFFFFFFFC ,0x272872D0
  101. ,mask_write ,0xF8006024 ,0x0FFFFFFF ,0x0000003C
  102. ,mask_write ,0xF8006028 ,0x00003FFF ,0x00002007
  103. ,mask_write ,0xF800602C ,0xFFFFFFFF ,0x00000008
  104. ,mask_write ,0xF8006030 ,0xFFFFFFFF ,0x00040930
  105. ,mask_write ,0xF8006034 ,0x13FF3FFF ,0x00010694
  106. ,mask_write ,0xF8006038 ,0x00001FC3 ,0x00000000
  107. ,mask_write ,0xF800603C ,0x000FFFFF ,0x00000777
  108. ,mask_write ,0xF8006040 ,0xFFFFFFFF ,0xFFF00000
  109. ,mask_write ,0xF8006044 ,0x0FFFFFFF ,0x0FF66666
  110. ,mask_write ,0xF8006048 ,0x3FFFFFFF ,0x0003C248
  111. ,mask_write ,0xF8006050 ,0xFF0F8FFF ,0x77010800
  112. ,mask_write ,0xF8006058 ,0x0001FFFF ,0x00000101
  113. ,mask_write ,0xF800605C ,0x0000FFFF ,0x00005003
  114. ,mask_write ,0xF8006060 ,0x000017FF ,0x0000003E
  115. ,mask_write ,0xF8006064 ,0x00021FE0 ,0x00020000
  116. ,mask_write ,0xF8006068 ,0x03FFFFFF ,0x00284141
  117. ,mask_write ,0xF800606C ,0x0000FFFF ,0x00001610
  118. ,mask_write ,0xF80060A0 ,0x00FFFFFF ,0x00008000
  119. ,mask_write ,0xF80060A4 ,0xFFFFFFFF ,0x10200802
  120. ,mask_write ,0xF80060A8 ,0x0FFFFFFF ,0x0690CB73
  121. ,mask_write ,0xF80060AC ,0x000001FF ,0x000001FE
  122. ,mask_write ,0xF80060B0 ,0x1FFFFFFF ,0x1CFFFFFF
  123. ,mask_write ,0xF80060B4 ,0x000007FF ,0x00000200
  124. ,mask_write ,0xF80060B8 ,0x01FFFFFF ,0x00200066
  125. ,mask_write ,0xF80060BC ,0x00FFFFFF ,0x00000000
  126. ,mask_write ,0xF80060C4 ,0x00000003 ,0x00000000
  127. ,mask_write ,0xF80060C8 ,0x000000FF ,0x00000000
  128. ,mask_write ,0xF80060DC ,0x00000001 ,0x00000000
  129. ,mask_write ,0xF80060F0 ,0x0000FFFF ,0x00000000
  130. ,mask_write ,0xF80060F4 ,0x0000000F ,0x00000008
  131. ,mask_write ,0xF8006114 ,0x000000FF ,0x00000000
  132. ,mask_write ,0xF8006118 ,0x7FFFFFFF ,0x40000001
  133. ,mask_write ,0xF800611C ,0x7FFFFFFF ,0x40000001
  134. ,mask_write ,0xF8006120 ,0x7FFFFFFF ,0x40000001
  135. ,mask_write ,0xF8006124 ,0x7FFFFFFF ,0x40000001
  136. ,mask_write ,0xF800612C ,0x000FFFFF ,0x00033C03
  137. ,mask_write ,0xF8006130 ,0x000FFFFF ,0x00034003
  138. ,mask_write ,0xF8006134 ,0x000FFFFF ,0x0002F400
  139. ,mask_write ,0xF8006138 ,0x000FFFFF ,0x00030400
  140. ,mask_write ,0xF8006140 ,0x000FFFFF ,0x00000035
  141. ,mask_write ,0xF8006144 ,0x000FFFFF ,0x00000035
  142. ,mask_write ,0xF8006148 ,0x000FFFFF ,0x00000035
  143. ,mask_write ,0xF800614C ,0x000FFFFF ,0x00000035
  144. ,mask_write ,0xF8006154 ,0x000FFFFF ,0x00000083
  145. ,mask_write ,0xF8006158 ,0x000FFFFF ,0x00000083
  146. ,mask_write ,0xF800615C ,0x000FFFFF ,0x0000007F
  147. ,mask_write ,0xF8006160 ,0x000FFFFF ,0x00000078
  148. ,mask_write ,0xF8006168 ,0x001FFFFF ,0x00000124
  149. ,mask_write ,0xF800616C ,0x001FFFFF ,0x00000125
  150. ,mask_write ,0xF8006170 ,0x001FFFFF ,0x00000112
  151. ,mask_write ,0xF8006174 ,0x001FFFFF ,0x00000116
  152. ,mask_write ,0xF800617C ,0x000FFFFF ,0x000000C3
  153. ,mask_write ,0xF8006180 ,0x000FFFFF ,0x000000C3
  154. ,mask_write ,0xF8006184 ,0x000FFFFF ,0x000000BF
  155. ,mask_write ,0xF8006188 ,0x000FFFFF ,0x000000B8
  156. ,mask_write ,0xF8006190 ,0xFFFFFFFF ,0x10040080
  157. ,mask_write ,0xF8006194 ,0x000FFFFF ,0x0001FC82
  158. ,mask_write ,0xF8006204 ,0xFFFFFFFF ,0x00000000
  159. ,mask_write ,0xF8006208 ,0x000F03FF ,0x000803FF
  160. ,mask_write ,0xF800620C ,0x000F03FF ,0x000803FF
  161. ,mask_write ,0xF8006210 ,0x000F03FF ,0x000803FF
  162. ,mask_write ,0xF8006214 ,0x000F03FF ,0x000803FF
  163. ,mask_write ,0xF8006218 ,0x000F03FF ,0x000003FF
  164. ,mask_write ,0xF800621C ,0x000F03FF ,0x000003FF
  165. ,mask_write ,0xF8006220 ,0x000F03FF ,0x000003FF
  166. ,mask_write ,0xF8006224 ,0x000F03FF ,0x000003FF
  167. ,mask_write ,0xF80062A8 ,0x00000FF7 ,0x00000000
  168. ,mask_write ,0xF80062AC ,0xFFFFFFFF ,0x00000000
  169. ,mask_write ,0xF80062B0 ,0x003FFFFF ,0x00005125
  170. ,mask_write ,0xF80062B4 ,0x0003FFFF ,0x000012A8
  171. ,mask_write ,0xF8006000 ,0x0001FFFF ,0x00000081
  172. ,mask_poll ,0xF8006054 ,0x00000007
  173. ];
  174. ps7_mio_init_data =[
  175. mask_write ,0xF8000008 ,0x0000FFFF ,0x0000DF0D
  176. ,mask_write ,0xF8000B40 ,0x00000FFF ,0x00000600
  177. ,mask_write ,0xF8000B44 ,0x00000FFF ,0x00000600
  178. ,mask_write ,0xF8000B48 ,0x00000FFF ,0x00000672
  179. ,mask_write ,0xF8000B4C ,0x00000FFF ,0x00000672
  180. ,mask_write ,0xF8000B50 ,0x00000FFF ,0x00000674
  181. ,mask_write ,0xF8000B54 ,0x00000FFF ,0x00000674
  182. ,mask_write ,0xF8000B58 ,0x00000FFF ,0x00000600
  183. ,mask_write ,0xF8000B5C ,0xFFFFFFFF ,0x00D6861C
  184. ,mask_write ,0xF8000B60 ,0xFFFFFFFF ,0x00F9861C
  185. ,mask_write ,0xF8000B64 ,0xFFFFFFFF ,0x00F9861C
  186. ,mask_write ,0xF8000B68 ,0xFFFFFFFF ,0x00D6861C
  187. ,mask_write ,0xF8000B6C ,0x00007FFF ,0x00000E09
  188. ,mask_write ,0xF8000B70 ,0x00000021 ,0x00000021
  189. ,mask_write ,0xF8000B70 ,0x00000021 ,0x00000020
  190. ,mask_write ,0xF8000B70 ,0x07FFFFFF ,0x00000823
  191. ,mask_write ,0xF8000700 ,0x00003FFF ,0x00000600
  192. ,mask_write ,0xF8000704 ,0x00003FFF ,0x00000702
  193. ,mask_write ,0xF8000708 ,0x00003FFF ,0x00000702
  194. ,mask_write ,0xF800070C ,0x00003FFF ,0x00000702
  195. ,mask_write ,0xF8000710 ,0x00003FFF ,0x00000702
  196. ,mask_write ,0xF8000714 ,0x00003FFF ,0x00000702
  197. ,mask_write ,0xF8000718 ,0x00003FFF ,0x00000702
  198. ,mask_write ,0xF800071C ,0x00003FFF ,0x00000600
  199. ,mask_write ,0xF8000720 ,0x00003FFF ,0x00000702
  200. ,mask_write ,0xF8000724 ,0x00003FFF ,0x00000600
  201. ,mask_write ,0xF8000728 ,0x00003FFF ,0x00000600
  202. ,mask_write ,0xF800072C ,0x00003FFF ,0x00000600
  203. ,mask_write ,0xF8000730 ,0x00003FFF ,0x00000600
  204. ,mask_write ,0xF8000734 ,0x00003FFF ,0x00000600
  205. ,mask_write ,0xF8000738 ,0x00003FFF ,0x00000600
  206. ,mask_write ,0xF800073C ,0x00003FFF ,0x00000600
  207. ,mask_write ,0xF8000740 ,0x00003FFF ,0x00000302
  208. ,mask_write ,0xF8000744 ,0x00003FFF ,0x00000302
  209. ,mask_write ,0xF8000748 ,0x00003FFF ,0x00000302
  210. ,mask_write ,0xF800074C ,0x00003FFF ,0x00000302
  211. ,mask_write ,0xF8000750 ,0x00003FFF ,0x00000302
  212. ,mask_write ,0xF8000754 ,0x00003FFF ,0x00000302
  213. ,mask_write ,0xF8000758 ,0x00003FFF ,0x00000303
  214. ,mask_write ,0xF800075C ,0x00003FFF ,0x00000303
  215. ,mask_write ,0xF8000760 ,0x00003FFF ,0x00000303
  216. ,mask_write ,0xF8000764 ,0x00003FFF ,0x00000303
  217. ,mask_write ,0xF8000768 ,0x00003FFF ,0x00000303
  218. ,mask_write ,0xF800076C ,0x00003FFF ,0x00000303
  219. ,mask_write ,0xF8000770 ,0x00003FFF ,0x00000304
  220. ,mask_write ,0xF8000774 ,0x00003FFF ,0x00000305
  221. ,mask_write ,0xF8000778 ,0x00003FFF ,0x00000304
  222. ,mask_write ,0xF800077C ,0x00003FFF ,0x00000305
  223. ,mask_write ,0xF8000780 ,0x00003FFF ,0x00000304
  224. ,mask_write ,0xF8000784 ,0x00003FFF ,0x00000304
  225. ,mask_write ,0xF8000788 ,0x00003FFF ,0x00000304
  226. ,mask_write ,0xF800078C ,0x00003FFF ,0x00000304
  227. ,mask_write ,0xF8000790 ,0x00003FFF ,0x00000305
  228. ,mask_write ,0xF8000794 ,0x00003FFF ,0x00000304
  229. ,mask_write ,0xF8000798 ,0x00003FFF ,0x00000304
  230. ,mask_write ,0xF800079C ,0x00003FFF ,0x00000304
  231. ,mask_write ,0xF80007A0 ,0x00003FFF ,0x00000380
  232. ,mask_write ,0xF80007A4 ,0x00003FFF ,0x00000380
  233. ,mask_write ,0xF80007A8 ,0x00003FFF ,0x00000380
  234. ,mask_write ,0xF80007AC ,0x00003FFF ,0x00000380
  235. ,mask_write ,0xF80007B0 ,0x00003FFF ,0x00000380
  236. ,mask_write ,0xF80007B4 ,0x00003FFF ,0x00000380
  237. ,mask_write ,0xF80007B8 ,0x00003F01 ,0x00000201
  238. ,mask_write ,0xF80007BC ,0x00003F01 ,0x00000201
  239. ,mask_write ,0xF80007C0 ,0x00003FFF ,0x000002E0
  240. ,mask_write ,0xF80007C4 ,0x00003FFF ,0x000002E1
  241. ,mask_write ,0xF80007C8 ,0x00003FFF ,0x00000201
  242. ,mask_write ,0xF80007CC ,0x00003FFF ,0x00000201
  243. ,mask_write ,0xF80007D0 ,0x00003FFF ,0x00000280
  244. ,mask_write ,0xF80007D4 ,0x00003FFF ,0x00000280
  245. ,mask_write ,0xF8000830 ,0x003F003F ,0x002F002E
  246. ,mask_write ,0xF8000004 ,0x0000FFFF ,0x0000767B
  247. ];
  248. ps7_peripherals_init_data=[
  249. mask_write ,0xE0001034 ,0x000000FF ,0x00000006
  250. ,mask_write ,0xE0001018 ,0x0000FFFF ,0x0000003E
  251. ,mask_write ,0xE0001000 ,0x000001FF ,0x00000017
  252. ,mask_write ,0xE0001004 ,0x00000FFF ,0x00000020
  253. ,mask_write ,0xE000D000 ,0x00080000 ,0x00080000
  254. ,mask_write ,0xF8007000 ,0x20000000 ,0x00000000
  255. ];
  256. (* initialization procedure -- parses data from above and executes. This approach was chosen because it would not produce as many instructions
  257. as would be required if everything was done with procedure calls. This is even more true on ARM platform, where the large immediates would be stored
  258. in (instruction) memory anyway.
  259. *)
  260. PROCEDURE InitSubset(CONST data: ARRAY [*] OF LONGINT);
  261. VAR val, valo, mask: SET; i: LONGINT; opcode, adr: LONGINT;
  262. BEGIN
  263. i := 0;
  264. WHILE i < LEN(data,0) DO
  265. opcode := data[i];
  266. IF opcode = mask_write THEN
  267. adr := data[i+1]; mask := SYSTEM.VAL(SET,data[i+2]); val := SYSTEM.VAL(SET,data[i+3]); INC(i,4);
  268. SYSTEM.GET(adr, valo);
  269. val := mask*val + (-mask) * valo;
  270. SYSTEM.PUT(adr, val);
  271. ELSIF opcode = mask_poll THEN
  272. adr := data[i+1]; mask := SYSTEM.VAL(SET, data[i+2]); INC(i,3);
  273. REPEAT
  274. SYSTEM.GET(adr, val)
  275. UNTIL val * mask # {}
  276. END;
  277. END;
  278. END InitSubset;
  279. PROCEDURE InitializeHW;
  280. BEGIN
  281. InitSubset(ps7_mio_init_data);
  282. InitSubset(ps7_pll_init_data);
  283. InitSubset(ps7_clock_init_data);
  284. InitSubset(ps7_ddr_init_data);
  285. InitSubset(ps7_peripherals_init_data);
  286. END InitializeHW;
  287. END ZynqInitializer.