From: Javier Viguera Date: Thu, 16 Feb 2017 14:53:44 +0100 Subject: [PATCH 3/4] fw_env: add support to unlock emmc boot partition Signed-off-by: Javier Viguera --- tools/env/fw_env.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/tools/env/fw_env.c b/tools/env/fw_env.c index de2e693e9f93..db1182c7216e 100644 --- a/tools/env/fw_env.c +++ b/tools/env/fw_env.c @@ -1173,9 +1173,31 @@ static int flash_read (int fd) return 0; } +/* + * Set mmcboot partition read-write protection + */ +static int sysfs_mmcboot_set_protection(const char *device, int value) +{ + int fd; + char buf[64]; + + snprintf(buf, sizeof(buf), "/sys/block/%s/force_ro", device); + fd = open(buf, O_WRONLY); + if (fd < 0) { + perror("sysfs_mmcboot_set_protection"); + return fd; + } + snprintf(buf, sizeof(buf), "%s", value ? "1" : "0"); + write(fd, buf, 2); + close(fd); + + return 0; +} + static int flash_io (int mode) { int fd_current, fd_target, rc, dev_target; + char *mmcblk = NULL; /* dev_current: fd_current, erase_current */ fd_current = open (DEVNAME (dev_current), mode); @@ -1205,8 +1227,18 @@ static int flash_io (int mode) fd_target = fd_current; } + + /* Disable mmcboot protection if using EMMC (set read-write) */ + mmcblk = strstr(DEVNAME(dev_target), "mmcblk"); + if (mmcblk) + sysfs_mmcboot_set_protection(mmcblk, 0); + rc = flash_write (fd_current, fd_target, dev_target); + /* Re-enable mmcboot protection (set read-only) */ + if (mmcblk) + sysfs_mmcboot_set_protection(mmcblk, 1); + if (fsync(fd_current) && !(errno == EINVAL || errno == EROFS)) { fprintf (stderr,