
On Fri, Sep 9, 2016 at 1:27 AM, Petr Kulhavy brain@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@jikos.cz Reviewed-by: Tom Rini trini@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@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot
Acked-by: Steve Rae steve.rae@raedomain.com