ark1668.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  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_CTRL05 *((volatile unsigned int *)(0xe49001d4))
  15. #define rSYS_PAD_CTRL06 *((volatile unsigned int *)(0xe49001d8))
  16. #define rSYS_PAD_CTRL0B *((volatile unsigned int *)(0xe49001ec))
  17. #define rREMAP (*(volatile unsigned int *)(0xe4400020))
  18. static void dwmci_select_pad(void)
  19. {
  20. unsigned int val;
  21. /* use sd/mmc 0 */
  22. val = rSYS_PAD_CTRL0B;
  23. val &= ~((0xF << 0) | (0x1 << 4));
  24. val |= ((0xF << 0) | (0x1 << 4));
  25. rSYS_PAD_CTRL0B = val;
  26. val = rSYS_PAD_CTRL05;
  27. val &= ~((0xF << 24) | (0xF << 28));
  28. val |= ((0x2 << 24) | (0x2 << 28));
  29. rSYS_PAD_CTRL05 = val;
  30. rSYS_SD_CLK_CFG = 0x00000420;
  31. /* use sd/mmc 1 */
  32. val = rSYS_PAD_CTRL06;
  33. val &= ~0x2222222;
  34. val |= 0x2222222;
  35. rSYS_PAD_CTRL06 = val;
  36. rSYS_SD1_CLK_CFG = 0x00000420;
  37. }
  38. static void dwmci_reset(void)
  39. {
  40. rSYS_SOFT_RSTNA &= ~((1 << 29) | (1 << 16));
  41. rSYS_SOFT_RSTNB &= ~(1 << 3);
  42. udelay(100);
  43. rSYS_SOFT_RSTNA |= ((1 << 29) | (1 << 16));
  44. rSYS_SOFT_RSTNB |= (1 << 3);
  45. }
  46. #define ARK_MMC_CLK 24000000
  47. int ark_dwmci_init(char *name, u32 regbase, int bus_width, int index)
  48. {
  49. struct dwmci_host *host = NULL;
  50. host = malloc(sizeof(struct dwmci_host));
  51. if (!host) {
  52. printf("dwmci_host malloc fail!\n");
  53. return 1;
  54. }
  55. memset(host, 0, sizeof(struct dwmci_host));
  56. dwmci_select_pad();
  57. dwmci_reset();
  58. host->name = name;
  59. host->ioaddr = (void *)regbase;
  60. host->buswidth = bus_width;
  61. host->dev_index = index;
  62. host->bus_hz = ARK_MMC_CLK;
  63. host->fifo_mode = 1;
  64. add_dwmci(host, host->bus_hz, 400000);
  65. return 0;
  66. }
  67. int board_mmc_init(bd_t * bis)
  68. {
  69. ark_dwmci_init("ARK_MMC0", 0xec400000, 4, 0);
  70. ark_dwmci_init("ARK_MMC1", 0xec800000, 4, 0);
  71. //ark_dwmci_init("ARK_MMC2",SDHC2_BASE, 4, 2);
  72. return 0;
  73. }
  74. int dram_init(void)
  75. {
  76. gd->ram_size = get_ram_size((void *)CONFIG_SYS_SDRAM_BASE, CONFIG_SYS_SDRAM_SIZE);
  77. return 0;
  78. }
  79. int board_init(void)
  80. {
  81. return 0;
  82. }
  83. #ifdef CONFIG_BOARD_EARLY_INIT_F
  84. int board_early_init_f(void)
  85. {
  86. #ifdef CONFIG_DEBUG_UART
  87. debug_uart_init();
  88. #endif
  89. return 0;
  90. }
  91. #endif
  92. int board_late_init(void)
  93. {
  94. char cmd[128];
  95. char *need_update,*update_flash;
  96. unsigned int loadaddr;
  97. int do_update = 0, update_from_mmc = 1;
  98. update_flash = env_get("update_from_flash");
  99. printf("++++++++++%s+++++++\n",update_flash);
  100. need_update = env_get("need_update");
  101. if (!strcmp(need_update, "yes")) {
  102. loadaddr = env_get_hex("loadaddr", 0);
  103. sprintf(cmd, "fatload %s %s %s update-magic", "mmc", env_get("sd_dev_part"), env_get("loadaddr"));
  104. run_command(cmd, 0);
  105. if (loadaddr && !memcmp((void *)loadaddr, ARK1668_UPDATE_MAGIC, strlen(ARK1668_UPDATE_MAGIC))) {
  106. do_update = 1;
  107. goto update_done;
  108. } else {
  109. printf("Wrong update magic, do not update from mmc.\n");
  110. }
  111. #ifdef CONFIG_USB_MUSB_HCD
  112. //use old musb driver
  113. run_command("usb start", 0);
  114. #endif
  115. sprintf(cmd, "fatload %s %s %s update-magic", "usb", "0", env_get("loadaddr"));
  116. run_command(cmd, 0);
  117. if (loadaddr && !memcmp((void *)loadaddr, ARK1668_UPDATE_MAGIC, strlen(ARK1668_UPDATE_MAGIC))) {
  118. do_update = 1;
  119. update_from_mmc = 0;
  120. } else {
  121. printf("Wrong update magic, do not update from usb.\n");
  122. }
  123. }
  124. else if (!strcmp(update_flash, "yes")){
  125. sprintf(cmd, "run updatefromflash");
  126. printf("cmd=%s\n", cmd);
  127. run_command(cmd, 0);
  128. }
  129. update_done:
  130. if (do_update) {
  131. run_command("nand erase.part userdata", 0);
  132. env_set("need_update", "no");
  133. env_set("do_update", "yes");
  134. if (update_from_mmc) {
  135. printf("update form mmc...\n");
  136. env_set("update_dev_type", "mmc");
  137. env_set("update_dev_part", env_get("sd_dev_part"));
  138. } else {
  139. printf("update form usb...\n");
  140. env_set("update_dev_type", "usb");
  141. env_set("update_dev_part", "0");
  142. }
  143. } else {
  144. env_set("do_update", "no");
  145. }
  146. return 0;
  147. }
  148. #ifdef CONFIG_SPL_BUILD
  149. void mem_init(void)
  150. {
  151. int ret;
  152. gpio_direction_output(8, 1);
  153. udelay(10);
  154. reset:
  155. /* controller reset */
  156. rSYS_SOFT_RSTNA |= 1 << 8;
  157. rSYS_SOFT_RSTNB |= 0x3 << 10;
  158. udelay(1);
  159. rSYS_SOFT_RSTNA &= ~(1 << 8);
  160. rSYS_SOFT_RSTNB &= ~(0x3 << 10);
  161. udelay(10);
  162. rSYS_SOFT_RSTNA |= 1 << 8;
  163. rSYS_SOFT_RSTNB |= 0x3 << 10;
  164. udelay(10);
  165. ddr3_sdramc_init();
  166. udelay(1500);
  167. if (rSYS_DDR_STATUS & (1 << 2)) //train error
  168. goto reset;
  169. udelay(1);
  170. ret = ddr3_data_training(0);
  171. if (ret) {
  172. udelay(1);
  173. goto reset;
  174. }
  175. udelay(1);
  176. rREMAP = 1;
  177. udelay(10);
  178. printf("remap...\n");
  179. }
  180. #endif