免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 15128 | 回复: 9
打印 上一主题 下一主题

关于直接编写应用程序读写/dev/mtd0 或者 /dev/mtdblock0的问题。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-17 11:09 |只看该作者 |倒序浏览
10可用积分
关于直接编写应用程序读写/dev/mtd0 或者 /dev/mtdblock0的问题。

开发板的Linux环境:
# uname -a
Linux 192.168.102.213 2.6.12-4.2-brcmstb #73 Tue Apr 14 16:06:50 CST 2009 7403a0 unknown

我的开发板的Nor flash分区情况是
# cat /proc/mtd
dev:    size   erasesize  name
mtd0: 01800000 00020000 "rootfs"
mtd1: 00200000 00020000 "vmlinux"
mtd2: 00400000 00020000 "config"
mtd3: 00080000 00020000 "splash"
mtd4: 00080000 00020000 "cfe"
mtd5: 00000080 00020000 "mactype"
mtd6: 00040000 00020000 "nvram"
mtd7: 00040000 00020000 "feature"

# ls /dev/mtd* -al
crwxr-xr-x    1 nobody   nobody    90,   0 Mar  2  2009 /dev/mtd0
crwxr-xr-x    1 nobody   nobody    90,   2 Mar  2  2009 /dev/mtd1
crwxr-xr-x    1 nobody   nobody    90,   4 Mar  2  2009 /dev/mtd2
crwxr-xr-x    1 nobody   nobody    90,   6 Mar  2  2009 /dev/mtd3
crwxr-xr-x    1 nobody   nobody    90,   8 Mar  2  2009 /dev/mtd4
crwxr-xr-x    1 nobody   nobody    90,  10 Mar  2  2009 /dev/mtd5
crwxr-xr-x    1 nobody   nobody    90,  12 Mar  2  2009 /dev/mtd6
-rw-r--r--    1 root     root           19 Apr 15  2009 /dev/mtd9
brwxr-xr-x    1 nobody   nobody    31,   0 Mar  2  2009 /dev/mtdblock0
brwxr-xr-x    1 nobody   nobody    31,   1 Mar  2  2009 /dev/mtdblock1
brwxr-xr-x    1 nobody   nobody    31,   2 Mar  2  2009 /dev/mtdblock2
brwxr-xr-x    1 nobody   nobody    31,   3 Mar  2  2009 /dev/mtdblock3
brwxr-xr-x    1 nobody   nobody    31,   4 Mar  2  2009 /dev/mtdblock4
brwxr-xr-x    1 nobody   nobody    31,   5 Mar  2  2009 /dev/mtdblock5
brwxr-xr-x    1 nobody   nobody    31,   6 Mar  2  2009 /dev/mtdblock6
crwxr-xr-x    1 nobody   nobody    90,   1 Mar  2  2009 /dev/mtdr0
crwxr-xr-x    1 nobody   nobody    90,   3 Mar  2  2009 /dev/mtdr1
crwxr-xr-x    1 nobody   nobody    90,   5 Mar  2  2009 /dev/mtdr2
crwxr-xr-x    1 nobody   nobody    90,   7 Mar  2  2009 /dev/mtdr3
crwxr-xr-x    1 nobody   nobody    90,   9 Mar  2  2009 /dev/mtdr4
crwxr-xr-x    1 nobody   nobody    90,  11 Mar  2  2009 /dev/mtdr5
crwxr-xr-x    1 nobody   nobody    90,  13 Mar  2  2009 /dev/mtdr6

通过NFS启动系统后,执行应用程序能读出 /dev/mtd6里面的数据,但是我要写入数据,该如何做?是不是在write()前要调用
ioctl()来擦除某个块,然后才能写? 请大家帮助,谢谢!

贴上我的一些关键代码:

FILE *fd = open("/dev/mtd6", O_RDWR)
read_len = read(fd, buff, sizeof(buff)-1);

int ret = ioctl(fd, MEMGETBADBLOCK, &offset); /* 擦某个块 */
write_len = write(buff, 1024/*sizeof(buff)-1*/, fd); /* 写入1K 数据 */

