summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Gardiner <bengardiner@nanometrics.ca>2013-05-30 17:12:49 -0400
committerChris Ball <cjb@laptop.org>2013-06-27 11:11:05 -0400
commit4e85023654b356511612547207a4cb643fb3db16 (patch)
tree61dade13b9888d36526ccf1aceba79e7b3415ef9
parent68f490b54b53c715db06e55f9595a672d1c0690e (diff)
downloadmmc-utils-4e85023654b356511612547207a4cb643fb3db16.tar.gz
report if card is block-addressed and effect on ENH_START_ADDR
Signed-off-by: Ben Gardiner <bengardiner@nanometrics.ca> Signed-off-by: Chris Ball <cjb@laptop.org>
-rw-r--r--mmc.h4
-rw-r--r--mmc_cmds.c28
2 files changed, 29 insertions, 3 deletions
diff --git a/mmc.h b/mmc.h
index 491ce0a..722b837 100644
--- a/mmc.h
+++ b/mmc.h
@@ -37,6 +37,10 @@
#define EXT_CSD_HPI_FEATURE 503
#define EXT_CSD_BKOPS_SUPPORT 502 /* RO */
#define EXT_CSD_BOOT_INFO 228 /* R/W */
+#define EXT_CSD_SEC_COUNT_3 215
+#define EXT_CSD_SEC_COUNT_2 214
+#define EXT_CSD_SEC_COUNT_1 213
+#define EXT_CSD_SEC_COUNT_0 212
#define EXT_CSD_PART_SWITCH_TIME 199
#define EXT_CSD_BOOT_CFG 179
#define EXT_CSD_PART_CONFIG 179
diff --git a/mmc_cmds.c b/mmc_cmds.c
index df30178..188dd69 100644
--- a/mmc_cmds.c
+++ b/mmc_cmds.c
@@ -424,6 +424,21 @@ int do_status_get(int nargs, char **argv)
return ret;
}
+unsigned int get_sector_count(__u8 *ext_csd)
+{
+ return (ext_csd[EXT_CSD_SEC_COUNT_3] << 24) |
+ (ext_csd[EXT_CSD_SEC_COUNT_2] << 16) |
+ (ext_csd[EXT_CSD_SEC_COUNT_1] << 8) |
+ ext_csd[EXT_CSD_SEC_COUNT_0];
+}
+
+int is_blockaddresed(__u8 *ext_csd)
+{
+ unsigned int sectors = get_sector_count(ext_csd);
+
+ return (sectors > (2u * 1024 * 1024 * 1024) / 512);
+}
+
int do_read_extcsd(int nargs, char **argv)
{
__u8 ext_csd[512], ext_csd_rev, reg;
@@ -591,9 +606,14 @@ int do_read_extcsd(int nargs, char **argv)
/* A441/A43: reserved [218] */
printf("Sleep/awake timeout [S_A_TIMEOUT: 0x%02x]\n", ext_csd[217]);
/* A441/A43: reserved [216] */
- printf("Sector Count [SEC_COUNT: 0x%08x]\n", (ext_csd[215] << 24) |
- (ext_csd[214] << 16) | (ext_csd[213] << 8) |
- ext_csd[212]);
+
+ unsigned int sectors = get_sector_count(ext_csd);
+ printf("Sector Count [SEC_COUNT: 0x%08x]\n", sectors);
+ if (is_blockaddresed(ext_csd))
+ printf(" Device is block-addressed\n");
+ else
+ printf(" Device is NOT block-addressed\n");
+
/* A441/A43: reserved [211] */
printf("Minimum Write Performance for 8bit:\n");
printf(" [MIN_PERF_W_8_52: 0x%02x]\n", ext_csd[210]);
@@ -753,6 +773,8 @@ int do_read_extcsd(int nargs, char **argv)
ext_csd[EXT_CSD_ENH_START_ADDR_0];
printf("Enhanced User Data Start Address"
" [ENH_START_ADDR]: 0x%06x\n", reg);
+ printf(" i.e. %lu bytes offset\n", (is_blockaddresed(ext_csd) ?
+ 1l : 512l) * reg);
/* A441]: reserved [135] */
printf("Bad Block Management mode"