本文介绍了写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块设备上的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!