Patchwork [U-Boot] Add support for MMC to fw_printenv/setenv

login
register
mail settings
Submitter Christian Daudt
Date Jan. 2, 2012, 11:49 p.m.
Message ID <CAGFynZ9Vz1FJynUYZPEcMBN8Dk1P5o_sNHpfVry17Yntfg4j2g@mail.gmail.com>
Download mbox | patch
Permalink /patch/133992/
State Changes Requested
Headers show

Comments

Christian Daudt - Jan. 2, 2012, 11:49 p.m.
Hi,
 Below is a patch that allows fw_printenv/fw_setenv to also operate
on MMC memory.

 Thanks,
  csd

From b835008c9654cce32b11059cde4f339ccd250672 Mon Sep 17 00:00:00 2001
From: Christian Daudt <csd@broadcom.com>
Date: Mon, 19 Dec 2011 17:50:18 -0800
Subject: [PATCH] Add support for MMC to fw_printenv/setenv

This patch checks if the fd is MTD and if not (using an MTD-specific IOCTL)
and skips the flash unlock/erase/lock sequence if it is not MTD.
- fd_is_mtd function added to determine MTD/MMC
- flash_write_block made to not try MTD operations if mtd_type == MTD_ABSENT
- flash_read works with MMC devices now.

Signed-off-by: Christian Daudt <csd@broadcom.com>
---
 tools/env/fw_env.c |  100 +++++++++++++++++++++++++++++++++++----------------
 1 files changed, 68 insertions(+), 32 deletions(-)

 			fprintf (stderr,
@@ -878,7 +901,8 @@ static int flash_write_buf (int dev, int fd, void
*buf, size_t count,
 			return -1;
 		}

-		ioctl (fd, MEMLOCK, &erase);
+		if (mtd_type != MTD_ABSENT)
+			ioctl (fd, MEMLOCK, &erase);

 		processed  += blocklen;
 		block_seek = 0;
@@ -964,18 +988,30 @@ static int flash_read (int fd)
 {
 	struct mtd_info_user mtdinfo;
 	int rc;
+	int is_mtd;

-	rc = ioctl (fd, MEMGETINFO, &mtdinfo);
-	if (rc < 0) {
-		perror ("Cannot get MTD information");
-		return -1;
-	}
+	is_mtd = fd_is_mtd(fd);

-	if (mtdinfo.type != MTD_NORFLASH &&
-	    mtdinfo.type != MTD_NANDFLASH &&
-	    mtdinfo.type != MTD_DATAFLASH) {
-		fprintf (stderr, "Unsupported flash type %u\n", mtdinfo.type);
-		return -1;
+	if (is_mtd) {
+		rc = ioctl (fd, MEMGETINFO, &mtdinfo);
+		if (rc < 0) {
+			perror ("Cannot get MTD information");
+			return -1;
+		}
+
+		if (mtdinfo.type != MTD_NORFLASH &&
+		    mtdinfo.type != MTD_NANDFLASH &&
+		    mtdinfo.type != MTD_DATAFLASH) {
+			fprintf (stderr, "Unsupported flash type %u\n", mtdinfo.type);
+			return -1;
+		}
+	} else {
+		/*
+		 * Kinda hacky assuming !MTD means == MMC
+		 * but seems to be the easiest way to
+		 * determine that.
+		 */
+		mtdinfo.type = MTD_ABSENT;
 	}

 	DEVTYPE(dev_current) = mtdinfo.type;
Mike Frysinger - Jan. 5, 2012, 11:28 p.m.
On Monday 02 January 2012 18:49:11 Christian Daudt wrote:
> --- a/tools/env/fw_env.c
> +++ b/tools/env/fw_env.c
> 
> +static int fd_is_mtd(int fd)
> ...
> +	rc = ioctl (fd, MEMGETINFO, &mtdinfo);

no space before the "("

> +	if (rc < 0) {
> +		// Failed MEMGETINFO, not MTD
> +		return 0;
> +	} else {
> +		// Succeeded, MTD
> +		return 1;
> +	}

do not use // comments
-mike

Patch

diff --git a/tools/env/fw_env.c b/tools/env/fw_env.c
index 996682e..b7aa771 100644
--- a/tools/env/fw_env.c
+++ b/tools/env/fw_env.c
@@ -211,6 +211,27 @@  static int flash_io (int mode);
 static char *envmatch (char * s1, char * s2);
 static int parse_config (void);

+
+/*
+ * Returns 1 if it is MTD and 0 if it is not MTD
+ */
+static int fd_is_mtd(int fd)
+{
+	struct mtd_info_user mtdinfo;
+	int rc;
+
+	rc = ioctl (fd, MEMGETINFO, &mtdinfo);
+	if (rc < 0) {
+		// Failed MEMGETINFO, not MTD
+		return 0;
+	} else {
+		// Succeeded, MTD
+		return 1;
+	}
+}
+
+
+
 #if defined(CONFIG_FILE)
 static int get_config (char *);
 #endif
@@ -836,31 +857,33 @@  static int flash_write_buf (int dev, int fd,
void *buf, size_t count,

 	/* This only runs once on NOR flash and SPI-dataflash */
 	while (processed < write_total) {
-		rc = flash_bad_block (fd, mtd_type, &blockstart);
-		if (rc < 0)		/* block test failed */
-			return rc;
+		if (mtd_type != MTD_ABSENT)  {
+			rc = flash_bad_block (fd, mtd_type, &blockstart);
+			if (rc < 0)		/* block test failed */
+				return rc;

-		if (blockstart + erasesize > top_of_range) {
-			fprintf (stderr, "End of range reached, aborting\n");
-			return -1;
-		}
+			if (blockstart + erasesize > top_of_range) {
+				fprintf (stderr, "End of range reached, aborting\n");
+				return -1;
+			}

-		if (rc) {		/* block is bad */
-			blockstart += blocklen;
-			continue;
-		}
+			if (rc) {		/* block is bad */
+				blockstart += blocklen;
+				continue;
+			}

-		erase.start = blockstart;
-		ioctl (fd, MEMUNLOCK, &erase);
+			erase.start = blockstart;
+			ioctl (fd, MEMUNLOCK, &erase);

-		/* Dataflash does not need an explicit erase cycle */
-		if (mtd_type != MTD_DATAFLASH)
-			if (ioctl (fd, MEMERASE, &erase) != 0) {
-				fprintf (stderr, "MTD erase error on %s: %s\n",
-					 DEVNAME (dev),
-					 strerror (errno));
-				return -1;
-			}
+			/* Dataflash does not need an explicit erase cycle */
+			if (mtd_type != MTD_DATAFLASH)
+				if (ioctl (fd, MEMERASE, &erase) != 0) {
+					fprintf (stderr, "MTD erase error on %s: %s\n",
+						 DEVNAME (dev),
+						 strerror (errno));
+					return -1;
+				}
+		}

 		if (lseek (fd, blockstart, SEEK_SET) == -1) {