我正在开发一个嵌入式 Linux 系统 (5.10.24),其中有一个 NAND FLASH 作为存储。
NAND FLASH分为4个部分,part 0用于u-boot,part 1用于kernel,part 2用作UBIFS,part 3是另一个UBIFS分区。
所以当 Linux 启动时,它显示有/dev/mtd0, /dev/mtd1, /dev/mtd2, /dev/mtd3
.
现在我可以通过 POSIX-C 文件操作从(原始闪存,无文件系统)读取 u-boot 数据/dev/mtd0
。
然后我想通过写入/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写入数据?
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
等等。