[U-Boot] [PATCH v2 2/4] fastboot: add support for writing MBR
Steve Rae
steve.rae at raedomain.com
Mon Sep 12 19:38:14 CEST 2016
On Fri, Sep 9, 2016 at 1:27 AM, Petr Kulhavy <brain at jikos.cz> wrote:
> Add special target "mbr" (otherwise configurable via CONFIG_FASTBOOT_MBR_NAME)
> to write MBR partition table.
> Partitions are now searched using the generic function which finds any
> partiiton by name. For MBR the partition names hda1, sda1, etc. are used.
>
> Signed-off-by: Petr Kulhavy <brain at jikos.cz>
> Reviewed-by: Tom Rini <trini at konsulko.com>
> ---
> v1: initial
> v2: no change
>
> README | 7 +++++++
> common/fb_mmc.c | 40 ++++++++++++++++++++++++++++++++++------
> disk/part_dos.c | 20 ++++++++++++++++++++
> doc/README.android-fastboot | 37 +++++++++++++++++++++++++++++++++++++
> include/part.h | 23 +++++++++++++++++++++++
> 5 files changed, 121 insertions(+), 6 deletions(-)
>
> diff --git a/README b/README
> index 30d7ee3..f6ef8b8 100644
> --- a/README
> +++ b/README
> @@ -1682,6 +1682,13 @@ The following options need to be configured:
> "fastboot flash" command line matches this value.
> Default is GPT_ENTRY_NAME (currently "gpt") if undefined.
>
> + CONFIG_FASTBOOT_MBR_NAME
> + The fastboot "flash" command supports writing the downloaded
> + image to DOS MBR.
> + This occurs when the "partition name" specified on the
> + "fastboot flash" command line matches this value.
> + If not defined the default value "mbr" is used.
> +
> - Journaling Flash filesystem support:
> CONFIG_JFFS2_NAND, CONFIG_JFFS2_NAND_OFF, CONFIG_JFFS2_NAND_SIZE,
> CONFIG_JFFS2_NAND_DEV
> diff --git a/common/fb_mmc.c b/common/fb_mmc.c
> index a0a4a83..4bc68a7 100644
> --- a/common/fb_mmc.c
> +++ b/common/fb_mmc.c
> @@ -14,15 +14,20 @@
> #include <mmc.h>
> #include <div64.h>
>
> -#ifndef CONFIG_FASTBOOT_GPT_NAME
> +#if defined(CONFIG_EFI_PARTITION) && !defined(CONFIG_FASTBOOT_GPT_NAME)
> #define CONFIG_FASTBOOT_GPT_NAME GPT_ENTRY_NAME
> #endif
>
> +
> +#if defined(CONFIG_DOS_PARTITION) && !defined(CONFIG_FASTBOOT_MBR_NAME)
> +#define CONFIG_FASTBOOT_MBR_NAME "mbr"
> +#endif
> +
> struct fb_mmc_sparse {
> struct blk_desc *dev_desc;
> };
>
> -static int part_get_info_efi_by_name_or_alias(struct blk_desc *dev_desc,
> +static int part_get_info_by_name_or_alias(struct blk_desc *dev_desc,
> const char *name, disk_partition_t *info)
> {
> int ret;
> @@ -103,6 +108,7 @@ void fb_mmc_flash_write(const char *cmd, void *download_buffer,
> return;
> }
>
> +#ifdef CONFIG_EFI_PARTITION
> if (strcmp(cmd, CONFIG_FASTBOOT_GPT_NAME) == 0) {
> printf("%s: updating MBR, Primary and Backup GPT(s)\n",
> __func__);
> @@ -114,14 +120,36 @@ void fb_mmc_flash_write(const char *cmd, void *download_buffer,
> }
> if (write_mbr_and_gpt_partitions(dev_desc, download_buffer)) {
> printf("%s: writing GPT partitions failed\n", __func__);
> - fastboot_fail(
> - "writing GPT partitions failed");
> + fastboot_fail("writing GPT partitions failed");
> return;
> }
> printf("........ success\n");
> fastboot_okay("");
> return;
> - } else if (part_get_info_efi_by_name_or_alias(dev_desc, cmd, &info)) {
> + }
> +#endif
> +
> +#ifdef CONFIG_DOS_PARTITION
> + if (strcmp(cmd, CONFIG_FASTBOOT_MBR_NAME) == 0) {
> + printf("%s: updating MBR\n", __func__);
> + if (is_valid_dos_buf(download_buffer)) {
> + printf("%s: invalid MBR - refusing to write to flash\n",
> + __func__);
> + fastboot_fail("invalid MBR partition");
> + return;
> + }
> + if (write_mbr_partition(dev_desc, download_buffer)) {
> + printf("%s: writing MBR partition failed\n", __func__);
> + fastboot_fail("writing MBR partition failed");
> + return;
> + }
> + printf("........ success\n");
> + fastboot_okay("");
> + return;
> + }
> +#endif
> +
> + 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;
> @@ -172,7 +200,7 @@ void fb_mmc_erase(const char *cmd)
> return;
> }
>
> - ret = part_get_info_efi_by_name_or_alias(dev_desc, cmd, &info);
> + ret = part_get_info_by_name_or_alias(dev_desc, cmd, &info);
> if (ret) {
> error("cannot find partition: '%s'", cmd);
> fastboot_fail("cannot find partition");
> diff --git a/disk/part_dos.c b/disk/part_dos.c
> index 8226601..8e6aae5 100644
> --- a/disk/part_dos.c
> +++ b/disk/part_dos.c
> @@ -297,6 +297,26 @@ int part_get_info_dos(struct blk_desc *dev_desc, int part,
> return part_get_info_extended(dev_desc, 0, 0, 1, part, info, 0);
> }
>
> +int is_valid_dos_buf(void *buf)
> +{
> + return test_block_type(buf) == DOS_MBR ? 0 : -1;
> +}
> +
> +int write_mbr_partition(struct blk_desc *dev_desc, void *buf)
> +{
> + if (is_valid_dos_buf(buf))
> + return -1;
> +
> + /* write MBR */
> + if (blk_dwrite(dev_desc, 0, 1, buf) != 1) {
> + printf("%s: failed writing '%s' (1 blks at 0x0)\n",
> + __func__, "MBR");
> + return 1;
> + }
> +
> + return 0;
> +}
> +
> U_BOOT_PART_TYPE(dos) = {
> .name = "DOS",
> .part_type = PART_TYPE_DOS,
> diff --git a/doc/README.android-fastboot b/doc/README.android-fastboot
> index ce12bc5..dea7066 100644
> --- a/doc/README.android-fastboot
> +++ b/doc/README.android-fastboot
> @@ -59,6 +59,43 @@ To define a partition alias add an environment variable similar to:
> fastboot_partition_alias_<alias partition name>=<actual partition name>
> Example: fastboot_partition_alias_boot=LNX
>
> +Partition Names
> +===============
> +The Fastboot implementation in U-boot allows to write images into disk
> +partitions (currently on eMMC). Target partitions are referred on the host
> +computer by their names.
> +
> +For GPT/EFI the respective partition name is used.
> +
> +For MBR the partitions are referred by generic names according to the
> +following schema:
> +
> + <device type> <device index letter> <partition index>
> +
> +Example: hda3, sdb1, usbda1
> +
> +The device type is as follows:
> +
> + * IDE, ATAPI and SATA disks: hd
> + * SCSI disks: sd
> + * USB media: usbd
> + * Disk on chip: docd
> + * other: xx
> +
> +The device index starts from 'a' and refers to the interface (e.g. USB
> +controller, SD/MMC controller) or disk index. The partition index starts
> +from 1 and describes the partition number on the particular device.
> +
> +Writing Partition Table
> +=======================
> +Fastboot also allows to write the partition table to the media. This can be
> +done by writing the respective partition table image to a special target
> +"gpt" or "mbr". These names can be customized by defining the following
> +configuration options:
> +
> +CONFIG_FASTBOOT_GPT_NAME
> +CONFIG_FASTBOOT_MBR_NAME
> +
> In Action
> =========
> Enter into fastboot by executing the fastboot command in u-boot and you
> diff --git a/include/part.h b/include/part.h
> index bd8fd49..b17c219 100644
> --- a/include/part.h
> +++ b/include/part.h
> @@ -351,4 +351,27 @@ int gpt_verify_partitions(struct blk_desc *dev_desc,
> gpt_header *gpt_head, gpt_entry **gpt_pte);
> #endif
>
> +#ifdef CONFIG_DOS_PARTITION
> +/**
> + * is_valid_dos_buf() - Ensure that a DOS MBR image is valid
> + *
> + * @param buf - buffer which contains the MBR
> + *
> + * @return - '0' on success, otherwise error
> + */
> +int is_valid_dos_buf(void *buf);
> +
> +/**
> + * write_mbr_partition() - write DOS MBR
> + *
> + * @param dev_desc - block device descriptor
> + * @param buf - buffer which contains the MBR
> + *
> + * @return - '0' on success, otherwise error
> + */
> +int write_mbr_partition(struct blk_desc *dev_desc, void *buf);
> +
> +#endif
> +
> +
> #endif /* _PART_H */
> --
> 2.7.4
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
Acked-by: Steve Rae <steve.rae at raedomain.com>
More information about the U-Boot
mailing list