提交 f1932b78 编写于 作者: L Lubomir Rintel 提交者: Tom Rini

env: Allow accessing non-mtd devices

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.
Signed-off-by: NLubomir Rintel <lkundrak@v3.sk>
上级 c8b5f556
......@@ -836,9 +836,9 @@ static int flash_write_buf (int dev, int fd, void *buf, size_t count,
erase.start = blockstart;
ioctl (fd, MEMUNLOCK, &erase);
/* Dataflash does not need an explicit erase cycle */
if (mtd_type != MTD_DATAFLASH)
/* These do not need an explicit erase cycle */
if (mtd_type != MTD_ABSENT &&
mtd_type != MTD_DATAFLASH)
if (ioctl (fd, MEMERASE, &erase) != 0) {
fprintf (stderr, "MTD erase error on %s: %s\n",
DEVNAME (dev),
......@@ -949,19 +949,33 @@ 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");
fprintf(stderr, "Cannot stat the file %s\n",
DEVNAME(dev_current));
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;
if (S_ISCHR(st.st_mode)) {
rc = ioctl(fd, MEMGETINFO, &mtdinfo);
if (rc < 0) {
fprintf(stderr, "Cannot get MTD information for %s\n",
DEVNAME(dev_current));
return -1;
}
if (mtdinfo.type != MTD_NORFLASH &&
mtdinfo.type != MTD_NANDFLASH &&
mtdinfo.type != MTD_DATAFLASH) {
fprintf (stderr, "Unsupported flash type %u on %s\n",
mtdinfo.type, DEVNAME(dev_current));
return -1;
}
} else {
memset(&mtdinfo, 0, sizeof(mtdinfo));
mtdinfo.type = MTD_ABSENT;
}
DEVTYPE(dev_current) = mtdinfo.type;
......
......@@ -17,3 +17,6 @@
# NAND example
#/dev/mtd0 0x4000 0x4000 0x20000 2
# Block device example
#/dev/mmcblk0 0xc0000 0x20000
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册