common: fastboot: force to use emmc device
authorChanho Park <chanho61.park@samsung.com>
Tue, 11 Aug 2015 05:45:36 +0000 (14:45 +0900)
committerChanho Park <chanho61.park@samsung.com>
Tue, 11 Aug 2015 07:41:07 +0000 (16:41 +0900)
This patch forces to use emmc device for fastboot and sdfuse command.
The fastboot command is for writing a data to emmc device through
external device like usb or sdcard. Thus, we should use eMMC device even
the board is booted from sdcard.

Change-Id: Ib91a9f6c1bde2e140f5b336bbe26ee5fd7e3f330
Signed-off-by: Chanho Park <chanho61.park@samsung.com>
common/cmd_fastboot.c
common/decompress_ext4.c
include/decompress_ext4.h

index c248aea74dec1416c0925fd22be1308b58d79129..4e6c1499003bdd5615571094a20ca98fe67636ea 100644 (file)
@@ -184,6 +184,7 @@ static int download_done;
 
 static int emmc_dev;
 static int sd_dev = 1;
+static int force_emmc;
 
 /* To support the Android-style naming of flash */
 #define MAX_PTN 16
@@ -537,39 +538,20 @@ static int write_buffer_sdmmc(unsigned int addr, unsigned int buflen,
                unsigned int base, unsigned int len, int is_sparse)
 {
        int ret = 1;
-       char cmd[32], device[32], part[32], part2[32];
-       char start[32], length[32], buffer[32], run_cmd[32];
-       char dev_num[2];
-       char *argv[6]  = { NULL, NULL, NULL, NULL, NULL, NULL, };
-       int argc = 0;
-       char *nul_buf;
-#if defined(CONFIG_MMC_64BIT_BUS) || defined(CONFIG_CPU_EXYNOS5410_EVT2)
-       char *nul_buf_align;
-#endif
-
-       argv[1] = cmd;
-       sprintf(cmd, "write");
+       char run_cmd[64];
 
        if (!is_sparse) {
-               argv[2] = device;
-               argv[3] = buffer;
-               argv[4] = start;
-               argv[5] = length;
-
-               sprintf(device, "mmc %d", emmc_dev);
-               sprintf(buffer, "0x%x", addr);
-               sprintf(start, "0x%x", base);
-               sprintf(length, "0x%x", len);
-
-               ret = do_mmcops(NULL, 0, 6, argv);
+               sprintf(run_cmd, "mmc write %d 0x%x 0x%x 0x%x", emmc_dev,
+                               addr, base, len);
+               ret = run_command(run_cmd, 0);
        } else {
                uint bl_st = base;
                uint bl_cnt = len;
 
                printf("Compressed ext4 image\n");
 
-               ret = write_compressed_ext4((char *)addr, buflen, bl_st,
-                                           bl_cnt);
+               ret = write_compressed_ext4(emmc_dev, (char *)addr, buflen,
+                                           bl_st, bl_cnt);
        }
        return ret;
 }
