cmd_pll.c 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. /*
  2. * (C) Copyright 2000, 2001
  3. * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
  4. *
  5. * SPDX-License-Identifier: GPL-2.0+
  6. */
  7. /*
  8. * ehnus: change pll frequency.
  9. * Wed Sep 5 11:45:17 CST 2007
  10. * hsun@udtech.com.cn
  11. */
  12. #include <common.h>
  13. #include <config.h>
  14. #include <command.h>
  15. #include <i2c.h>
  16. #ifdef CONFIG_CMD_EEPROM
  17. #define EEPROM_CONF_OFFSET 0
  18. #define EEPROM_TEST_OFFSET 16
  19. #define EEPROM_SDSTP_PARAM 16
  20. #define PLL_NAME_MAX 12
  21. #define BUF_STEP 8
  22. /* eeprom_wirtes 8Byte per op. */
  23. #define EEPROM_ALTER_FREQ(freq) \
  24. do { \
  25. int __i; \
  26. for (__i = 0; __i < 2; __i++) \
  27. eeprom_write (CONFIG_SYS_I2C_EEPROM_ADDR, \
  28. EEPROM_CONF_OFFSET + __i*BUF_STEP, \
  29. pll_select[freq], \
  30. BUF_STEP + __i*BUF_STEP); \
  31. } while (0)
  32. #define PDEBUG
  33. #ifdef PDEBUG
  34. #define PLL_DEBUG pll_debug(EEPROM_CONF_OFFSET)
  35. #else
  36. #define PLL_DEBUG
  37. #endif
  38. typedef enum {
  39. PLL_ebc20,
  40. PLL_333,
  41. PLL_4001,
  42. PLL_4002,
  43. PLL_533,
  44. PLL_600,
  45. PLL_666, /* For now, kilauea can't support */
  46. RCONF,
  47. WTEST,
  48. PLL_TOTAL
  49. } pll_freq_t;
  50. static const char
  51. pll_name[][PLL_NAME_MAX] = {
  52. "PLL_ebc20",
  53. "PLL_333",
  54. "PLL_400@1",
  55. "PLL_400@2",
  56. "PLL_533",
  57. "PLL_600",
  58. "PLL_666",
  59. "RCONF",
  60. "WTEST",
  61. ""
  62. };
  63. /*
  64. * ehnus:
  65. */
  66. static uchar
  67. pll_select[][EEPROM_SDSTP_PARAM] = {
  68. /* 0: CPU 333MHz EBC 20MHz, for test only */
  69. {
  70. 0x8c, 0x12, 0xec, 0x12, 0x88, 0x00, 0x0a, 0x00,
  71. 0x40, 0x08, 0x23, 0x50, 0x00, 0x05, 0x00, 0x00
  72. },
  73. /* 0: 333 */
  74. {
  75. 0x8c, 0x12, 0xec, 0x12, 0x98, 0x00, 0x0a, 0x00,
  76. 0x40, 0x08, 0x23, 0x50, 0x00, 0x05, 0x00, 0x00
  77. },
  78. /* 1: 400_266 */
  79. {
  80. 0x8e, 0x0e, 0xe8, 0x13, 0x98, 0x00, 0x0a, 0x00,
  81. 0x40, 0x08, 0x23, 0x50, 0x00, 0x05, 0x00, 0x00
  82. },
  83. /* 2: 400 */
  84. {
  85. 0x8e, 0x0e, 0xe8, 0x12, 0x98, 0x00, 0x0a, 0x00,
  86. 0x40, 0x08, 0x23, 0x50, 0x00, 0x05, 0x00, 0x00
  87. },
  88. /* 3: 533 */
  89. {
  90. 0x8e, 0x43, 0x60, 0x13, 0x98, 0x00, 0x0a, 0x00,
  91. 0x40, 0x08, 0x23, 0x50, 0x00, 0x05, 0x00, 0x00
  92. },
  93. /* 4: 600 */
  94. {
  95. 0x8d, 0x02, 0x34, 0x13, 0x98, 0x00, 0x0a, 0x00,
  96. 0x40, 0x08, 0x23, 0x50, 0x00, 0x05, 0x00, 0x00
  97. },
  98. /* 5: 666 */
  99. {
  100. 0x8d, 0x03, 0x78, 0x13, 0x98, 0x00, 0x0a, 0x00,
  101. 0x40, 0x08, 0x23, 0x50, 0x00, 0x05, 0x00, 0x00
  102. },
  103. {}
  104. };
  105. static uchar
  106. testbuf[EEPROM_SDSTP_PARAM] = {
  107. 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
  108. 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff
  109. };
  110. static void
  111. pll_debug(int off)
  112. {
  113. int i;
  114. uchar buffer[EEPROM_SDSTP_PARAM];
  115. memset(buffer, 0, sizeof(buffer));
  116. eeprom_read(CONFIG_SYS_I2C_EEPROM_ADDR, off,
  117. buffer, EEPROM_SDSTP_PARAM);
  118. printf("Debug: SDSTP[0-3] at offset \"0x%02x\" lists as follows: \n", off);
  119. for (i = 0; i < EEPROM_SDSTP_PARAM; i++)
  120. printf("%02x ", buffer[i]);
  121. printf("\n");
  122. }
  123. static void
  124. test_write(void)
  125. {
  126. printf("Debug: test eeprom_write ... ");
  127. /*
  128. * Write twice, 8 bytes per write
  129. */
  130. eeprom_write (CONFIG_SYS_I2C_EEPROM_ADDR, EEPROM_TEST_OFFSET,
  131. testbuf, 8);
  132. eeprom_write (CONFIG_SYS_I2C_EEPROM_ADDR, EEPROM_TEST_OFFSET+8,
  133. testbuf, 16);
  134. printf("done\n");
  135. pll_debug(EEPROM_TEST_OFFSET);
  136. }
  137. int
  138. do_pll_alter (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  139. {
  140. char c = '\0';
  141. pll_freq_t pll_freq;
  142. if (argc < 2)
  143. return cmd_usage(cmdtp);
  144. for (pll_freq = PLL_ebc20; pll_freq < PLL_TOTAL; pll_freq++) {
  145. if (!strcmp(pll_name[pll_freq], argv[1]))
  146. break;
  147. }
  148. switch (pll_freq) {
  149. case PLL_ebc20:
  150. case PLL_333:
  151. case PLL_4001:
  152. case PLL_4002:
  153. case PLL_533:
  154. case PLL_600:
  155. EEPROM_ALTER_FREQ(pll_freq);
  156. break;
  157. case PLL_666: /* not support */
  158. printf("Choose this option will result in a boot failure."
  159. "\nContinue? (Y/N): ");
  160. c = getc(); putc('\n');
  161. if ((c == 'y') || (c == 'Y')) {
  162. EEPROM_ALTER_FREQ(pll_freq);
  163. break;
  164. }
  165. goto ret;
  166. case RCONF:
  167. pll_debug(EEPROM_CONF_OFFSET);
  168. goto ret;
  169. case WTEST:
  170. printf("DEBUG: write test\n");
  171. test_write();
  172. goto ret;
  173. default:
  174. printf("Invalid options\n\n");
  175. return cmd_usage(cmdtp);
  176. }
  177. printf("PLL set to %s, "
  178. "reset the board to take effect\n", pll_name[pll_freq]);
  179. PLL_DEBUG;
  180. ret:
  181. return 0;
  182. }
  183. U_BOOT_CMD(
  184. pllalter, CONFIG_SYS_MAXARGS, 1, do_pll_alter,
  185. "change pll frequence",
  186. "pllalter <selection> - change pll frequence \n\n\
  187. ** New freq take effect after reset. ** \n\
  188. ----------------------------------------------\n\
  189. PLL_ebc20: Board: AMCC 405EX(r) Evaluation Board\n\
  190. \t Same as PLL_333 \n\
  191. \t except \n\
  192. \t EBC: 20 MHz \n\
  193. ----------------------------------------------\n\
  194. PLL_333: Board: AMCC 405EX(r) Evaluation Board\n\
  195. \t VCO: 666 MHz \n\
  196. \t CPU: 333 MHz \n\
  197. \t PLB: 166 MHz \n\
  198. \t OPB: 83 MHz \n\
  199. \t DDR: 83 MHz \n\
  200. ------------------------------------------------\n\
  201. PLL_400@1: Board: AMCC 405EX(r) Evaluation Board\n\
  202. \t VCO: 800 MHz \n\
  203. \t CPU: 400 MHz \n\
  204. \t PLB: 133 MHz \n\
  205. \t OPB: 66 MHz \n\
  206. \t DDR: 133 MHz \n\
  207. ------------------------------------------------\n\
  208. PLL_400@2: Board: AMCC 405EX(r) Evaluation Board\n\
  209. \t VCO: 800 MHz \n\
  210. \t CPU: 400 MHz \n\
  211. \t PLB: 200 MHz \n\
  212. \t OPB: 100 MHz \n\
  213. \t DDR: 200 MHz \n\
  214. ----------------------------------------------\n\
  215. PLL_533: Board: AMCC 405EX(r) Evaluation Board\n\
  216. \t VCO: 1066 MHz \n\
  217. \t CPU: 533 MHz \n\
  218. \t PLB: 177 MHz \n\
  219. \t OPB: 88 MHz \n\
  220. \t DDR: 177 MHz \n\
  221. ----------------------------------------------\n\
  222. PLL_600: Board: AMCC 405EX(r) Evaluation Board\n\
  223. \t VCO: 1200 MHz \n\
  224. \t CPU: 600 MHz \n\
  225. \t PLB: 200 MHz \n\
  226. \t OPB: 100 MHz \n\
  227. \t DDR: 200 MHz \n\
  228. ----------------------------------------------\n\
  229. PLL_666: Board: AMCC 405EX(r) Evaluation Board\n\
  230. \t VCO: 1333 MHz \n\
  231. \t CPU: 666 MHz \n\
  232. \t PLB: 166 MHz \n\
  233. \t OPB: 83 MHz \n\
  234. \t DDR: 166 MHz \n\
  235. -----------------------------------------------\n\
  236. RCONF: Read current eeprom configuration. \n\
  237. -----------------------------------------------\n\
  238. WTEST: Test EEPROM write with predefined values\n\
  239. -----------------------------------------------"
  240. );
  241. #endif /* CONFIG_CMD_EEPROM */