在mtd块设备上写入

我正在尝试使用MTD块设备写入NAND闪存,但我不明白所有的东西。

当我在这里读到

  • mtdblockN是只读块设备N
  • mtdN是读/写字符设备N
  • mtdNro是只读字符设备N

但我想直接写入字节到分区使用简单的write在C中,我不明白它是如何工作的(我读了一些我首先必须擦除我想写的部门)。

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

Solutions Collecting From Web of "在mtd块设备上写入"

从内存技术设备读写数据与其他类型的IO没有什么不同,除了在写之前需要擦除扇区(擦除块)

为了简化你自己,你可以使用mtd-utils(例如nanddumpnanddumpnandwrite ,分别用于擦除,读取和写入),而不需要编写代码。

但是,如果你确实想实际做到这一点,下面是一个例子,确保阅读所有的评论,因为我把所有的细节放在那里:

 #include <stdio.h> #include <fcntl.h> #include <sys/ioctl.h> #include <mtd/mtd-user.h> int main() { mtd_info_t mtd_info; // the MTD structure erase_info_t ei; // the erase block structure int i; unsigned char data[20] = { 0xDE, 0xAD, 0xBE, 0xEF, // our data to write 0xDE, 0xAD, 0xBE, 0xEF, 0xDE, 0xAD, 0xBE, 0xEF, 0xDE, 0xAD, 0xBE, 0xEF, 0xDE, 0xAD, 0xBE, 0xEF}; unsigned char read_buf[20] = {0x00}; // empty array for reading int fd = open("/dev/mtd0", O_RDWR); // open the mtd device for reading and // writing. Note you want mtd0 not mtdblock0 // also you probably need to open permissions // to the dev (sudo chmod 777 /dev/mtd0) ioctl(fd, MEMGETINFO, &mtd_info); // get the device info // dump it for a sanity check, should match what's in /proc/mtd printf("MTD Type: %x\nMTD total size: %x bytes\nMTD erase size: %x bytes\n", mtd_info.type, mtd_info.size, mtd_info.erasesize); ei.length = mtd_info.erasesize; //set the erase block size for(ei.start = 0; ei.start < mtd_info.size; ei.start += ei.length) { ioctl(fd, MEMUNLOCK, &ei); // printf("Eraseing Block %#x\n", ei.start); // show the blocks erasing // warning, this prints a lot! ioctl(fd, MEMERASE, &ei); } lseek(fd, 0, SEEK_SET); // go to the first block read(fd, read_buf, sizeof(read_buf)); // read 20 bytes // sanity check, should be all 0xFF if erase worked for(i = 0; i<20; i++) printf("buf[%d] = 0x%02x\n", i, (unsigned int)read_buf[i]); lseek(fd, 0, SEEK_SET); // go back to first block's start write(fd, data, sizeof(data)); // write our message lseek(fd, 0, SEEK_SET); // go back to first block's start read(fd, read_buf, sizeof(read_buf));// read the data // sanity check, now you see the message we wrote! for(i = 0; i<20; i++) printf("buf[%d] = 0x%02x\n", i, (unsigned int)read_buf[i]); close(fd); return 0; } 

这样做的好处在于,您可以像使用其他设备一样使用标准utils,因此可以轻松理解write()open()read()作用以及对它们的期望。

例如,如果在使用write()得到了一个EINVAL的值,这可能意味着:

fd附在不适合写作的对象上; 或者使用O_DIRECT标志打开文件,并且buf中指定的地址,count中指定的值或当前文件偏移量不适当对齐。