arkn141-shoulang.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. #include <common.h>
  2. #include <dwmmc.h>
  3. #include <malloc.h>
  4. #include <asm/gpio.h>
  5. DECLARE_GLOBAL_DATA_PTR;
  6. #define ARKN141_UPDATE_MAGIC "ada7f0c6-7c86-11e9-8f9e-2a86e4085a59"
  7. #define rSYS_AHB_CLK_EN *((volatile unsigned int *)(0x40408044))
  8. #define rSYS_SD_CLK_CFG *((volatile unsigned int *)(0x40408058))
  9. #define rSYS_SD1_CLK_CFG *((volatile unsigned int *)(0x4040805c))
  10. #define rSYS_SOFT_RSTNA *((volatile unsigned int *)(0x40408074))
  11. #define rSYS_PAD_CTRL00 *((volatile unsigned int *)(0x404081c0))
  12. #define rSYS_PAD_CTRL03 *((volatile unsigned int *)(0x404081cc))
  13. #define rSYS_PAD_CTRL05 *((volatile unsigned int *)(0x404081d4))
  14. #define rSYS_PAD_CTRL07 *((volatile unsigned int *)(0x404081dc))
  15. #define rSYS_PAD_CTRL08 *((volatile unsigned int *)(0x404081e0))
  16. #define rSYS_PAD_CTRL09 *((volatile unsigned int *)(0x404081e4))
  17. #define rSYS_PAD_CTRL0B *((volatile unsigned int *)(0x404081ec))
  18. #define rSYS_PAD_DRIVE00 *((volatile unsigned int *)(0x404081f4))
  19. #define rSYS_PAD_DRIVE01 *((volatile unsigned int *)(0x404081f8))
  20. static void dwmci_select_pad(void)
  21. {
  22. /* use sd/mmc 0 */
  23. rSYS_PAD_CTRL09 |= 0x7F;
  24. rSYS_SD_CLK_CFG = 0x00000420;
  25. /* use sd/mmc 1 pad sd1_2 */
  26. rSYS_PAD_CTRL0B |= (1 << 5) | (1 << 2);
  27. rSYS_PAD_CTRL05 &= ~(0x1FFFFF << 0);
  28. rSYS_PAD_CTRL05 |= (2 << 18) | (2 << 15) | (2 << 12) | (2 << 9) | (2 << 6) |
  29. (2 << 3) | (2 << 0);
  30. rSYS_SD1_CLK_CFG = 0x00000420;
  31. }
  32. static void dwmci_reset(void)
  33. {
  34. rSYS_AHB_CLK_EN &= ~((1 << 4) | (1 << 3));
  35. rSYS_SOFT_RSTNA &= ~((1 << 31) | (1 << 12));
  36. udelay(100);
  37. rSYS_SOFT_RSTNA |= ((1 << 31) | (1 << 12));
  38. rSYS_AHB_CLK_EN |= ((1 << 4) | (1 << 3));
  39. }
  40. #define ARK_MMC_CLK 24000000
  41. int ark_dwmci_init(char *name,u32 regbase, int bus_width, int index)
  42. {
  43. struct dwmci_host *host = NULL;
  44. host = malloc(sizeof(struct dwmci_host));
  45. if (!host) {
  46. printf("dwmci_host malloc fail!\n");
  47. return 1;
  48. }
  49. memset(host, 0, sizeof(struct dwmci_host));
  50. dwmci_select_pad();
  51. dwmci_reset();
  52. host->name = name;
  53. host->ioaddr = (void *)regbase;
  54. host->buswidth = bus_width;
  55. host->dev_index = index;
  56. host->bus_hz = ARK_MMC_CLK;
  57. host->fifo_mode = 1;
  58. add_dwmci(host, host->bus_hz, 400000);
  59. return 0;
  60. }
  61. int board_mmc_init(bd_t *bis)
  62. {
  63. ark_dwmci_init("ARK_MMC0", 0x60000000, 4, 0);
  64. ark_dwmci_init("ARK_MMC1", 0x68000000, 4, 0);
  65. return 0;
  66. }
  67. int dram_init(void)
  68. {
  69. gd->ram_size = get_ram_size((void *)CONFIG_SYS_SDRAM_BASE,
  70. CONFIG_SYS_SDRAM_SIZE);
  71. return 0;
  72. }
  73. int board_init(void)
  74. {
  75. unsigned int tmp;
  76. /* SPI pad enable */
  77. tmp = rSYS_PAD_CTRL08;
  78. tmp &= ~(0xFF << 16);
  79. tmp |= (0xA8 << 16);
  80. rSYS_PAD_CTRL08 = tmp;
  81. /* wifi power enable */
  82. /* power GPIO115 high for sdio wifi module in shoulang carcorder project */
  83. rSYS_PAD_CTRL09 &= ~(3 << 30);
  84. gpio_direction_output(115, 1);
  85. /* GPIO04 high for power on system */
  86. rSYS_PAD_CTRL00 &= ~(7 << 12);
  87. gpio_direction_output(4, 1);
  88. /* GPIO124 for camera reset */
  89. //rSYS_PAD_CTRL00 &= ~(7 << 9);
  90. //gpio_direction_output(124, 1);
  91. /* select gpio 61-69, 74-79 pad */
  92. rSYS_PAD_CTRL07 |= (1 << 30);
  93. rSYS_PAD_DRIVE00 = 0;
  94. rSYS_PAD_DRIVE01 = 0;
  95. return 0;
  96. }
  97. int board_late_init(void)
  98. {
  99. char cmd[128];
  100. char *need_update;
  101. unsigned int loadaddr;
  102. gpio_direction_input(30);
  103. if (!gpio_get_value(30))
  104. env_set("need_update", "yes");
  105. need_update = env_get("need_update");
  106. if (!strcmp(need_update, "yes")) {
  107. sprintf(cmd, "fatload %s %s %s update-magic", env_get("update_dev"),
  108. env_get("dev_part"), env_get("loadaddr"));
  109. run_command(cmd, 0);
  110. loadaddr = env_get_hex("loadaddr", 0);
  111. if (loadaddr && memcmp((void*)loadaddr, ARKN141_UPDATE_MAGIC,
  112. strlen(ARKN141_UPDATE_MAGIC))) {
  113. printf("Wrong update magic, do not update.\n");
  114. env_set("need_update", "no");
  115. }
  116. }
  117. return 0;
  118. }