]> git.kernelconcepts.de Git - karo-tx-redboot.git/blobdiff - packages/hal/arm/mx31/ads/v2_0/src/redboot_cmds.c
unified MX27, MX25, MX37 trees
[karo-tx-redboot.git] / packages / hal / arm / mx31 / ads / v2_0 / src / redboot_cmds.c
index 35fd13c7b7cbefbb07d7aedf35ee50e7fd821b67..04035eead95e9a9d7346fe3f9473ebe6801dbe27 100644 (file)
 
 #if (REDBOOT_IMAGE_SIZE != CYGBLD_REDBOOT_MIN_IMAGE_SIZE)
 #error REDBOOT_IMAGE_SIZE != CYGBLD_REDBOOT_MIN_IMAGE_SIZE
-#endif 
+#endif
 
 RedBoot_config_option("Board specifics",
                       brd_specs,
-                      ALWAYS_ENABLED, 
+                      ALWAYS_ENABLED,
                       true,
                       CONFIG_INT,
                       0
                      );
 #endif  //CYGSEM_REDBOOT_FLASH_CONFIG
 
+char HAL_PLATFORM_EXTRA[60] = "MX31 ADS (Freescale i.MX31 based) PASS 1.0 [x32 DDR]";
+
 static void runImg(int argc, char *argv[]);
 
 RedBoot_cmd("run",
@@ -279,10 +281,10 @@ static void eefun(int argc,char *argv[])
 
 #if defined(CYGSEM_REDBOOT_FLASH_CONFIG) && defined(CYG_HAL_STARTUP_ROMRAM)
 
-RedBoot_cmd("romupdate", 
-            "Update Redboot with currently running image", 
+RedBoot_cmd("romupdate",
+            "Update Redboot with currently running image",
             "",
-            romupdate 
+            romupdate
            );
 
 extern int flash_program(void *_addr, void *_data, int len, void **err_addr);
@@ -295,38 +297,46 @@ void romupdate(int argc, char *argv[])
 {
     void *err_addr, *base_addr;
     int stat;
-
-    if (IS_FIS_FROM_NAND()) {
-        base_addr = (void*)MXC_NAND_BASE_DUMMY;
+    if (IS_FIS_FROM_MMC()) {
+        diag_printf("Updating ROM in MMC/SD flash\n");
+        base_addr = (void*)MXC_MMC_BASE_DUMMY;
+        /* Read the MBR from the card to RAM */
+        mmc_data_read((cyg_uint32*)(ram_end + 0x4), 0x3FC, base_addr);
+        diag_printf("Programming Redboot to MMC/SD flash\n");
+        mmc_data_write((cyg_uint32*)ram_end, CYGBLD_REDBOOT_MIN_IMAGE_SIZE, (cyg_uint32)base_addr);
+        return;
+    } else if (IS_FIS_FROM_NAND()) {
+        base_addr = (void*)0;
         diag_printf("Updating ROM in NAND flash\n");
     } else if (IS_FIS_FROM_NOR()) {
         base_addr = (void*)BOARD_FLASH_START;
         diag_printf("Updating ROM in NOR flash\n");
     } else {
         diag_printf("romupdate not supported\n");
-        diag_printf("Use \"factive [NOR|NAND]\" to select either NOR or NAND flash\n");
+        diag_printf("Use \"factive [NOR|NAND|MMC]\" to select either MMC, NOR, NAND flash\n");
         return;
     }
     // Erase area to be programmed
     if ((stat = flash_erase((void *)base_addr,
                             CYGBLD_REDBOOT_MIN_IMAGE_SIZE,
                             (void **)&err_addr)) != 0) {
-        diag_printf("Can't erase region at %p: %s\n", 
+        diag_printf("Can't erase region at %p: %s\n",
                     err_addr, flash_errmsg(stat));
         return;
     }
     // Now program it
     if ((stat = flash_program((void *)base_addr, (void *)ram_end,
-                              CYGBLD_REDBOOT_MIN_IMAGE_SIZE, 
+                              CYGBLD_REDBOOT_MIN_IMAGE_SIZE,
                               (void **)&err_addr)) != 0) {
-        diag_printf("Can't program region at %p: %s\n", 
+        diag_printf("Can't program region at %p: %s\n",
                     err_addr, flash_errmsg(stat));
     }
 }
-RedBoot_cmd("factive", 
-            "Enable one flash media for Redboot", 
-            "[NOR | NAND]",
-            factive 
+
+RedBoot_cmd("factive",
+            "Enable one flash media for Redboot",
+            "[NOR | NAND | MMC]",
+            factive
            );
 
 void factive(int argc, char *argv[])
@@ -351,6 +361,13 @@ void factive(int argc, char *argv[])
         return;
 #else
         MXC_ASSERT_NAND_BOOT();
+#endif
+    } else if (strcasecmp(argv[1], "MMC") == 0) {
+#ifndef MXCFLASH_SELECT_MMC
+        diag_printf("Not supported\n");
+        return;
+#else
+        MXC_ASSERT_MMC_BOOT();
 #endif
     } else {
         diag_printf("Invalid command: %s\n", argv[1]);