board.c 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * board.c
  4. *
  5. * Board functions for B&R BRXRE1 Board
  6. *
  7. * Copyright (C) 2013 Hannes Schmelzer <oe5hpm@oevsv.at>
  8. * Bernecker & Rainer Industrieelektronik GmbH - http://www.br-automation.com
  9. *
  10. */
  11. #include <common.h>
  12. #include <errno.h>
  13. #include <spl.h>
  14. #include <asm/arch/cpu.h>
  15. #include <asm/arch/hardware.h>
  16. #include <asm/arch/omap.h>
  17. #include <asm/arch/ddr_defs.h>
  18. #include <asm/arch/clock.h>
  19. #include <asm/arch/gpio.h>
  20. #include <asm/arch/sys_proto.h>
  21. #include <asm/arch/mem.h>
  22. #include <asm/io.h>
  23. #include <asm/emif.h>
  24. #include <asm/gpio.h>
  25. #include <i2c.h>
  26. #include <power/tps65217.h>
  27. #include "../common/bur_common.h"
  28. #include <lcd.h>
  29. /* -------------------------------------------------------------------------*/
  30. /* -- defines for used GPIO Hardware -- */
  31. #define ESC_KEY (0+19)
  32. #define LCD_PWR (0+5)
  33. #define PUSH_KEY (0+31)
  34. /* -------------------------------------------------------------------------*/
  35. /* -- PSOC Resetcontroller Register defines -- */
  36. /* I2C Address of controller */
  37. #define RSTCTRL_ADDR 0x75
  38. /* Register for CTRL-word */
  39. #define RSTCTRL_CTRLREG 0x01
  40. /* Register for giving some information to VxWorks OS */
  41. #define RSTCTRL_SCRATCHREG 0x04
  42. /* -- defines for RSTCTRL_CTRLREG -- */
  43. #define RSTCTRL_FORCE_PWR_NEN 0x0404
  44. #define RSTCTRL_CAN_STB 0x4040
  45. DECLARE_GLOBAL_DATA_PTR;
  46. #if defined(CONFIG_SPL_BUILD)
  47. /* TODO: check ram-timing ! */
  48. static const struct ddr_data ddr3_data = {
  49. .datardsratio0 = MT41K256M16HA125E_RD_DQS,
  50. .datawdsratio0 = MT41K256M16HA125E_WR_DQS,
  51. .datafwsratio0 = MT41K256M16HA125E_PHY_FIFO_WE,
  52. .datawrsratio0 = MT41K256M16HA125E_PHY_WR_DATA,
  53. };
  54. static const struct cmd_control ddr3_cmd_ctrl_data = {
  55. .cmd0csratio = MT41K256M16HA125E_RATIO,
  56. .cmd0iclkout = MT41K256M16HA125E_INVERT_CLKOUT,
  57. .cmd1csratio = MT41K256M16HA125E_RATIO,
  58. .cmd1iclkout = MT41K256M16HA125E_INVERT_CLKOUT,
  59. .cmd2csratio = MT41K256M16HA125E_RATIO,
  60. .cmd2iclkout = MT41K256M16HA125E_INVERT_CLKOUT,
  61. };
  62. static struct emif_regs ddr3_emif_reg_data = {
  63. .sdram_config = MT41K256M16HA125E_EMIF_SDCFG,
  64. .ref_ctrl = MT41K256M16HA125E_EMIF_SDREF,
  65. .sdram_tim1 = MT41K256M16HA125E_EMIF_TIM1,
  66. .sdram_tim2 = MT41K256M16HA125E_EMIF_TIM2,
  67. .sdram_tim3 = MT41K256M16HA125E_EMIF_TIM3,
  68. .zq_config = MT41K256M16HA125E_ZQ_CFG,
  69. .emif_ddr_phy_ctlr_1 = MT41K256M16HA125E_EMIF_READ_LATENCY,
  70. };
  71. static const struct ctrl_ioregs ddr3_ioregs = {
  72. .cm0ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  73. .cm1ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  74. .cm2ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  75. .dt0ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  76. .dt1ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
  77. };
  78. #define OSC (V_OSCK/1000000)
  79. const struct dpll_params dpll_ddr3 = { 400, OSC-1, 1, -1, -1, -1, -1};
  80. void am33xx_spl_board_init(void)
  81. {
  82. unsigned int oldspeed;
  83. unsigned short buf;
  84. struct cm_perpll *const cmper = (struct cm_perpll *)CM_PER;
  85. struct cm_wkuppll *const cmwkup = (struct cm_wkuppll *)CM_WKUP;
  86. /*
  87. * enable additional clocks of modules which are accessed later from
  88. * VxWorks OS
  89. */
  90. u32 *const clk_domains[] = { 0 };
  91. u32 *const clk_modules_xre1specific[] = {
  92. &cmwkup->wkup_adctscctrl,
  93. &cmper->spi1clkctrl,
  94. &cmper->dcan0clkctrl,
  95. &cmper->dcan1clkctrl,
  96. &cmper->epwmss0clkctrl,
  97. &cmper->epwmss1clkctrl,
  98. &cmper->epwmss2clkctrl,
  99. &cmper->lcdclkctrl,
  100. &cmper->lcdcclkstctrl,
  101. 0
  102. };
  103. do_enable_clocks(clk_domains, clk_modules_xre1specific, 1);
  104. /* power-OFF LCD-Display */
  105. gpio_direction_output(LCD_PWR, 0);
  106. /* setup I2C */
  107. enable_i2c_pin_mux();
  108. i2c_set_bus_num(0);
  109. i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED, CONFIG_SYS_OMAP24_I2C_SLAVE);
  110. /* power-ON 3V3 via Resetcontroller */
  111. oldspeed = i2c_get_bus_speed();
  112. if (i2c_set_bus_speed(CONFIG_SYS_OMAP24_I2C_SPEED_PSOC) >= 0) {
  113. buf = RSTCTRL_FORCE_PWR_NEN | RSTCTRL_CAN_STB;
  114. i2c_write(RSTCTRL_ADDR, RSTCTRL_CTRLREG, 1,
  115. (uint8_t *)&buf, sizeof(buf));
  116. i2c_set_bus_speed(oldspeed);
  117. } else {
  118. puts("ERROR: i2c_set_bus_speed failed! (turn on PWR_nEN)\n");
  119. }
  120. pmicsetup(0);
  121. }
  122. const struct dpll_params *get_dpll_ddr_params(void)
  123. {
  124. return &dpll_ddr3;
  125. }
  126. void sdram_init(void)
  127. {
  128. config_ddr(400, &ddr3_ioregs,
  129. &ddr3_data,
  130. &ddr3_cmd_ctrl_data,
  131. &ddr3_emif_reg_data, 0);
  132. }
  133. #endif /* CONFIG_SPL_BUILD */
  134. /*
  135. * Basic board specific setup. Pinmux has been handled already.
  136. */
  137. int board_init(void)
  138. {
  139. gpmc_init();
  140. return 0;
  141. }
  142. #ifdef CONFIG_BOARD_LATE_INIT
  143. int board_late_init(void)
  144. {
  145. const unsigned int toff = 1000;
  146. unsigned int cnt = 3;
  147. unsigned short buf = 0xAAAA;
  148. unsigned char scratchreg = 0;
  149. unsigned int oldspeed;
  150. /* try to read out some boot-instruction from resetcontroller */
  151. oldspeed = i2c_get_bus_speed();
  152. if (i2c_set_bus_speed(CONFIG_SYS_OMAP24_I2C_SPEED_PSOC) >= 0) {
  153. i2c_read(RSTCTRL_ADDR, RSTCTRL_SCRATCHREG, 1,
  154. &scratchreg, sizeof(scratchreg));
  155. i2c_set_bus_speed(oldspeed);
  156. } else {
  157. puts("ERROR: i2c_set_bus_speed failed! (scratchregister)\n");
  158. }
  159. if (gpio_get_value(ESC_KEY)) {
  160. do {
  161. lcd_position_cursor(1, 8);
  162. switch (cnt) {
  163. case 3:
  164. lcd_puts(
  165. "release ESC-KEY to enter SERVICE-mode.");
  166. break;
  167. case 2:
  168. lcd_puts(
  169. "release ESC-KEY to enter DIAGNOSE-mode.");
  170. break;
  171. case 1:
  172. lcd_puts(
  173. "release ESC-KEY to enter BOOT-mode. ");
  174. break;
  175. }
  176. mdelay(toff);
  177. cnt--;
  178. if (!gpio_get_value(ESC_KEY) &&
  179. gpio_get_value(PUSH_KEY) && 2 == cnt) {
  180. lcd_position_cursor(1, 8);
  181. lcd_puts(
  182. "switching to network-console ... ");
  183. env_set("bootcmd", "run netconsole");
  184. cnt = 4;
  185. break;
  186. } else if (!gpio_get_value(ESC_KEY) &&
  187. gpio_get_value(PUSH_KEY) && 1 == cnt) {
  188. lcd_position_cursor(1, 8);
  189. lcd_puts(
  190. "starting u-boot script from USB ... ");
  191. env_set("bootcmd", "run usbscript");
  192. cnt = 4;
  193. break;
  194. } else if ((!gpio_get_value(ESC_KEY) &&
  195. gpio_get_value(PUSH_KEY) && cnt == 0) ||
  196. (gpio_get_value(ESC_KEY) &&
  197. gpio_get_value(PUSH_KEY) && cnt == 0)) {
  198. lcd_position_cursor(1, 8);
  199. lcd_puts(
  200. "starting script from network ... ");
  201. env_set("bootcmd", "run netscript");
  202. cnt = 4;
  203. break;
  204. } else if (!gpio_get_value(ESC_KEY)) {
  205. break;
  206. }
  207. } while (cnt);
  208. } else if (scratchreg == 0xCC) {
  209. lcd_position_cursor(1, 8);
  210. lcd_puts(
  211. "starting vxworks from network ... ");
  212. env_set("bootcmd", "run netboot");
  213. cnt = 4;
  214. } else if (scratchreg == 0xCD) {
  215. lcd_position_cursor(1, 8);
  216. lcd_puts(
  217. "starting script from network ... ");
  218. env_set("bootcmd", "run netscript");
  219. cnt = 4;
  220. } else if (scratchreg == 0xCE) {
  221. lcd_position_cursor(1, 8);
  222. lcd_puts(
  223. "starting AR from eMMC ... ");
  224. env_set("bootcmd", "run mmcboot");
  225. cnt = 4;
  226. }
  227. lcd_position_cursor(1, 8);
  228. switch (cnt) {
  229. case 0:
  230. lcd_puts("entering BOOT-mode. ");
  231. env_set("bootcmd", "run defaultAR");
  232. buf = 0x0000;
  233. break;
  234. case 1:
  235. lcd_puts("entering DIAGNOSE-mode. ");
  236. buf = 0x0F0F;
  237. break;
  238. case 2:
  239. lcd_puts("entering SERVICE mode. ");
  240. buf = 0xB4B4;
  241. break;
  242. case 3:
  243. lcd_puts("loading OS... ");
  244. buf = 0x0404;
  245. break;
  246. }
  247. /* write bootinfo into scratchregister of resetcontroller */
  248. oldspeed = i2c_get_bus_speed();
  249. if (i2c_set_bus_speed(CONFIG_SYS_OMAP24_I2C_SPEED_PSOC) >= 0) {
  250. i2c_write(RSTCTRL_ADDR, RSTCTRL_SCRATCHREG, 1,
  251. (uint8_t *)&buf, sizeof(buf));
  252. i2c_set_bus_speed(oldspeed);
  253. } else {
  254. puts("ERROR: i2c_set_bus_speed failed! (scratchregister)\n");
  255. }
  256. /* setup othbootargs for bootvx-command (vxWorks bootline) */
  257. char othbootargs[128];
  258. snprintf(othbootargs, sizeof(othbootargs),
  259. "u=vxWorksFTP pw=vxWorks o=0x%08x;0x%08x;0x%08x;0x%08x",
  260. (unsigned int) gd->fb_base-0x20,
  261. (u32)env_get_ulong("vx_memtop", 16, gd->fb_base-0x20),
  262. (u32)env_get_ulong("vx_romfsbase", 16, 0),
  263. (u32)env_get_ulong("vx_romfssize", 16, 0));
  264. env_set("othbootargs", othbootargs);
  265. /*
  266. * reset VBAR registers to its reset location, VxWorks 6.9.3.2 does
  267. * expect that vectors are there, original u-boot moves them to _start
  268. */
  269. __asm__("ldr r0,=0x20000");
  270. __asm__("mcr p15, 0, r0, c12, c0, 0"); /* Set VBAR */
  271. return 0;
  272. }
  273. #endif /* CONFIG_BOARD_LATE_INIT */