[ 本帖最后由 wenxy 于 2009-4-17 11:27 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-04-17 11:25 |只看该作者
直接调用write()写入时,会出错,出错码:errno=9,
#define EBADF            9      /* Bad file number */

论坛徽章:
5
3 [报告]
发表于 2009-04-17 11:34 |只看该作者
原帖由 wenxy 于 2009/4/17 11:25 发表
是不是在write()前要调用
ioctl()来擦除某个块,然后才能写?


Nor Flash设备是要求在写操作之前,先做擦除。

论坛徽章:
0
4 [报告]
发表于 2009-04-17 11:41 |只看该作者
原帖由 yidou 于 2009-4-17 11:34 发表


Nor Flash设备是要求在写操作之前,先做擦除。

是调用这个语句吗?
int ret = ioctl(fd, MEMGETBADBLOCK, &offset); /* 擦某个块 */

版主,有没有可以参考的代码,谢谢!

论坛徽章:
0
5 [报告]
发表于 2009-04-17 12:04 |只看该作者
代码省略.

[ 本帖最后由 wenxy 于 2009-4-17 20:14 编辑 ]

评分

参与人数 1可用积分 +15 收起 理由
yidou + 15 精品文章

查看全部评分

论坛徽章:
0
6 [报告]
发表于 2009-04-17 12:18 |只看该作者
贴点代码,造福民众。

论坛徽章:
0
7 [报告]
发表于 2009-04-17 14:59 |只看该作者
调用ioctl(fd, MEMGETINFO, &mtdInfo);不成功,errno=25,这是为什么?

论坛徽章:
0
8 [报告]
发表于 2010-03-07 16:48 |只看该作者
1.不论是nor还是nand flash,都是要在写之前,确保已经被擦除。
所以,写之前,要调用MEMERASE去擦除。

2.“调用ioctl(fd, MEMGETINFO, &mtdInfo);不成功,errno=25,这是为什么?”
不成功,去查看内核源码:
drivers\mtd\mtdchar.c
static int mtd_ioctl(struct inode *inode, struct file *file,
                     u_int cmd, u_long arg)
{

switch (cmd) {
...
        case MEMGETINFO:
                info.type        = mtd->type;
                info.flags        = mtd->flags;
                info.size        = mtd->size;
                info.erasesize        = mtd->erasesize;
                info.writesize        = mtd->writesize;
                info.oobsize        = mtd->oobsize;
                /* The below fields are obsolete */
                info.ecctype        = -1;
                info.eccsize        = 0;
                if (copy_to_user(argp, &info, sizeof(struct mtd_info_user)))
                        return -EFAULT;
                break;
...

        default:
                ret = -ENOTTY;
}
...
}

其中,ENOTTY(25)就是你的error,之所以出现这样的错误,那就是说明函数执行到了
default,而不是你传入的MEMGETINFO,推断出来,估计是你C文件里面,没有正确包含对应内核所用的mtd的头文件。
而MEMGETINFO等等这些宏对应的头文件,定义在:
include\mtd\mtd-abi.h中,所以,
因此,去检查你的c文件,正确包含了正确的mtd-abi.h,应该就可以了。

论坛徽章:
0
9 [报告]
发表于 2010-03-08 09:14 |只看该作者
int dev_fd;
    int result;
    erase_info_t erase;
    mtd_info_t mtd;


    dev_fd = open ("/dev/mtd6", O_SYNC | O_RDWR);
    if(dev_fd < 0)
    {
      
        return -1;
    }


    if (ioctl (dev_fd, MEMGETINFO, &mtd) < 0)
    {
          return -1;
    }

      
          erase.start = 0;
          erase.length = mtd.size;          
  
   
   
    if (ioctl (dev_fd, MEMERASE, &erase) < 0)
    {
      
          return -1;
    }

论坛徽章:
0
10 [报告]
发表于 2011-05-31 12:49 |只看该作者
回复 1# wenxy


    请问你直接读写flash的应用程序怎么写的?紧急求助。谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP