ark1668-ft.c 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. #include <common.h>
  2. #include <dwmmc.h>
  3. #include <malloc.h>
  4. #include <debug_uart.h>
  5. #include <asm-generic/gpio.h>
  6. #include <asm/arch/ark-common.h>
  7. DECLARE_GLOBAL_DATA_PTR;
  8. #define ARK1668_UPDATE_MAGIC "ada7f0c6-7c86-11e9-8f9e-2a86e4085a59"
  9. #define rSYS_SD_CLK_CFG *((volatile unsigned int *)(0xe4900058))
  10. #define rSYS_SD1_CLK_CFG *((volatile unsigned int *)(0xe490005c))
  11. #define rSYS_SOFT_RSTNA *((volatile unsigned int *)(0xe4900074))
  12. #define rSYS_SOFT_RSTNB *((volatile unsigned int *)(0xe4900078))
  13. #define rSYS_DDR_STATUS *((volatile unsigned int *)(0xe4900180))
  14. #define rSYS_PAD_CTRL00 *((volatile unsigned int *)(0xe49001c0))
  15. #define rSYS_PAD_CTRL05 *((volatile unsigned int *)(0xe49001d4))
  16. #define rSYS_PAD_CTRL06 *((volatile unsigned int *)(0xe49001d8))
  17. #define rSYS_PAD_CTRL08 *((volatile unsigned int *)(0xe49001e0))
  18. #define rSYS_PAD_CTRL09 *((volatile unsigned int *)(0xe49001e4))
  19. #define rSYS_PAD_CTRL0A *((volatile unsigned int *)(0xe49001e8))
  20. #define rSYS_PAD_CTRL0B *((volatile unsigned int *)(0xe49001ec))
  21. #define rREMAP (*(volatile unsigned int *)(0xe4400020))
  22. #define rGPIO_MODA (*(volatile unsigned int *)(0xe4600000))
  23. #define rGPIO_RDATAA (*(volatile unsigned int *)(0xe4600004))
  24. #define rPWM3_EN (*(volatile unsigned int *)(0xe4d00030))
  25. #define rPWM3_DUTY (*(volatile unsigned int *)(0xe4d00034))
  26. #define rPWM3_CNTR (*(volatile unsigned int *)(0xe4d00038))
  27. #define PWM_CLK 24000000
  28. static void dwmci_select_pad(void)
  29. {
  30. unsigned int val;
  31. /* use sd/mmc 0 */
  32. val = rSYS_PAD_CTRL0B;
  33. val &= ~((0xF << 0) | (0x1 << 4));
  34. val |= ((0xF << 0) | (0x1 << 4));
  35. rSYS_PAD_CTRL0B = val;
  36. val = rSYS_PAD_CTRL05;
  37. val &= ~((0xF << 24) | (0xF << 28));
  38. val |= ((0x2 << 24) | (0x2 << 28));
  39. rSYS_PAD_CTRL05 = val;
  40. rSYS_SD_CLK_CFG = 0x00000420;
  41. /* use sd/mmc 1 */
  42. val = rSYS_PAD_CTRL06;
  43. val &= ~0x2222222;
  44. val |= 0x2222222;
  45. rSYS_PAD_CTRL06 = val;
  46. rSYS_SD1_CLK_CFG = 0x00000420;
  47. }
  48. static void dwmci_reset(void)
  49. {
  50. rSYS_SOFT_RSTNA &= ~((1 << 29) | (1 << 16));
  51. rSYS_SOFT_RSTNB &= ~(1 << 3);
  52. udelay(100);
  53. rSYS_SOFT_RSTNA |= ((1 << 29) | (1 << 16));
  54. rSYS_SOFT_RSTNB |= (1 << 3);
  55. }
  56. #define ARK_MMC_CLK 24000000
  57. int ark_dwmci_init(char *name, u32 regbase, int bus_width, int index)
  58. {
  59. struct dwmci_host *host = NULL;
  60. host = malloc(sizeof(struct dwmci_host));
  61. if (!host) {
  62. printf("dwmci_host malloc fail!\n");
  63. return 1;
  64. }
  65. memset(host, 0, sizeof(struct dwmci_host));
  66. dwmci_select_pad();
  67. dwmci_reset();
  68. host->name = name;
  69. host->ioaddr = (void *)regbase;
  70. host->buswidth = bus_width;
  71. host->dev_index = index;
  72. host->bus_hz = ARK_MMC_CLK;
  73. host->fifo_mode = 1;
  74. add_dwmci(host, host->bus_hz, 400000);
  75. return 0;
  76. }
  77. int board_mmc_init(bd_t * bis)
  78. {
  79. ark_dwmci_init("ARK_MMC0", 0xec400000, 4, 0);
  80. ark_dwmci_init("ARK_MMC1", 0xec800000, 4, 0);
  81. //ark_dwmci_init("ARK_MMC2",SDHC2_BASE, 4, 2);
  82. return 0;
  83. }
  84. int dram_init(void)
  85. {
  86. gd->ram_size = get_ram_size((void *)CONFIG_SYS_SDRAM_BASE, CONFIG_SYS_SDRAM_SIZE);
  87. return 0;
  88. }
  89. int board_init(void)
  90. {
  91. unsigned int val;
  92. /* gpio4 high */
  93. rSYS_PAD_CTRL00 &= ~(0xf << 8);
  94. rSYS_PAD_CTRL00 |= 1 << 8;
  95. val = rGPIO_MODA;
  96. val &= ~(1 << 4);
  97. rGPIO_MODA = val;
  98. rGPIO_RDATAA |= (1 << 4);
  99. /* select spi0 pad */
  100. rSYS_PAD_CTRL0B |= 7 << 12;
  101. rSYS_PAD_CTRL0A &= ~(1 << 1);
  102. return 0;
  103. }
  104. #ifdef CONFIG_BOARD_EARLY_INIT_F
  105. int board_early_init_f(void)
  106. {
  107. #ifdef CONFIG_DEBUG_UART
  108. debug_uart_init();
  109. #endif
  110. return 0;
  111. }
  112. #endif
  113. static void led_pwm_blink(void)
  114. {
  115. /* select pwm3 pad */
  116. rSYS_PAD_CTRL09 &= ~(3 << 22);
  117. rSYS_PAD_CTRL09 |= 1 << 22;
  118. rPWM3_CNTR = PWM_CLK / 10;
  119. rPWM3_DUTY = rPWM3_CNTR / 2;
  120. rPWM3_EN = 1;
  121. }
  122. int board_late_init(void)
  123. {
  124. char cmd[128];
  125. char *need_update,*update_flash;
  126. unsigned int loadaddr;
  127. int do_update = 0, update_from_mmc = 1;
  128. update_flash = env_get("update_from_flash");
  129. printf("++++++++++%s+++++++\n",update_flash);
  130. need_update = env_get("need_update");
  131. if (1/*!strcmp(need_update, "yes")*/) {
  132. loadaddr = env_get_hex("loadaddr", 0);
  133. sprintf(cmd, "fatload %s %s %s update-magic", "mmc", env_get("sd_dev_part"), env_get("loadaddr"));
  134. run_command(cmd, 0);
  135. if (loadaddr && !memcmp((void *)loadaddr, ARK1668_UPDATE_MAGIC, strlen(ARK1668_UPDATE_MAGIC))) {
  136. do_update = 1;
  137. goto update_done;
  138. } else {
  139. printf("Wrong update magic, do not update from mmc.\n");
  140. }
  141. #ifdef CONFIG_USB_MUSB_HCD
  142. //use old musb driver
  143. run_command("usb start", 0);
  144. #endif
  145. sprintf(cmd, "fatload %s %s %s update-magic", "usb", "0", env_get("loadaddr"));
  146. run_command(cmd, 0);
  147. if (loadaddr && !memcmp((void *)loadaddr, ARK1668_UPDATE_MAGIC, strlen(ARK1668_UPDATE_MAGIC))) {
  148. do_update = 1;
  149. update_from_mmc = 0;
  150. } else {
  151. printf("Wrong update magic, do not update from usb.\n");
  152. }
  153. }
  154. else if (!strcmp(update_flash, "yes")){
  155. sprintf(cmd, "run updatefromflash");
  156. printf("cmd=%s\n", cmd);
  157. run_command(cmd, 0);
  158. }
  159. update_done:
  160. if (do_update) {
  161. run_command("nand erase.part userdata", 0);
  162. env_set("need_update", "no");
  163. env_set("do_update", "yes");
  164. if (update_from_mmc) {
  165. printf("update form mmc...\n");
  166. env_set("update_dev_type", "mmc");
  167. env_set("update_dev_part", env_get("sd_dev_part"));
  168. } else {
  169. printf("update form usb...\n");
  170. env_set("update_dev_type", "usb");
  171. env_set("update_dev_part", "0");
  172. }
  173. led_pwm_blink();
  174. } else {
  175. env_set("do_update", "no");
  176. }
  177. return 0;
  178. }
  179. #ifdef CONFIG_SPL_BUILD
  180. void mem_init(void)
  181. {
  182. int ret;
  183. gpio_direction_output(8, 1);
  184. udelay(10);
  185. reset:
  186. /* controller reset */
  187. rSYS_SOFT_RSTNA |= 1 << 8;
  188. rSYS_SOFT_RSTNB |= 0x3 << 10;
  189. udelay(1);
  190. rSYS_SOFT_RSTNA &= ~(1 << 8);
  191. rSYS_SOFT_RSTNB &= ~(0x3 << 10);
  192. udelay(10);
  193. rSYS_SOFT_RSTNA |= 1 << 8;
  194. rSYS_SOFT_RSTNB |= 0x3 << 10;
  195. udelay(10);
  196. ddr3_sdramc_init();
  197. udelay(1500);
  198. if (rSYS_DDR_STATUS & (1 << 2)) //train error
  199. goto reset;
  200. udelay(1);
  201. ret = ddr3_data_training(0);
  202. if (ret) {
  203. udelay(1);
  204. goto reset;
  205. }
  206. udelay(1);
  207. rREMAP = 1;
  208. udelay(10);
  209. printf("remap...\n");
  210. }
  211. #endif