sdram_init.jlinkscript 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. /*********************************************************************
  2. * SEGGER MICROCONTROLLER GmbH & Co. K.G. *
  3. * Solutions for real time microcontroller applications *
  4. **********************************************************************
  5. * *
  6. * (c) 2011-2015 SEGGER Microcontroller GmbH & Co. KG *
  7. * *
  8. * Internet: www.segger.com Support: support@segger.com *
  9. * *
  10. **********************************************************************
  11. ----------------------------------------------------------------------
  12. Purpose :
  13. ---------------------------END-OF-HEADER------------------------------
  14. */
  15. void Clock_Init() {
  16. // Enable all clocks
  17. MEM_WriteU32(0x400FC068,0xffffffff);
  18. MEM_WriteU32(0x400FC06C,0xffffffff);
  19. MEM_WriteU32(0x400FC070,0xffffffff);
  20. MEM_WriteU32(0x400FC074,0xffffffff);
  21. MEM_WriteU32(0x400FC078,0xffffffff);
  22. MEM_WriteU32(0x400FC07C,0xffffffff);
  23. MEM_WriteU32(0x400FC080,0xffffffff);
  24. MEM_WriteU32(0x400D8030,0x00002001);
  25. MEM_WriteU32(0x400D8100,0x00100000);
  26. MEM_WriteU32(0x400FC014,0x00050D40);
  27. Report("Clock Init Done");
  28. }
  29. void SDRAM_WaitIpCmdDone(void)
  30. {
  31. unsigned int reg;
  32. do
  33. {
  34. reg = MEM_ReadU32(0x402F003C);
  35. }while((reg & 0x3) == 0);
  36. }
  37. void SDRAM_Init() {
  38. // Config IOMUX for SDRAM
  39. MEM_WriteU32(0x401F8014,0x00000000);
  40. MEM_WriteU32(0x401F8018,0x00000000);
  41. MEM_WriteU32(0x401F801C,0x00000000);
  42. MEM_WriteU32(0x401F8020,0x00000000);
  43. MEM_WriteU32(0x401F8024,0x00000000);
  44. MEM_WriteU32(0x401F8028,0x00000000);
  45. MEM_WriteU32(0x401F802C,0x00000000);
  46. MEM_WriteU32(0x401F8030,0x00000000);
  47. MEM_WriteU32(0x401F8034,0x00000000);
  48. MEM_WriteU32(0x401F8038,0x00000000);
  49. MEM_WriteU32(0x401F803C,0x00000000);
  50. MEM_WriteU32(0x401F8040,0x00000000);
  51. MEM_WriteU32(0x401F8044,0x00000000);
  52. MEM_WriteU32(0x401F8048,0x00000000);
  53. MEM_WriteU32(0x401F804C,0x00000000);
  54. MEM_WriteU32(0x401F8050,0x00000000);
  55. MEM_WriteU32(0x401F8054,0x00000000);
  56. MEM_WriteU32(0x401F8058,0x00000000);
  57. MEM_WriteU32(0x401F805C,0x00000000);
  58. MEM_WriteU32(0x401F8060,0x00000000);
  59. MEM_WriteU32(0x401F8064,0x00000000);
  60. MEM_WriteU32(0x401F8068,0x00000000);
  61. MEM_WriteU32(0x401F806C,0x00000000);
  62. MEM_WriteU32(0x401F8070,0x00000000);
  63. MEM_WriteU32(0x401F8074,0x00000000);
  64. MEM_WriteU32(0x401F8078,0x00000000);
  65. MEM_WriteU32(0x401F807C,0x00000000);
  66. MEM_WriteU32(0x401F8080,0x00000000);
  67. MEM_WriteU32(0x401F8084,0x00000000);
  68. MEM_WriteU32(0x401F8088,0x00000000);
  69. MEM_WriteU32(0x401F808C,0x00000000);
  70. MEM_WriteU32(0x401F8090,0x00000000);
  71. MEM_WriteU32(0x401F8094,0x00000000);
  72. MEM_WriteU32(0x401F8098,0x00000000);
  73. MEM_WriteU32(0x401F809C,0x00000000);
  74. MEM_WriteU32(0x401F80A0,0x00000000);
  75. MEM_WriteU32(0x401F80A4,0x00000000);
  76. MEM_WriteU32(0x401F80A8,0x00000000);
  77. MEM_WriteU32(0x401F80AC,0x00000000);
  78. MEM_WriteU32(0x401F80B0,0x00000000);
  79. MEM_WriteU32(0x401F80B4,0x00000000);
  80. MEM_WriteU32(0x401F80B8,0x00000000);
  81. // PAD ctrl
  82. MEM_WriteU32(0x401F8204,0x000000F1);
  83. MEM_WriteU32(0x401F8208,0x000000F1);
  84. MEM_WriteU32(0x401F820C,0x000000F1);
  85. MEM_WriteU32(0x401F8210,0x000000F1);
  86. MEM_WriteU32(0x401F8214,0x000000F1);
  87. MEM_WriteU32(0x401F8218,0x000000F1);
  88. MEM_WriteU32(0x401F821C,0x000000F1);
  89. MEM_WriteU32(0x401F8220,0x000000F1);
  90. MEM_WriteU32(0x401F8224,0x000000F1);
  91. MEM_WriteU32(0x401F8228,0x000000F1);
  92. MEM_WriteU32(0x401F822C,0x000000F1);
  93. MEM_WriteU32(0x401F8230,0x000000F1);
  94. MEM_WriteU32(0x401F8234,0x000000F1);
  95. MEM_WriteU32(0x401F8238,0x000000F1);
  96. MEM_WriteU32(0x401F823C,0x000000F1);
  97. MEM_WriteU32(0x401F8240,0x000000F1);
  98. MEM_WriteU32(0x401F8244,0x000000F1);
  99. MEM_WriteU32(0x401F8248,0x000000F1);
  100. MEM_WriteU32(0x401F824C,0x000000F1);
  101. MEM_WriteU32(0x401F8250,0x000000F1);
  102. MEM_WriteU32(0x401F8254,0x000000F1);
  103. MEM_WriteU32(0x401F8258,0x000000F1);
  104. MEM_WriteU32(0x401F825C,0x000000F1);
  105. MEM_WriteU32(0x401F8260,0x000000F1);
  106. MEM_WriteU32(0x401F8264,0x000000F1);
  107. MEM_WriteU32(0x401F8268,0x000000F1);
  108. MEM_WriteU32(0x401F826C,0x000000F1);
  109. MEM_WriteU32(0x401F8270,0x000000F1);
  110. MEM_WriteU32(0x401F8274,0x000000F1);
  111. MEM_WriteU32(0x401F8278,0x000000F1);
  112. MEM_WriteU32(0x401F827C,0x000000F1);
  113. MEM_WriteU32(0x401F8280,0x000000F1);
  114. MEM_WriteU32(0x401F8284,0x000000F1);
  115. MEM_WriteU32(0x401F8288,0x000000F1);
  116. MEM_WriteU32(0x401F828C,0x000000F1);
  117. MEM_WriteU32(0x401F8290,0x000000F1);
  118. MEM_WriteU32(0x401F8294,0x000000F1);
  119. MEM_WriteU32(0x401F8298,0x000000F1);
  120. MEM_WriteU32(0x401F829C,0x000000F1);
  121. MEM_WriteU32(0x401F82A0,0x000000F1);
  122. MEM_WriteU32(0x401F82A4,0x000000F1);
  123. MEM_WriteU32(0x401F82A8,0x000000F1);
  124. // Config SEMC
  125. MEM_WriteU32(0x402F0000,0x1000E000);
  126. MEM_WriteU32(0x402F0008,0x00030524);
  127. MEM_WriteU32(0x402F000C,0x06030524);
  128. MEM_WriteU32(0x402F0010,0x8000001B);
  129. MEM_WriteU32(0x402F0014,0x90000021);
  130. MEM_WriteU32(0x402F0004,0x00000008);
  131. MEM_WriteU32(0x402F0040,0x00000B27);
  132. MEM_WriteU32(0x402F0044,0x00100100);
  133. MEM_WriteU32(0x402F0048,0x00020201);
  134. MEM_WriteU32(0x402F004C,0x08193D0E);
  135. MEM_WriteU32(0x402F0080,0x00000021);
  136. MEM_WriteU32(0x402F0084,0x00888888);
  137. MEM_WriteU32(0x402F0094,0x00000002);
  138. MEM_WriteU32(0x402F0098,0x00000000);
  139. MEM_WriteU32(0x402F0090,0x80000000);
  140. MEM_WriteU32(0x402F009C,0xA55A000F);
  141. SDRAM_WaitIpCmdDone();
  142. MEM_WriteU32(0x402F0090,0x80000000);
  143. MEM_WriteU32(0x402F009C,0xA55A000C);
  144. SDRAM_WaitIpCmdDone();
  145. MEM_WriteU32(0x402F0090,0x80000000);
  146. MEM_WriteU32(0x402F009C,0xA55A000C);
  147. SDRAM_WaitIpCmdDone();
  148. MEM_WriteU32(0x402F00A0,0x00000022);
  149. MEM_WriteU32(0x402F0090,0x80000000);
  150. MEM_WriteU32(0x402F009C,0xA55A000A);
  151. SDRAM_WaitIpCmdDone();
  152. Report("SDRAM Init Done");
  153. }
  154. /* MPU configuration */
  155. void MPU_Init()
  156. {
  157. unsigned int rbar0;
  158. unsigned int rbar1;
  159. unsigned int rbar2;
  160. unsigned int rbar3;
  161. unsigned int rbar4;
  162. unsigned int rbar5;
  163. unsigned int rbar6;
  164. unsigned int rasr0;
  165. unsigned int rasr1;
  166. unsigned int rasr2;
  167. unsigned int rasr3;
  168. unsigned int rasr4;
  169. unsigned int rasr5;
  170. unsigned int rasr6;
  171. unsigned int ctrl;
  172. rbar0 = ((0xC0000000 & ((0x7FFFFFF << 5))) | (1 << 4) | (0 << 0));
  173. rbar1 = ((0x80000000 & ((0x7FFFFFF << 5))) | (1 << 4) | (1 << 0));
  174. rbar2 = ((0x60000000 & ((0x7FFFFFF << 5))) | (1 << 4) | (2 << 0));
  175. rbar3 = ((0x10000000 & ((0x7FFFFFF << 5))) | (1 << 4) | (3 << 0));
  176. rbar4 = ((0x08000000 & ((0x7FFFFFF << 5))) | (1 << 4) | (4 << 0));
  177. rbar5 = ((0x80000000 & ((0x7FFFFFF << 5))) | (1 << 4) | (5 << 0));
  178. rbar6 = ((0x81E00000 & ((0x7FFFFFF << 5))) | (1 << 4) | (6 << 0));
  179. rasr0 = (0x3 << 24) | (2 << 19) | (0xC0 << 8) | (28 << 1) | (1 << 0);
  180. rasr1 = (0x3 << 24) | (2 << 19) | (0xC0 << 8) | (29 << 1) | (1 << 0);
  181. rasr2 = (0x3 << 24) | (2 << 19) | (0xC0 << 8) | (28 << 1) | (1 << 0);
  182. rasr3 = (0x3 << 24) | (2 << 19) | (0xC0 << 8) | (27 << 1) | (1 << 0);
  183. rasr4 = (0x3 << 24) | (2 << 19) | (0xC0 << 8) | (26 << 1) | (1 << 0);
  184. rasr5 = (0x3 << 24) | (3 << 16) | (0xC0 << 8) | (25 << 1) | (1 << 0);
  185. rasr6 = (0x3 << 24) | (1 << 19) | (0xC0 << 8) | (20 << 1) | (1 << 0);
  186. ctrl = (0x1 << 0) | (1 << 2);
  187. /* MPU_CTRL. */
  188. MEM_WriteU32(0xE000ED94, 0x0);
  189. /* MPU_RBAR. */
  190. MEM_WriteU32(0xE000ED9C, rbar6);
  191. /* MPU_RASR. */
  192. MEM_WriteU32(0xE000EDA0, rasr6);
  193. /* MPU_RBAR. */
  194. MEM_WriteU32(0xE000ED9C, rbar5);
  195. /* MPU_RASR. */
  196. MEM_WriteU32(0xE000EDA0, rasr5);
  197. /* MPU_RBAR. */
  198. MEM_WriteU32(0xE000ED9C, rbar4);
  199. /* MPU_RASR. */
  200. MEM_WriteU32(0xE000EDA0, rasr4);
  201. /* MPU_RBAR. */
  202. MEM_WriteU32(0xE000ED9C, rbar3);
  203. /* MPU_RASR. */
  204. MEM_WriteU32(0xE000EDA0, rasr3);
  205. /* MPU_RBAR. */
  206. MEM_WriteU32(0xE000ED9C, rbar2);
  207. /* MPU_RASR. */
  208. MEM_WriteU32(0xE000EDA0, rasr2);
  209. /* MPU_RBAR. */
  210. MEM_WriteU32(0xE000ED9C, rbar1);
  211. /* MPU_RASR. */
  212. MEM_WriteU32(0xE000EDA0, rasr1);
  213. /* MPU_RBAR. */
  214. MEM_WriteU32(0xE000ED9C, rbar0);
  215. /* MPU_RASR. */
  216. MEM_WriteU32(0xE000EDA0, rasr0);
  217. /* MPU_CTRL. */
  218. MEM_WriteU32(0xE000ED94, ctrl);
  219. }
  220. void flexram_init(void)
  221. {
  222. Report("flexram init\n");
  223. MEM_WriteU32(0x400AC040, 0x80000000); //IOMUXC_GPR_GPR16
  224. //MEM_WriteU32(0x400AC044, 0xFFFFAA55); //IOMUXC_GPR_GPR17: 256K ITCM, 128K DTCM, 128K OCRAM
  225. MEM_WriteU32(0x400AC044, 0xFFFFFFFF); //IOMUXC_GPR_GPR17: 512K ITCM
  226. MEM_WriteU32(0x400AC038, 0x00890000); //IOMUXC_GPR_GPR14
  227. MEM_WriteU32(0x400AC040, 0x80000007); //IOMUXC_GPR_GPR16
  228. }
  229. /* ConfigTarget */
  230. void ConfigTargetSettings(void)
  231. {
  232. Report("Config JTAG Speed to 4000kHz");
  233. JTAG_Speed = 4000;
  234. }
  235. /* SetupTarget */
  236. void SetupTarget(void) {
  237. Report("Enabling i.MXRT SDRAM");
  238. Clock_Init();
  239. flexram_init();
  240. SDRAM_Init();
  241. MPU_Init();
  242. }
  243. /* ResetTarget */
  244. void ResetTarget(void) {
  245. unsigned int v;
  246. unsigned int Tmp;
  247. //
  248. // J-Link DLL expects CPU to be reset and halted when leaving this function
  249. //
  250. Report("J-Link script: ResetTarget()");
  251. //issue a software reset
  252. //Tmp = MEM_ReadU32(0xE000ED0C);
  253. //Tmp = (Tmp&0x0000ffff)|0x05fa0000|(1<<2);
  254. //MEM_WriteU32(0xE000ED0C,Tmp);
  255. //SYS_Sleep(10);
  256. // Read IDCODE
  257. v=JLINK_CORESIGHT_ReadDP(0);
  258. Report1("DP0: ", v);
  259. // Power up Debugger
  260. JLINK_CORESIGHT_WriteDP(1, 0x50000000);
  261. v=JLINK_CORESIGHT_ReadDP(1);
  262. Report1("DP1: ", v);
  263. JLINK_CORESIGHT_WriteAP(0, 0x23000042);
  264. v=JLINK_CORESIGHT_ReadAP(0);
  265. Report1("AHB-AP0: ", v);
  266. JLINK_CORESIGHT_WriteAP(1, 0xE000EDF0);
  267. v=JLINK_CORESIGHT_ReadAP(1);
  268. Report1("AHB-AP1: ", v);
  269. v=JLINK_CORESIGHT_ReadAP(3);
  270. Report1("AHB-AP3: ", v);
  271. JLINK_CORESIGHT_WriteAP(3, 0xa05f0003);
  272. v=JLINK_CORESIGHT_ReadAP(3);
  273. Report1("AHB-AP3: ", v);
  274. Clock_Init();
  275. SDRAM_Init();
  276. MPU_Init();
  277. }