@@ -632,7 +614,7 @@ static int write_to_ptn_sdmmc(struct fastboot_ptentry *ptn, unsigned int addr,
                /* use the partition name that can be understood by a command, movi */
                if (!strcmp(ptn->name, "bootloader"))
                {
-                       if (OmPin == 7){
+                       if (OmPin == 7 || force_emmc) {
                                argv[2] = part2;
                                argv[3] = part;
                                argv[4] = dev_num;
@@ -640,7 +622,7 @@ static int write_to_ptn_sdmmc(struct fastboot_ptentry *ptn, unsigned int addr,
                                argc = 6;
                                strncpy(part2, "zero", 7);
                                strncpy(part, "u-boot", 7);
-                               sprintf(run_cmd,"emmc open 0");
+                               sprintf(run_cmd, "emmc open %d", emmc_dev);
                                run_command(run_cmd, 0);
                        }
                        else
@@ -649,14 +631,14 @@ static int write_to_ptn_sdmmc(struct fastboot_ptentry *ptn, unsigned int addr,
                }
                else if (!strcmp(ptn->name, "fwbl1"))
                {
-                       if (OmPin == 7){
+                       if (OmPin == 7 || force_emmc) {
                                argv[2] = part2;
                                argv[3] = ptn->name;
                                argv[4] = dev_num;
                                argv[5] = buffer;
                                argc = 6;
                                strncpy(part2, "zero", 7);
-                               sprintf(run_cmd,"emmc open 0");
+                               sprintf(run_cmd, "emmc open %d", emmc_dev);
                                run_command(run_cmd, 0);
                        }
                        else
@@ -665,14 +647,14 @@ static int write_to_ptn_sdmmc(struct fastboot_ptentry *ptn, unsigned int addr,
                }
                else if (!strcmp(ptn->name, "bl2"))
                {
-                       if (OmPin == 7){
+                       if (OmPin == 7 || force_emmc) {
                                argv[2] = part2;
                                argv[3] = ptn->name;
                                argv[4] = dev_num;
                                argv[5] = buffer;
                                argc = 6;
                                strncpy(part2, "zero", 7);
-                               sprintf(run_cmd,"emmc open 0");
+                               sprintf(run_cmd, "emmc open %d", emmc_dev);
                                run_command(run_cmd, 0);
                        }
                        else
@@ -681,14 +663,14 @@ static int write_to_ptn_sdmmc(struct fastboot_ptentry *ptn, unsigned int addr,
                }
                else if (!strcmp(ptn->name, "tzsw"))
                {
-                       if (OmPin == 7){
+                       if (OmPin == 7 || force_emmc) {
                                argv[2] = part2;
                                argv[3] = ptn->name;
                                argv[4] = dev_num;
                                argv[5] = buffer;
                                argc = 6;
                                strncpy(part2, "zero", 7);
-                               sprintf(run_cmd,"emmc open 0");
+                               sprintf(run_cmd, "emmc open %d", emmc_dev);
                                run_command(run_cmd, 0);
                        }
                        else
@@ -738,9 +720,12 @@ static int write_to_ptn_sdmmc(struct fastboot_ptentry *ptn, unsigned int addr,
 
                ret = do_movi(NULL, 0, argc, argv);
 
-               if (OmPin == 7 && (!strcmp(ptn->name, "fwbl1") || !strcmp(ptn->name, "bootloader") ||
-                                        !strcmp(ptn->name, "bl2") || !strcmp(ptn->name, "tzsw"))){
-                       sprintf(run_cmd,"emmc close 0");
+               if ((OmPin == 7 || force_emmc) &&
+                       (!strcmp(ptn->name, "fwbl1") ||
+                        !strcmp(ptn->name, "bootloader") ||
+                        !strcmp(ptn->name, "bl2") ||
+                        !strcmp(ptn->name, "tzsw"))) {
+                       sprintf(run_cmd, "emmc close %d", emmc_dev);
                        run_command(run_cmd, 0);
                }
 
@@ -1983,6 +1968,7 @@ int do_fastboot(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
        struct fastboot_ptentry *ptn;
        unsigned int addr, size;
        gflag_reboot = 0;
+       force_emmc = 1;
 
        if (set_partition_table_from_bootmode())
                return -1;
@@ -2102,6 +2088,7 @@ int do_fastboot(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
                /* restart the loop if a disconnect was detected */
        } while (continue_from_disconnect);
 
+       force_emmc = 0;
        return ret;
 }
 
@@ -2122,7 +2109,7 @@ U_BOOT_CMD(
  */
 #include <fs.h>
 extern struct ext2fs_node *ext4fs_file;
-static int update_from_sd (char *part, char *file)
+static int update_from_sd(int part_num, const char *part, const char *file)
 {
        int ret = 1;
        long size;
@@ -2141,7 +2128,7 @@ static int update_from_sd (char *part, char *file)
                return -1;
        }
 
-       ret = get_partition_info(dev_desc, 1, &part_info);
+       ret = get_partition_info(dev_desc, part_num, &part_info);
        if (ret) {
                printf("Invalid partition\n");
                return -1;
@@ -2220,6 +2207,9 @@ int do_sdfuse (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
        int ret = 1;
        int enable_reset = 0;
        struct mmc *mmc;
+       int part_num = 2;
+       char run_cmd[64];
+       force_emmc = 1;
 
        interface.transfer_buffer =
                (unsigned char *)CFG_FASTBOOT_TRANSFER_BUFFER;
@@ -2230,24 +2220,38 @@ int do_sdfuse (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
        if (set_partition_table_from_bootmode())
                return -1;
 
-       if ((argc == 2) && !strcmp(argv[1], "format"))
+       if ((argc == 2) && !strcmp(argv[1], "format")) {
                ret = process_cmd_format();
-       else if ((argc == 2) && !strcmp(argv[1], "flashall")) {
-               update_from_sd("fwbl1", "bl1.bin");
-               update_from_sd("bl2", "bl2.bin");
-               update_from_sd("tzsw", "tzsw.bin");
-               update_from_sd("bootloader", "u-boot.bin");
-               update_from_sd("env", "params.bin");
-               if (update_from_sd("boot", "boot.img")) {
-                       update_from_sd("kernel", getenv("kernel_file"));
-                       update_from_sd("ramdisk", getenv("initrd_file"));
-                       update_from_sd("dtb", getenv("fdtfile"));
+               sprintf(run_cmd, "mmc dev %d", emmc_dev);
+               run_command(run_cmd, 0);
+               sprintf(run_cmd, "mmc rescan");
+               run_command(run_cmd, 0);
+               if (emmc_dev) {
+                       sprintf(run_cmd, "mmc dev 0");
+                       run_command(run_cmd, 0);
+               }
+       } else if ((argc == 3) && !strcmp(argv[1], "flashall")) {
+               part_num = simple_strtoul(argv[2], NULL, 16);
+               update_from_sd(part_num, "fwbl1", "bl1.bin");
+               update_from_sd(part_num, "bl2", "bl2.bin");
+               update_from_sd(part_num, "tzsw", "tzsw.bin");
+               update_from_sd(part_num, "bootloader", "u-boot.bin");
+               update_from_sd(part_num, "env", "params.bin");
+
+               if (update_from_sd(part_num, "boot", "boot.img")) {
+                       update_from_sd(part_num, "kernel",
+                                       getenv("kernel_file"));
+                       update_from_sd(part_num, "ramdisk",
+                                       getenv("initrd_file"));
+                       update_from_sd(part_num, "dtb",
+                                       getenv("fdtfile"));
                }
-               update_from_sd("rootfs", "rootfs.img");
-               update_from_sd("data", "data.img");
+               update_from_sd(part_num, "rootfs", "rootfs.img");
+               update_from_sd(part_num, "data", "data.img");
+
                ret = 0;
-       } else if ((argc == 4) && !strcmp(argv[1], "flash")) {
-               if (update_from_sd(argv[2], argv[3]))
+       } else if ((argc == 5) && !strcmp(argv[1], "flash")) {
+               if (update_from_sd(part_num, argv[3], argv[4]))
                        return -1;
 
                ret = 0;
@@ -2256,15 +2260,17 @@ int do_sdfuse (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
                return 1;
        }
 
+       force_emmc = 0;
+
        return ret;
 }
 
 U_BOOT_CMD(
-       sdfuse,         4,      1,      do_sdfuse,
-       "sdfuse  - read images from FAT partition of SD card and write them to booting device.\n",
-       "sdfuse flashall                         - flash all images\n"
+       sdfuse,         5,      1,      do_sdfuse,
+       "sdfuse  - read images from EXT4 partition of SD card and write them to booting device.\n",
+       "sdfuse part_no flashall                 - flash all images\n"
        "sdfuse format                           - format mmc partition\n"
-       "sdfuse flash <partition> [ <filename> ] - write a file to a partition.\n"
+       "sdfuse flash part_no <partition> [ <filename> ] - write a file to a partition.\n"
 );
 #endif /* CONFIG_FASTBOOT_SDFUSE */
 
index 5b666af2c156dad3fa26f52c12132868ed7d96dd..085d4019c2d0b09219225c31da243481c2ffbc1d 100644 (file)
@@ -32,9 +32,6 @@ static char residue_buf[512];
 
 #define ext4_printf(args, ...)
 
-static int write_raw_chunk(char* data, unsigned int sector, unsigned int sector_size);
-
-
 int check_compress_ext4(char *img_base, unsigned long long parti_size) {
        ext4_file_header *file_header;
 
@@ -78,7 +75,8 @@ int check_compress_ext4(char *img_base, unsigned long long parti_size) {
        return 0;
 }
 
-int write_raw_chunk(char* data, unsigned int sector, unsigned int sector_size) {
+static int write_raw_chunk(int mmc_dev, char *data, unsigned int sector,
+                          unsigned int sector_size) {
        char run_cmd[64];
 #if defined(CONFIG_MMC_64BIT_BUS) || defined(CONFIG_CPU_EXYNOS5410_EVT2)
        unsigned char *tmp_align;
@@ -89,8 +87,9 @@ int write_raw_chunk(char* data, unsigned int sector, unsigned int sector_size) {
                data = tmp_align;
        }
 #endif
-       ext4_printf("write raw data in %d size %d \n", sector, sector_size);
-       sprintf(run_cmd,"mmc write 0 0x%x 0x%x 0x%x", (int)data, sector, sector_size);
+       ext4_printf("write raw data in %d size %d\n", sector, sector_size);
+       sprintf(run_cmd, "mmc write %d 0x%x 0x%x 0x%x", mmc_dev, (int)data,
+                       sector, sector_size);
        run_command(run_cmd, 0);
 
        return 0;
@@ -122,7 +121,7 @@ void exit_compressed_ext4(void)
        sector_base = 0;
 }
 
-int write_compressed_ext4(char *img_base, unsigned int buflen,
+int write_compressed_ext4(int mmc_dev, char *img_base, unsigned int buflen,
                          unsigned int base, unsigned int length)
 {
        unsigned int sector_size;
@@ -166,7 +165,8 @@ int write_compressed_ext4(char *img_base, unsigned int buflen,
                                 * and flash it */
                                memcpy(residue_buf + residue_bytes, img_base,
                                                SECTOR_SIZE - residue_bytes);
-                               write_raw_chunk(residue_buf, sector_base, 1);
+                               write_raw_chunk(mmc_dev, residue_buf,
+                                               sector_base, 1);
                                /* Move a location of sector base */
                                sector_base++;
                                img_base += (SECTOR_SIZE - residue_bytes);
@@ -192,7 +192,7 @@ int write_compressed_ext4(char *img_base, unsigned int buflen,
                        }
 
                        if (sector_size) {
-                               write_raw_chunk(img_base, sector_base,
+                               write_raw_chunk(mmc_dev, img_base, sector_base,
                                                sector_size);
                                sector_base += sector_size;
                                img_base += (sector_size << SECTOR_BITS);
index bea94d2554da32881769a54aba23e6d08b7b4e79..6ba5032945d57d9ad51fc19613be73c60c3a0be2 100644 (file)
@@ -41,7 +41,7 @@ typedef struct _ext4_chunk_header {
 
 ext4_file_header *init_compressed_ext4(char *img_base);
 void exit_compressed_ext4(void);
-int write_compressed_ext4(char *img_base, unsigned int buflen,
+int write_compressed_ext4(int mmc_dev, char *img_base, unsigned int buflen,
                        unsigned int sector_base, unsigned int length);
 int check_compress_ext4(char *img_base, unsigned long long parti_size);