On 10/05/2016 10:38 PM, Petr Kulhavy wrote:
> 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)

Is it right about "const struct blk_desc ..."? Why use "const"?

> +{
> +     if (strlen(name) <= FB_RAW_PREFIX_LEN ||
> +         strncmp(name, FB_RAW_PREFIX, FB_RAW_PREFIX_LEN) != 0)

strlen(name) was need to check?

> +             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
> 

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

Reply via email to