[U-Boot] [PATCH] env: Allow accessing non-mtd devices
Lubomir Rintel
lkundrak at v3.sk
Thu Jan 31 00:46:24 CET 2013
In certain cases, memory device is present as flat file or block device (via
mmc or mtdblock layer). Do not attempt MTD operations against it.
---
tools/env/fw_env.c | 21 ++++++++++++++++-----
tools/env/fw_env.config | 3 +++
2 files changed, 19 insertions(+), 5 deletions(-)
diff --git a/tools/env/fw_env.c b/tools/env/fw_env.c
index 37b60b8..0d8052d 100644
--- a/tools/env/fw_env.c
+++ b/tools/env/fw_env.c
@@ -838,7 +838,7 @@ static int flash_write_buf (int dev, int fd, void *buf, size_t count,
ioctl (fd, MEMUNLOCK, &erase);
/* Dataflash does not need an explicit erase cycle */
- if (mtd_type != MTD_DATAFLASH)
+ if (mtd_type && mtd_type != MTD_DATAFLASH)
if (ioctl (fd, MEMERASE, &erase) != 0) {
fprintf (stderr, "MTD erase error on %s: %s\n",
DEVNAME (dev),
@@ -949,23 +949,34 @@ static int flash_write (int fd_current, int fd_target, int dev_target)
static int flash_read (int fd)
{
struct mtd_info_user mtdinfo;
+ struct stat st;
int rc;
- rc = ioctl (fd, MEMGETINFO, &mtdinfo);
+ rc = fstat (fd, &st);
if (rc < 0) {
- perror ("Cannot get MTD information");
+ perror ("Cannot access MTD device");
return -1;
}
+ if (S_ISCHR (st.st_mode)) {
+ rc = ioctl (fd, MEMGETINFO, &mtdinfo);
+ if (rc < 0) {
+ perror ("Cannot get MTD information");
+ return -1;
+ }
+ } else {
+ memset (&mtdinfo, 0, sizeof (mtdinfo));
+ }
+
if (mtdinfo.type != MTD_NORFLASH &&
mtdinfo.type != MTD_NANDFLASH &&
- mtdinfo.type != MTD_DATAFLASH) {
+ mtdinfo.type != MTD_DATAFLASH &&
+ mtdinfo.type) {
fprintf (stderr, "Unsupported flash type %u\n", mtdinfo.type);
return -1;
}
DEVTYPE(dev_current) = mtdinfo.type;
-
rc = flash_read_buf(dev_current, fd, environment.image, CUR_ENVSIZE,
DEVOFFSET (dev_current), mtdinfo.type);
diff --git a/tools/env/fw_env.config b/tools/env/fw_env.config
index 8e21d5a..c086512 100644
--- a/tools/env/fw_env.config
+++ b/tools/env/fw_env.config
@@ -17,3 +17,6 @@
# NAND example
#/dev/mtd0 0x4000 0x4000 0x20000 2
+
+# Block device example
+#/dev/mmcblk0 0xc0000 0x20000
--
1.7.1
More information about the U-Boot
mailing list