mmc-utils: one ioctl enough for FFU
FFU upgrade is now done with a single ioctl
MMC_FFU_INVOKE_OP
BUG=None
TEST=Upgrade gnawty with latest sandisk patch.
Change-Id: I104234d83b1a231a04ed1f62d60413624cf5f446
Signed-off-by: Gwendal Grignou <gwendal@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/224152
diff --git a/mmc.h b/mmc.h
index b338e1d..d571986 100644
--- a/mmc.h
+++ b/mmc.h
@@ -80,8 +80,7 @@
*/
#define BKOPS_ENABLE (1<<0)
-#define MMC_FFU_DOWNLOAD_OP 302
-#define MMC_FFU_INSTALL_OP 303
+#define MMC_FFU_INVOKE_OP 302
/*
* EXT_CSD field definitions
diff --git a/mmc_cmds.c b/mmc_cmds.c
index 1793da6..99ad147 100644
--- a/mmc_cmds.c
+++ b/mmc_cmds.c
@@ -1318,40 +1318,12 @@
}
-static int ffu_download_image(char *fname, int mmc_fd)
-{
- struct mmc_ioc_cmd mmc_ioc_cmd;
-
- /* prepare and send ioctl */
- memset(&mmc_ioc_cmd, 0, sizeof(mmc_ioc_cmd));
- mmc_ioc_cmd.opcode = MMC_FFU_DOWNLOAD_OP;
- mmc_ioc_cmd.blksz = MIN(strlen(fname), FFU_PATH_SIZE);
- mmc_ioc_cmd.blocks = 1;
- mmc_ioc_cmd.arg = 0;
- mmc_ioc_cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_ADTC;
- mmc_ioc_cmd.write_flag = 1;
- mmc_ioc_cmd_set_data(mmc_ioc_cmd, fname);
- return ioctl(mmc_fd, MMC_IOC_CMD, &mmc_ioc_cmd);
-}
-
-static int ffu_install(int mmc_fd)
-{
- struct mmc_ioc_cmd mmc_ioc_cmd;
-
- memset(&mmc_ioc_cmd, 0, sizeof(mmc_ioc_cmd));
- mmc_ioc_cmd.opcode = MMC_FFU_INSTALL_OP;
- mmc_ioc_cmd.blocks = 0;
- mmc_ioc_cmd.arg = 0;
- mmc_ioc_cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_ADTC;
- mmc_ioc_cmd.write_flag = 0;
- return ioctl(mmc_fd, MMC_IOC_CMD, &mmc_ioc_cmd);
-}
-
int do_emmc50_ffu (int nargs, char **argv)
{
int fd, ret;
char *device;
char *path;
+ struct mmc_ioc_cmd mmc_ioc_cmd;
CHECK(nargs != 3, "Usage: ffu <image name> </path/to/mmcblkX> \n",
exit(1));
@@ -1368,13 +1340,16 @@
exit(1);
}
- ret = ffu_download_image(path, fd);
- if (ret) {
- fprintf(stderr, "FFU download failed : %s\n", strerror(errno));
- exit(1);
- }
-
- ret = ffu_install(fd);
+ /* prepare and send ioctl */
+ memset(&mmc_ioc_cmd, 0, sizeof(mmc_ioc_cmd));
+ mmc_ioc_cmd.opcode = MMC_FFU_INVOKE_OP;
+ mmc_ioc_cmd.blksz = MIN(strlen(path), FFU_PATH_SIZE);
+ mmc_ioc_cmd.blocks = 1;
+ mmc_ioc_cmd.arg = 0;
+ mmc_ioc_cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_ADTC;
+ mmc_ioc_cmd.write_flag = 1;
+ mmc_ioc_cmd_set_data(mmc_ioc_cmd, path);
+ ret = ioctl(fd, MMC_IOC_CMD, &mmc_ioc_cmd);
if (ret) {
fprintf(stderr, "FFU install failed : %s\n", strerror(errno));
exit(1);