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