[IMX6DL]fastboot erase SD分区实现

u-boot: v2009.08

系统默认只支持nand的fastboot erase功能,而我们用的是SD,当使用fastboot erase时,会提示:

“Not support erase command for EMMC”

SD和EMMC都是基于MMC,u-boot本身有实现mmc的block erase功能,

因此我们利用它来擦写对应的块即可。

在擦写之前,我们需要对应的分区信息,fastboot init那会需要将partition

的信息添加到partition table中,这里是添加userdata分区的例子:

diff --git a/drivers/fastboot/fastboot.c b/drivers/fastboot/fastboot.c
index cb1d176..e7606e0 100644
--- a/drivers/fastboot/fastboot.c
+++ b/drivers/fastboot/fastboot.c
@@ -84,6 +84,8 @@ enum {
     PTN_KERNEL_INDEX,
     PTN_URAMDISK_INDEX,
     PTN_SYSTEM_INDEX,
+    /*Kris, 20160701, add userdata partition. */
+    PTN_USERDATA_INDEX,
     PTN_RECOVERY_INDEX
 };

@@ -406,6 +408,12 @@ static int fastboot_init_mmc_sata_ptable(void)
                                   user_partition,
                                   "system", dev_desc, ptable);

+       /*Kris, 20160701, add userdata partition. */
+       setup_ptable_mmc_partition(PTN_USERDATA_INDEX,
+                                  CONFIG_ANDROID_USERDATA_PARTITION_MMC,
+                                  user_partition,
+                                  "userdata", dev_desc, ptable);
+
        for (i = 0; i <= PTN_RECOVERY_INDEX; i++)
                fastboot_flash_add_ptn(&ptable[i]);

diff --git a/include/configs/mx6_tek_android.h b/include/configs/mx6_tek_android.h
index e9ea67f..20a515c 100644
--- a/include/configs/mx6_tek_android.h
+++ b/include/configs/mx6_tek_android.h
@@ -59,6 +59,9 @@
 #define CONFIG_ANDROID_RECOVERY_PARTITION_MMC 2
 #define CONFIG_ANDROID_CACHE_PARTITION_MMC 6

+/*Kris, 20160701, add userdata partition. */
+#define CONFIG_ANDROID_USERDATA_PARTITION_MMC  4
+

这里的CONFIG_ANDROID_USERDATA_PARTITION_MMC的值一定要和你的具体分区信息对应,

比如我的userdata分区是/dev/block/mmcblk0p4, 因此是分区4.

接着就可以实现fastboot erase功能了,对应的fastboot命令接收函数是rx_handler(),

改动如下:

diff --git a/common/cmd_fastboot.c b/common/cmd_fastboot.c
index 900ed1a..eff8d8a 100644
--- a/common/cmd_fastboot.c
+++ b/common/cmd_fastboot.c
@@ -939,8 +939,55 @@ static int rx_handler (const unsigned char *buffer, unsigned int buffer_size)
                        }
                        ret = 0;
 #else
+/*Kris,20160701, support erase partition. {*/
+#if 0
                        printf("Not support erase command for EMMC\n");
                        ret = -1;
+#else
+                       struct fastboot_ptentry *ptn;
+                       char slot_no[32], offset[32],  length[32], part_no[32];
+                       unsigned int temp;
+
+                       /* Next is the partition name */
+                       ptn = fastboot_flash_find_ptn(cmdbuf + 6);
+                       if (ptn == 0) {
+                               printf("Partition:'%s' does not exist\n",cmdbuf + 6);
+                               sprintf(response, "FAILpartition does not exist");
+                       }
+
+                       printf("erase partition '%s'\n", ptn->name);
+                       char *mmc_erase[4] = {"mmc", "erase", NULL, NULL};
+                       char *mmc_dev[4] = {"mmc", "dev", NULL, NULL};
+
+                       mmc_dev[2] = slot_no;
+                       mmc_dev[3] = part_no;
+                       mmc_erase[2] = offset;
+                       mmc_erase[3] = length;
+
+                       sprintf(offset, "0x%x", ptn->start);
+                       temp = (ptn->length +MMC_SATA_BLOCK_SIZE - 1) / MMC_SATA_BLOCK_SIZE;
+                       sprintf(length, "0x%x", temp);
+                       sprintf(slot_no, "%d", fastboot_devinfo.dev_id);
+                       sprintf(part_no, "%d", ptn->partition_id);
+
+                       printf("Initializing '%s'\n", ptn->name);
+                       if (do_mmcops(NULL, 0, 4, mmc_dev))
+                               sprintf(response, "FAIL:Init of MMC card");
+                       else
+                               sprintf(response, "OKAY");
+
+                       printf("Erasing '%s'\n", ptn->name);
+                       if (do_mmcops(NULL, 0, 4, mmc_erase)) {
+                               printf("Erasing '%s' FAILED!\n", ptn->name);
+                               sprintf(response, "FAIL: Write partition");
+                       } else {
+                               printf("Erasing '%s' DONE!\n", ptn->name);
+                               sprintf(response, "OKAY");
+                       }
+                       ret = 0;
+#endif
+/*Kris,20160701, support erase partition. }*/
+
 #endif

