我正在尝试将数据写入 MTD 设备,如下主题:在 mtd 块设备上写入
但是当我使用
/dev/mtd0
时,我只是读取正确的第一个字节,另一个字节仍然是0xFF,例如:
MTD Type: 3
MTD total size: 200000 bytes
MTD erase size: 1000 bytes
buf[0] = 0xde
buf[1] = 0xff
buf[2] = 0xff
buf[3] = 0xff
...
buf[18] = 0xff
buf[19] = 0xff
当我使用
/dev/mtdblock0
时,这工作正常。
MTD Type: 10
MTD total size: befcfb60 bytes
MTD erase size: 0 bytes
buf[0] = 0xde
buf[1] = 0xad
buf[2] = 0xbe
buf[3] = 0xef
...
buf[18] = 0xbe
buf[19] = 0xef
此外,当我通过
hexdump /dev/mtd0 -n64 -C
和hexdump /dev/mtdblock0 -n64 -C
检查Flash内容时,两者的内容是相同的。
最终目的是使用 /dev/mtd0 而不是 mtdblock,请帮助我
我经过研究并意识到这个问题是由于我的闪存设备导致的
flash: flash@0 {
compatible = "sst,sst25vf016b", "jedec,spi-nor";
spi-max-frequency = <50000000>;
};
我看到对 SST25VF016B 执行多字节写入会失败。 要修复它,我们可以将应用程序从写入多字节修复为写入每个字节,如下所示:
lseek(fd, 0x150000, SEEK_SET);
for (i = 0; i < 32; i++)
result = write(fd, writedata[i], sizeof(writedata[i]));
或者我们可以使用参考补丁修复内核:https://lore.kernel.org/lkml/[email protected]/T/