![Linux下如何通过/dev/mtd0向raw NAND FLASH写入数据?](https://linux22.com/image/219378/Linux%E4%B8%8B%E5%A6%82%E4%BD%95%E9%80%9A%E8%BF%87%2Fdev%2Fmtd0%E5%90%91raw%20NAND%20FLASH%E5%86%99%E5%85%A5%E6%95%B0%E6%8D%AE%EF%BC%9F.png)
我正在开发一个嵌入式Linux系统(5.10.24),其中有一个NAND FLASH作为存储。
NAND FLASH分为4部分,部分0用于u-boot,部分1用于内核,部分2用作UBIFS,部分3是另一个UBIFS分区。
所以当Linux启动时,它会显示有/dev/mtd0, /dev/mtd1, /dev/mtd2, /dev/mtd3
.
现在我可以/dev/mtd0
通过 POSIX-C 文件操作从(原始闪存,无文件系统)读取 u-boot 的数据。
然后我想通过写入保存一些数据到NAND FLASH分区0 /dev/mtd0
。
所有文件读写操作均正常,未报错。
但是当我将系统重新启动回 u-boot 时,它抱怨有很多错误,例如spi nand read oob error ,ret= -74 , oob addr e0000, ooboffs 0, ooblen 64
.
好像是NAND OOB出了问题,为什么会出现这个错误,如何通过/dev/mtd
接口向raw NAND FLASH写入数据呢?
答案1
NAND 闪存在写入之前需要先擦除(按块)。有ioctl
一些事情可以做到这一点。mtd-utils
是在 Linux 中使用诸如 之类的实用程序与 mtd 卷进行交互的首选工具集flashcp
,但它也是获取有关如何在低级别上自行操作的信息的一个很好的切入点,请参阅http://www.linux-mtd.infradead.org/doc/general.html
也就是说,从 U-Boot 内与 mtd 卷交互的更常见方法是将其用作 U-Boot 环境的存储。不要直接写入 mtd 卷,而是执行一些操作setenv
并将saveenv
其写入 NAND(包括所有校验和)。从 Linux 上,您可以使用fw_printenv
等等。