The current fastboot implementation is only able to flash partition images.
However sometimes it is needed to write the raw MMC, e.g. when storing the
U-boot environment image or SPL.

This patch adds the possibility to write MMC as a block device using a
special target name composed of "lba:" followed by the block address.
The address can be in decimal or hexadecimal with the "0x" prefix.

Signed-off-by: Petr Kulhavy <br...@jikos.cz>
---
 common/fb_mmc.c             | 38 +++++++++++++++++++++++++++++++++++++-
 doc/README.android-fastboot | 15 +++++++++++++++
 2 files changed, 52 insertions(+), 1 deletion(-)

diff --git a/common/fb_mmc.c b/common/fb_mmc.c
index 81a3bd0..c4fe2ac 100644
--- a/common/fb_mmc.c
+++ b/common/fb_mmc.c
@@ -27,6 +27,9 @@
 #define CONFIG_FASTBOOT_MBR_NAME "mbr"
 #endif
 
+#define FB_RAW_PREFIX          "lba:"
+#define FB_RAW_PREFIX_LEN      4
+
 struct fb_mmc_sparse {
        struct blk_desc *dev_desc;
 };
@@ -68,6 +71,29 @@ static lbaint_t fb_mmc_sparse_reserve(struct sparse_storage 
*info,
        return blkcnt;
 }
 
+/*
+ * attempt to interpret the partition name as raw LBA
+ * on success return 1 and fill info
+ * on failure (not a LBA matching name) return 0 (info undefined)
+ */
+static int get_raw_part_info(const struct blk_desc *dev_desc, const char *name,
+               disk_partition_t *info)
+{
+       if (strlen(name) <= FB_RAW_PREFIX_LEN ||
+           strncmp(name, FB_RAW_PREFIX, FB_RAW_PREFIX_LEN) != 0)
+               return 0;
+
+#if CONFIG_SYS_64BIT_LBA
+       info->start = simple_strtoull(name + FB_RAW_PREFIX_LEN, NULL, 10);
+#else
+       info->start = simple_strtoul(name + FB_RAW_PREFIX_LEN, NULL, 10);
+#endif
+       info->size = dev_desc->lba - info->start;
+       info->blksz = dev_desc->blksz;
+
+       return 1;
+}
+
 static void write_raw_image(struct blk_desc *dev_desc, disk_partition_t *info,
                const char *part_name, void *buffer,
                unsigned int download_bytes)
@@ -153,7 +179,17 @@ void fb_mmc_flash_write(const char *cmd, void 
*download_buffer,
        }
 #endif
 
-       if (part_get_info_by_name_or_alias(dev_desc, cmd, &info)) {
+       /* first try to interpret as a raw write */
+       if (get_raw_part_info(dev_desc, cmd, &info)) {
+               printf("%s: writing raw data at LBA 0x%llx\n", __func__,
+                      (unsigned long long) info.start);
+               /* check if start is within the media */
+               if (info.start >= dev_desc->lba) {
+                       error("Attempt to write beyond the end of media\n");
+                       fastboot_fail("LBA write out of media");
+                       return;
+               }
+       } else if (part_get_info_by_name_or_alias(dev_desc, cmd, &info)) {
                error("cannot find partition: '%s'\n", cmd);
                fastboot_fail("cannot find partition");
                return;
diff --git a/doc/README.android-fastboot b/doc/README.android-fastboot
index b8afa15..cbc42a1 100644
--- a/doc/README.android-fastboot
+++ b/doc/README.android-fastboot
@@ -97,6 +97,21 @@ configuration options:
 CONFIG_FASTBOOT_GPT_NAME
 CONFIG_FASTBOOT_MBR_NAME
 
+Writing as a Block Device
+=========================
+Sometimes it is useful to write sections of eMMC which are not allocated as
+partitions. For instance to store the SPL or U-Boot environment.
+
+This can be achieved by writing a special target with the name "lba:" (lower
+case) followed by the block address at which the image should be stored. The
+block address can be noted in decimal or hexadecimal (prefixed with "0x").
+
+Example command:
+
+  $ fastboot flash "lba:1024" uboot-env.bin
+
+This writes the uboot-env.bin image file at logical block 1024, i.e. 512KiB.
+
 In Action
 =========
 Enter into fastboot by executing the fastboot command in u-boot and you
-- 
2.7.4

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to