本文介绍了写MTD块设备上的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图使用MTD块设备NAND快闪存储器写,但我不明白的一切。

当我读这里


  • mtdblockN 是只读块元件N

  • mtdN 是读/写字符元件N

  • mtdNro 是只读的char元件N

不过,我想用一个简单的直接写入字节为分区 C和我不明白它是如何工作(我读somewhre,我第一次必须抹去我想写上)部门。

我应该使用哪种设备以及如何在此设备上写的?


解决方案

读写自/至内存技术设备是不是真的比任何其他类型的IO的不同,不同之处在于你写之前,你需要擦除扇区(擦除块)

为了让事情对自己简单,你总是可以只使用MTD-utils的(如 flash_erase nanddump nandwrite ,擦除,读取,而不需要写入code分别写)。

不过,如果你想以务实的态度去做,这里是一个例子,请务必阅读所有的意见,因为我把所有的细节有:

 的#include<&stdio.h中GT;
#包括LT&;&fcntl.h GT;
#包括LT&; SYS / ioctl.h>
#包括LT&; MTD / MTD-user.h>诠释的main()
{
    mtd_info_t mtd_info; // MTD的结构
    erase_info_t EI; //擦除块结构
    INT I;    unsigned char型数据[20] = {写0xDE,写入0xAD,0xBE,0xEF,//我们的数据写
                               写0xDE,写入0xAD,0xBE,0xEF,
                               写0xDE,写入0xAD,0xBE,0xEF,
                               写0xDE,写入0xAD,0xBE,0xEF,
                               写0xDE,写入0xAD,0xBE,0xEF};
    unsigned char型read_buf [20] = {0×00}; //空数组阅读    INT FD =打开(/开发/ mtd0,O_RDWR); //打开MTD设备进行读取和
                                        // 写作。注意:您要mtd0不mtdblock0
                                        //还您可能需要打开权限
                                        //为开发(须藤搭配chmod 777的/ dev / mtd0)    的ioctl(FD,MEMGETINFO,&安培; mtd_info); //获取设备信息    //倾倒了全面的检查,应符合什么是在/ proc / MTD
    的printf(MTD类型:%X \\ nMTD总大小:%X字节\\ nMTD抹掉大小:%X字节\\ n
         mtd_info.type,mtd_info.size,mtd_info.erasesize);    ei.length = mtd_info.erasesize; //设置擦除块大小
    对于(ei.start = 0; ei.start< mtd_info.size; ei.start + = ei.length)
    {
        的ioctl(FD,MEMUNLOCK,&安培; EI);
        //输出(Eraseing程序段%#x的\\ n,ei.start); //显示擦除块
                                                  //警告,这种打印了很多!
        的ioctl(FD,MEMERASE,&安培; EI);
    }    lseek的(FD,0,SEEK_SET); //去的第一个块
    阅读(FD,read_buf,sizeof的(read_buf)); //读取20个字节    //完整性检查,应全部为0xFF如果擦除工作
    对于(i = 0; I< 20;我++)
        的printf(BUF [%d个=为0x%02X \\ n,我,(无符号整数)read_buf [I]);    lseek的(FD,0,SEEK_SET); //返回第一个块的开始
    写(FD,数据的sizeof(数据)); //写我们的消息    lseek的(FD,0,SEEK_SET); //返回第一个块的开始
    读(FD,read_buf,sizeof的(read_buf)); //读取的数据    //完整性检查,现在你看我们写的留言!
    对于(i = 0; I< 20;我++)
         的printf(BUF [%d个=为0x%02X \\ n,我,(无符号整数)read_buf [I]);
    关闭(FD);
    返回0;
}

关于这样做的好处是,因为当你从其他设备你可以使用标准utils的,它可以很容易地理解的,的和的做的,从他们的期望。

例如,如果在使用的write()你有 EINVAL 的值,这可能意味着:

这篇关于写MTD块设备上的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-25 20:29