This command alters the PARTITION_CONFIG[PARTITION_ACCESS] bits to allow
R/W to the various partition that exist on the device.
---
Hi Chris and mmc-utils maintainers,
WARNING: While this alters the bits that I want, it actually does not work.
Any subsequent access (e.g. mmc extcsd read) ends up with the system being
unresponsive. I have obviously done something uneducatedly stupid.
I am posting to show exactly what I have done and hoping that someone
can point me in the right direction.
I am trying to put MLO and u-boot into the boot partition (/dev/mmcblk1boot0)
and then boot from it. I thought if I set the PARTITION_ACCESS to allow boot0
I can then dd into it. So far all dd attempts returns with write operation
not permitted.
What am I missing?
Thanks for everyone's time.
Richard Retanubun
mmc.c | 5 +++++
mmc_cmds.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
mmc_cmds.h | 1 +
3 files changed, 59 insertions(+)
diff --git a/mmc.c b/mmc.c
index 926e92f..985db33 100644
--- a/mmc.c
+++ b/mmc.c
@@ -90,6 +90,11 @@ static struct Command commands[] = {
"Enable the boot partition for the <device>.\nTo receive
acknowledgment of boot from the card set <send_ack>\nto 1, else set it to 0.",
NULL
},
+ { do_write_partition_access, -2,
+ "partition access", "<partition_number> " "<device>\n"
+ "Enable R/W access to the specified partition on <device>.",
+ NULL
+ },
{ do_write_bkops_en, -1,
"bkops enable", "<device>\n"
"Enable the eMMC BKOPS feature on <device>.\nNOTE! This is a
one-time programmable (unreversible) change.",
diff --git a/mmc_cmds.c b/mmc_cmds.c
index af6f09f..d67004d 100644
--- a/mmc_cmds.c
+++ b/mmc_cmds.c
@@ -302,6 +302,59 @@ int do_write_boot_en(int nargs, char **argv)
return ret;
}
+int do_write_partition_access(int nargs, char **argv)
+{
+ __u8 ext_csd[512];
+ __u8 value = 0;
+ int fd, ret;
+ char *device;
+ int partition;
+
+ CHECK(nargs != 3, "Usage: mmc partition access <partition_number> "
+ "</path/to/mmcblkX>\n", exit(1));
+
+ /*
+ * If <send_ack> is 1, the device will send acknowledgment
+ * pattern "010" to the host when boot operation begins.
+ * If <send_ack> is 0, it won't.
+ */
+ partition = strtol(argv[1], NULL, 10);
+ device = argv[2];
+
+ if (partition < 0 || partition > 7) {
+ fprintf(stderr, "Cannot set access to partition %d "
+ "range [0-7] \n", partition);
+ exit(1);
+ }
+
+ fd = open(device, O_RDWR);
+ if (fd < 0) {
+ perror("open");
+ exit(1);
+ }
+
+ ret = read_extcsd(fd, ext_csd);
+ if (ret) {
+ fprintf(stderr, "Could not read EXT_CSD from %s\n", device);
+ exit(1);
+ }
+
+ value = ext_csd[EXT_CSD_PART_CONFIG];
+
+ /* Sanitize and set the PARTITION_ACCESS bits */
+ value &= 0xF8;
+ value |= partition;
+
+ ret = write_extcsd_value(fd, EXT_CSD_PART_CONFIG, value);
+ if (ret) {
+ fprintf(stderr, "Could not write 0x%02x to "
+ "EXT_CSD[%d] in %s\n",
+ value, EXT_CSD_PART_CONFIG, device);
+ exit(1);
+ }
+ return ret;
+}
+
int do_hwreset(int value, int nargs, char **argv)
{
__u8 ext_csd[512];
diff --git a/mmc_cmds.h b/mmc_cmds.h
index f06cc10..3ba9660 100644
--- a/mmc_cmds.h
+++ b/mmc_cmds.h
@@ -21,6 +21,7 @@ int do_writeprotect_get(int nargs, char **argv);
int do_writeprotect_set(int nargs, char **argv);
int do_disable_512B_emulation(int nargs, char **argv);
int do_write_boot_en(int nargs, char **argv);
+int do_write_partition_access(int nargs, char **argv);
int do_write_bkops_en(int nargs, char **argv);
int do_hwreset_en(int nargs, char **argv);
int do_hwreset_dis(int nargs, char **argv);
--
1.7.10.4
--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html