arkn141-dongle.c 3.3 KB

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