This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:Linux
我必须从运行的 Linux 系统中将新的 Linux 内核更新(写入)到 NAND-Flash 分区。
要写入 NAND-Flash 的分区2、我使用带有选项"-p"的程序"nandwrite":
nandwrite /dev/mtd -p
但之后、我的电路板无法启动;引导加载程序"u-boot"抱怨加载内核时出现 CRC 错误。
我将在引导加载程序和 Linux 内核中对 NAND-Flash 使用"4位 HW ECC 校正"。
对于引导加载程序"u-boot"、定义了:
#undef CONFIG_SYS_NAND_HW_ECC
#define CONFIG_SYS_NAND_4BIT_HW_ECC_OOBFIRST
#define CONFIG_SYS_NAND_USE_FLASH_BBT
对于 Linux 内核(在特定于电路板的文件中)、定义如下:
静态结构 Davinci_aemif_timing gins_qmonixx_nand_timing ={
//以纳秒为单位的所有时序
.wsetup = 10、
.wstrobe = 20、
whold = 0、
.rsetup=10、
.rstrobe = 20、
.rhold = 20、//要实现可靠的16位 NAND 操作、必须将 R_hold 设置为1、以确保 ECC 计算的2个时钟周期
.TA = 60、
};
静态结构 Davinci_nand_pdata gins_qmonixx_nand_pdata ={
.parts = gins_qmonixx_nand_parts、
nr_parts = array_size (gins_qmonixx_nand_parts)、
.options = NAND_BUSWIDTH_16、
.timing =&gins_qmonixx_nand_timing、
// ECC 配置
//另请参见 U-Boot 的配置:CONFIG_SYS_NAND_4BIT_HW_ECC_OOBFIRST、CONFIG_SYS_NAND_USE_FLASH_BBT
ecc_mode = NAND_ECC_HW、 //此处不要使用 NAND_ECC_HW_OOB_FIRST!
ecc_bits = 4、
.bBT_options = NAND_BBT_USE_FLASH、
};
问题可能出在哪呢?
备注:
如果我在引导加载程序"u-boot"的帮助下将 Linux 内核写入 NAND 闪存、则系统会成功启动!
提前感谢您的帮助!
Jan-Marc。
Yordan、您好!
感谢您的快速回答;但这对我没有什么帮助。
我已经在引导加载程序"u-boot"和 Linux 内核中仔细检查了 EMIF CS3上 NAND-Flash 的初始化:
-时序设置(此处为 EMIF 寄存器"A2CR"、分别为"CE3CFG")
-"drivers/MTD/nand/Davinci_nand.c"中 ECC 模式的设置
我还注意到以下情况:
"要实现可靠的16位 NAND 操作、必须将 R_HOLD 设置为1、以确保 ECC 计算的2个时钟周期!"
我在源代码中插入了消息、并在 Linux 内核启动期间获得了以下内容:
(笑声)
EMIFA CS3、A2CR = 0x0010009d
SS = 0
EW = 0
W_SETUP = 0
W_STROBE = 1
W_HOLD = 0
R_Setup = 0
R_STROBE = 1
R_HOLD = 1
TA = 3.
ASIZE = 1
(笑声)
NAND:找到器件、制造商 ID:0x2C、芯片 ID:0xcc
NAND:Micron MT29F4G16ABADAM4
NAND:512 MIB、SLC、擦除大小:128 KiB、页大小:2048、OOB 大小:64
Davinci_n 和 Davinci_nand.1:chip.ecc.mode = NAND_ECC_HW_OOB_FIRST
Davinci_n 和 Davinci_nand.1:chip.ecc.strength = 4位
Davinci_n 和 Davinci_nand.1:chip.ecc.size = 512
Davinci_n 和 Davinci_nand.1:chip.ecc.bytes = 10
Davinci_n 和 Davinci_nand.1:chip.ecc.layout.eccbytes = 40
Davinci_n 和 Davinci_nand.1:chip.ecc.layout.eccpos = 24、...、63
Davinci_n 和 Davinci_nand.1:chip.ecc.layout.oobavail = 0
(笑声)
我还使用了"MTD-utils"中的测试程序(例如"nandbiterrs"或"nandpagetest"或"flash_readtest")。
我始终收到错误消息;例如:
root@qmonixx:~#/usr/libexec/mtd-utils/flash_readtest /dev/mtd0
读取测试页
libmdd:错误!:无法将64个 OOB 字节写入地址512 (OOB 偏移量512)- mtd0 OOB 大小仅为64字节
读取块0第1页中的 OOB 时出错
我敦促大家提供帮助。
如果有任何提示、我将不胜感激!
此致、
Jan-Marc。