这样就可以erase了(其他分区也通用),userdata比较大,所以erase有一会儿:

[[email protected]:~]$ sudo fastboot erase userdata

erasing ‘userdata‘...

OKAY [126.140s]

finished. total time: 126.140s

当然erase之后还需要将useradata image download进去,否则会因无文件系统而挂载失败。

编译了个5M大小的image,主要用它的文件系统。

[[email protected]:~]$ sudo fastboot flash userdata userdata.img

sending ‘userdata‘ (5120 KB)...

OKAY [  4.915s]

writing ‘userdata‘...

OKAY [  0.586s]

finished. total time: 5.501s

时间: 2024-10-10 10:35:44

[IMX6DL]fastboot erase SD分区实现的相关文章

U-Boot 不能识别FAT32 SD分区

/********************************************************************* * U-Boot 不能识别FAT32 SD分区 * 说明: * 武馆在使用SD进行配置系统的时候,无法完成配置,主要原因是U-Boot * 没有识别FAT32格式的SD分区导致无法读取到分区中的配置文件. * * 2017-8-18 深圳 龙华樟坑村 曾剑锋 *************************************************

android 开发工具 fastboot 命令

控制类: fastboot devices                        查看设备信息 fastboot reboot                         重启设备 fastboot reboot-bootloader         重启Bootloader fastboot oem unlock                  解锁OEM fastboot oem unlock                  锁定OEM fastboot -w update

Android Fastboot 与 Recovery 和刷机 千山万水迷了鹿

1. 首先来看下Android系统的分区: Android系统的分区.jpg Android分区解释.png 安卓系统一般把rom芯片分成7个区,如果再加上内置sd卡这个分区,就是8个: hboot分区----------负责启动. radio分区----------负责驱动. recovery分区-------负责恢复. boot分区-----------系统内核. system分区---------系统文件. cache分区----------系统缓存. userdata分区-------用

New Moto X 2014 全版本RSD&amp;Fastboot刷官方底包教程

本来我是不想写教程的,因为这样的教程实在是太多了,基本上大家也都会了,为什么还要多次一举,发来发去的呢?实在没什么意义!但是我觉得吧,别人的教程写的都太过简单,太过明了了,有时候我们很难理解,这到底是怎么操作的,他一句话就概括了,我们却一头雾水,不知道如何做到,然后又要问东问西去解答. 首先要了解我们为什么要刷底包,刷底包有什么作用? 底包就像是window的操作系统,刷底包就是给手机换个系统或者是恢复系统,比如一些人乱折腾把原有系统给搞换了,系统出现问题,甚至起不来完全坏了,这时候我们就要刷底

Android手机fastboot 刷机命令【转】

本文转载自:http://luke-feng.iteye.com/blog/2171090 简介:在安卓手机中fastboot是一种比recovery更底层的模式.fastboot是一种线刷,就是使用USB数据线连接手机的一种刷机模式.这种模式是更接近于硬件的界面,所以这个模式一般好似在手机变砖或者修复时使用的.今天就说说fastboot的详细教程. 一.常用命令:1.先进入fastboot文件所在目录:2.输入fastboot.exe启动fastboot:3.查看连接电脑的设备命令:fastb

Android 手机 ADB FastBoot 命令基本用法

adb用法: 准备: 1.在电脑上安装相应的USB驱动,在各分区置顶帖子有下载链接 2.手机进入设置->开发人员选项->勾选USB调试 adb devices 查看是否有设备 adb shell  ——登录到手机,可以执行各种linux命令.运行后会出现上面提到的提示符,然后光标闪动等待输入命令,比如:ls             ——列出当前目录下的目录和文件cd xxx      ——进入xxx目录,可以是相对或绝对路径其他常用命令很多,具体可以百度.adb shell 查看是否root.

Fastboot的使用简单教程

大家都知道HTC手机重启进入所谓的工程模式,就是HBOOT,然后可以进入FASTBOOT界面,在这个界面,我们可以在电脑端可以做很多事,特别是HBOOT被修改过,如果是ENG S-OFF的可以做的更多.就是利用FASTBOOT可以刷入一些分区.但是有些分区不建议大家使用FASTBOOT.你也刷不进. 手机端分区: 这里的分区主要就是我们经常会使用的分区: 开机启动画面区(splash1):开机第一屏就是这个 数据恢复区(recovery):Recovery所在的分区 内核区(boot):引导分区

fastboot刷机的一般方法

一.Fastboot 简介 在安卓手机中Fastboot是一种比recovery更底层的刷机模式(俗称引导模式).就是使用USB数据线连接手机的一种刷机模式.相对于Recovery.Fota等卡刷来说,线刷更可靠,安全. 二.Fastboot 刷机准备 1.解锁 BootLoader 使用 Fastboot 刷机必须先解锁BootLoader,否则无法刷机.解锁BootLoader的方法是在开发者模式中开起OEM unlocking开关.如开发者模式隐藏,请进入Settings -- Syste

Android Fastboot[wiki百科]

Overview Fastboot is the method that Android uses to flash the Android build onto the target. If you really want the details, the Fastboot protocol specification is found in the Android source fastboot_protocol.txt. Fastboot abstracts the details of