/u-boot/board/bf537-stamp/post-memory.c

https://github.com/cAPSLOCK7/EVBSP-SRC · C · 321 lines · 278 code · 35 blank · 8 comment · 65 complexity · 46083b0ad2e41dba5fa9c6a024217088 MD5 · raw file

  1. #include <common.h>
  2. #include <asm/io.h>
  3. #ifdef CONFIG_POST
  4. #include <post.h>
  5. #include <watchdog.h>
  6. #if CONFIG_POST & CONFIG_SYS_POST_MEMORY
  7. #define CLKIN 25000000
  8. #define PATTERN1 0x5A5A5A5A
  9. #define PATTERN2 0xAAAAAAAA
  10. #define CCLK_NUM 4
  11. #define SCLK_NUM 3
  12. void post_out_buff(char *buff);
  13. int post_key_pressed(void);
  14. void post_init_pll(int mult, int div);
  15. int post_init_sdram(int sclk);
  16. void post_init_uart(int sclk);
  17. const int pll[CCLK_NUM][SCLK_NUM][2] = {
  18. { {20, 4}, {20, 5}, {20, 10} }, /* CCLK = 500M */
  19. { {16, 4}, {16, 5}, {16, 8} }, /* CCLK = 400M */
  20. { {8, 2}, {8, 4}, {8, 5} }, /* CCLK = 200M */
  21. { {4, 1}, {4, 2}, {4, 4} } /* CCLK = 100M */
  22. };
  23. const char *const log[CCLK_NUM][SCLK_NUM] = {
  24. {"CCLK-500MHz SCLK-125MHz: Writing...\0",
  25. "CCLK-500MHz SCLK-100MHz: Writing...\0",
  26. "CCLK-500MHz SCLK- 50MHz: Writing...\0",},
  27. {"CCLK-400MHz SCLK-100MHz: Writing...\0",
  28. "CCLK-400MHz SCLK- 80MHz: Writing...\0",
  29. "CCLK-400MHz SCLK- 50MHz: Writing...\0",},
  30. {"CCLK-200MHz SCLK-100MHz: Writing...\0",
  31. "CCLK-200MHz SCLK- 50MHz: Writing...\0",
  32. "CCLK-200MHz SCLK- 40MHz: Writing...\0",},
  33. {"CCLK-100MHz SCLK-100MHz: Writing...\0",
  34. "CCLK-100MHz SCLK- 50MHz: Writing...\0",
  35. "CCLK-100MHz SCLK- 25MHz: Writing...\0",},
  36. };
  37. int memory_post_test(int flags)
  38. {
  39. int addr;
  40. int m, n;
  41. int sclk, sclk_temp;
  42. int ret = 1;
  43. sclk_temp = CLKIN / 1000000;
  44. sclk_temp = sclk_temp * CONFIG_VCO_MULT;
  45. for (sclk = 0; sclk_temp > 0; sclk++)
  46. sclk_temp -= CONFIG_SCLK_DIV;
  47. sclk = sclk * 1000000;
  48. post_init_uart(sclk);
  49. if (post_key_pressed() == 0)
  50. return 0;
  51. for (m = 0; m < CCLK_NUM; m++) {
  52. for (n = 0; n < SCLK_NUM; n++) {
  53. /* Calculate the sclk */
  54. sclk_temp = CLKIN / 1000000;
  55. sclk_temp = sclk_temp * pll[m][n][0];
  56. for (sclk = 0; sclk_temp > 0; sclk++)
  57. sclk_temp -= pll[m][n][1];
  58. sclk = sclk * 1000000;
  59. post_init_pll(pll[m][n][0], pll[m][n][1]);
  60. post_init_sdram(sclk);
  61. post_init_uart(sclk);
  62. post_out_buff("\n\r\0");
  63. post_out_buff(log[m][n]);
  64. for (addr = 0x0; addr < CONFIG_SYS_MAX_RAM_SIZE; addr += 4)
  65. *(unsigned long *)addr = PATTERN1;
  66. post_out_buff("Reading...\0");
  67. for (addr = 0x0; addr < CONFIG_SYS_MAX_RAM_SIZE; addr += 4) {
  68. if ((*(unsigned long *)addr) != PATTERN1) {
  69. post_out_buff("Error\n\r\0");
  70. ret = 0;
  71. }
  72. }
  73. post_out_buff("OK\n\r\0");
  74. }
  75. }
  76. if (ret)
  77. post_out_buff("memory POST passed\n\r\0");
  78. else
  79. post_out_buff("memory POST failed\n\r\0");
  80. post_out_buff("\n\r\n\r\0");
  81. return 1;
  82. }
  83. void post_init_uart(int sclk)
  84. {
  85. int divisor;
  86. for (divisor = 0; sclk > 0; divisor++)
  87. sclk -= 57600 * 16;
  88. *pPORTF_FER = 0x000F;
  89. *pPORTH_FER = 0xFFFF;
  90. *pUART_GCTL = 0x00;
  91. *pUART_LCR = 0x83;
  92. SSYNC();
  93. *pUART_DLL = (divisor & 0xFF);
  94. SSYNC();
  95. *pUART_DLH = ((divisor >> 8) & 0xFF);
  96. SSYNC();
  97. *pUART_LCR = 0x03;
  98. SSYNC();
  99. *pUART_GCTL = 0x01;
  100. SSYNC();
  101. }
  102. void post_out_buff(char *buff)
  103. {
  104. int i = 0;
  105. for (i = 0; i < 0x80000; i++)
  106. ;
  107. i = 0;
  108. while ((buff[i] != '\0') && (i != 100)) {
  109. while (!(*pUART_LSR & 0x20)) ;
  110. *pUART_THR = buff[i];
  111. SSYNC();
  112. i++;
  113. }
  114. for (i = 0; i < 0x80000; i++)
  115. ;
  116. }
  117. /* Using sw10-PF5 as the hotkey */
  118. #define KEY_LOOP 0x80000
  119. #define KEY_DELAY 0x80
  120. int post_key_pressed(void)
  121. {
  122. int i, n;
  123. unsigned short value;
  124. *pPORTF_FER &= ~PF5;
  125. *pPORTFIO_DIR &= ~PF5;
  126. *pPORTFIO_INEN |= PF5;
  127. SSYNC();
  128. post_out_buff("########Press SW10 to enter Memory POST########: 3\0");
  129. for (i = 0; i < KEY_LOOP; i++) {
  130. value = *pPORTFIO & PF5;
  131. if (*pUART0_RBR == 0x0D) {
  132. value = 0;
  133. goto key_pressed;
  134. }
  135. if (value != 0)
  136. goto key_pressed;
  137. for (n = 0; n < KEY_DELAY; n++)
  138. asm("nop");
  139. }
  140. post_out_buff("\b2\0");
  141. for (i = 0; i < KEY_LOOP; i++) {
  142. value = *pPORTFIO & PF5;
  143. if (*pUART0_RBR == 0x0D) {
  144. value = 0;
  145. goto key_pressed;
  146. }
  147. if (value != 0)
  148. goto key_pressed;
  149. for (n = 0; n < KEY_DELAY; n++)
  150. asm("nop");
  151. }
  152. post_out_buff("\b1\0");
  153. for (i = 0; i < KEY_LOOP; i++) {
  154. value = *pPORTFIO & PF5;
  155. if (*pUART0_RBR == 0x0D) {
  156. value = 0;
  157. goto key_pressed;
  158. }
  159. if (value != 0)
  160. goto key_pressed;
  161. for (n = 0; n < KEY_DELAY; n++)
  162. asm("nop");
  163. }
  164. key_pressed:
  165. post_out_buff("\b0");
  166. post_out_buff("\n\r\0");
  167. if (value == 0)
  168. return 0;
  169. post_out_buff("Hotkey has been pressed, Enter POST . . . . . .\n\r\0");
  170. return 1;
  171. }
  172. void post_init_pll(int mult, int div)
  173. {
  174. *pSIC_IWR = 0x01;
  175. *pPLL_CTL = (mult << 9);
  176. *pPLL_DIV = div;
  177. asm("CLI R2;");
  178. asm("IDLE;");
  179. asm("STI R2;");
  180. while (!(*pPLL_STAT & 0x20)) ;
  181. }
  182. int post_init_sdram(int sclk)
  183. {
  184. int SDRAM_tRP, SDRAM_tRP_num, SDRAM_tRAS, SDRAM_tRAS_num, SDRAM_tRCD,
  185. SDRAM_tWR;
  186. int SDRAM_Tref, SDRAM_NRA, SDRAM_CL, SDRAM_SIZE, SDRAM_WIDTH,
  187. mem_SDGCTL, mem_SDBCTL, mem_SDRRC;
  188. if ((sclk > 119402985)) {
  189. SDRAM_tRP = TRP_2;
  190. SDRAM_tRP_num = 2;
  191. SDRAM_tRAS = TRAS_7;
  192. SDRAM_tRAS_num = 7;
  193. SDRAM_tRCD = TRCD_2;
  194. SDRAM_tWR = TWR_2;
  195. } else if ((sclk > 104477612) && (sclk <= 119402985)) {
  196. SDRAM_tRP = TRP_2;
  197. SDRAM_tRP_num = 2;
  198. SDRAM_tRAS = TRAS_6;
  199. SDRAM_tRAS_num = 6;
  200. SDRAM_tRCD = TRCD_2;
  201. SDRAM_tWR = TWR_2;
  202. } else if ((sclk > 89552239) && (sclk <= 104477612)) {
  203. SDRAM_tRP = TRP_2;
  204. SDRAM_tRP_num = 2;
  205. SDRAM_tRAS = TRAS_5;
  206. SDRAM_tRAS_num = 5;
  207. SDRAM_tRCD = TRCD_2;
  208. SDRAM_tWR = TWR_2;
  209. } else if ((sclk > 74626866) && (sclk <= 89552239)) {
  210. SDRAM_tRP = TRP_2;
  211. SDRAM_tRP_num = 2;
  212. SDRAM_tRAS = TRAS_4;
  213. SDRAM_tRAS_num = 4;
  214. SDRAM_tRCD = TRCD_2;
  215. SDRAM_tWR = TWR_2;
  216. } else if ((sclk > 66666667) && (sclk <= 74626866)) {
  217. SDRAM_tRP = TRP_2;
  218. SDRAM_tRP_num = 2;
  219. SDRAM_tRAS = TRAS_3;
  220. SDRAM_tRAS_num = 3;
  221. SDRAM_tRCD = TRCD_2;
  222. SDRAM_tWR = TWR_2;
  223. } else if ((sclk > 59701493) && (sclk <= 66666667)) {
  224. SDRAM_tRP = TRP_1;
  225. SDRAM_tRP_num = 1;
  226. SDRAM_tRAS = TRAS_4;
  227. SDRAM_tRAS_num = 4;
  228. SDRAM_tRCD = TRCD_1;
  229. SDRAM_tWR = TWR_2;
  230. } else if ((sclk > 44776119) && (sclk <= 59701493)) {
  231. SDRAM_tRP = TRP_1;
  232. SDRAM_tRP_num = 1;
  233. SDRAM_tRAS = TRAS_3;
  234. SDRAM_tRAS_num = 3;
  235. SDRAM_tRCD = TRCD_1;
  236. SDRAM_tWR = TWR_2;
  237. } else if ((sclk > 29850746) && (sclk <= 44776119)) {
  238. SDRAM_tRP = TRP_1;
  239. SDRAM_tRP_num = 1;
  240. SDRAM_tRAS = TRAS_2;
  241. SDRAM_tRAS_num = 2;
  242. SDRAM_tRCD = TRCD_1;
  243. SDRAM_tWR = TWR_2;
  244. } else if (sclk <= 29850746) {
  245. SDRAM_tRP = TRP_1;
  246. SDRAM_tRP_num = 1;
  247. SDRAM_tRAS = TRAS_1;
  248. SDRAM_tRAS_num = 1;
  249. SDRAM_tRCD = TRCD_1;
  250. SDRAM_tWR = TWR_2;
  251. } else {
  252. SDRAM_tRP = TRP_1;
  253. SDRAM_tRP_num = 1;
  254. SDRAM_tRAS = TRAS_1;
  255. SDRAM_tRAS_num = 1;
  256. SDRAM_tRCD = TRCD_1;
  257. SDRAM_tWR = TWR_2;
  258. }
  259. /*SDRAM INFORMATION: */
  260. SDRAM_Tref = 64; /* Refresh period in milliseconds */
  261. SDRAM_NRA = 4096; /* Number of row addresses in SDRAM */
  262. SDRAM_CL = CL_3; /* 2 */
  263. SDRAM_SIZE = EBSZ_64;
  264. SDRAM_WIDTH = EBCAW_10;
  265. mem_SDBCTL = SDRAM_WIDTH | SDRAM_SIZE | EBE;
  266. /* Equation from section 17 (p17-46) of BF533 HRM */
  267. mem_SDRRC =
  268. (((CONFIG_SCLK_HZ / 1000) * SDRAM_Tref) / SDRAM_NRA) -
  269. (SDRAM_tRAS_num + SDRAM_tRP_num);
  270. /* Enable SCLK Out */
  271. mem_SDGCTL =
  272. (SCTLE | SDRAM_CL | SDRAM_tRAS | SDRAM_tRP | SDRAM_tRCD | SDRAM_tWR
  273. | PSS);
  274. SSYNC();
  275. *pEBIU_SDGCTL |= 0x1000000;
  276. /* Set the SDRAM Refresh Rate control register based on SSCLK value */
  277. *pEBIU_SDRRC = mem_SDRRC;
  278. /* SDRAM Memory Bank Control Register */
  279. *pEBIU_SDBCTL = mem_SDBCTL;
  280. /* SDRAM Memory Global Control Register */
  281. *pEBIU_SDGCTL = mem_SDGCTL;
  282. SSYNC();
  283. return mem_SDRRC;
  284. }
  285. #endif /* CONFIG_POST & CONFIG_SYS_POST_MEMORY */
  286. #endif /* CONFIG_POST */