工具/软件:Linux
I 所有、
我们通过电路板上的 GPMC 总线对 FPGA 进行了集成、现在 GPMC 总线上有两个器件:
CS0:NAND 闪存
2.CS3:FPGA
我们
我们需要为 CS3正确配置 GPMC 寄存器、我的配置为:
void GPMC_FPGA_init (void)
{
/*对 FPGA 执行 GPMC 配置。 *
GPMC_cs_write_reg (3、GPMC_CS_CONFIG7、0);/C3禁用
//猝发读取、单次写入
GPMC_cs_write_reg (3、GPMC_CS_config1、0x69001001);
GPMC_cs_write_reg (3、GPMC_CS_CONFIG2、0x00030701);
GPMC_cs_write_reg (3、GPMC_CS_CONFIG3、0);
GPMC_cs_write_reg (3、GPMC_CS_CONFIG4、0x03010684);
GPMC_cs_write_reg (3、GPMC_CS_CONFIG5、0x02060408);
GPMC_cs_write_reg (3、GPMC_CS_CONFIG6、0x03000200);
GPMC_cs_write_reg (3、GPMC_CS_CONFIG7、((12 << 8)|((0x4000000 >> 24)& 0x3F)|(1 << 6)));
GPMC_cs_write_reg (1、GPMC_CS_CONFIG7、0);
GPMC_cs_write_reg (2、GPMC_CS_CONFIG7、0);
GPMC_cs_write_reg (4、GPMC_CS_CONFIG7、0);
GPMC_cs_write_reg (5、GPMC_CS_CONFIG7、0);
GPMC_cs_write_reg (6、GPMC_CS_CONFIG7、0);
GPMC_WRITE_REG (GPMC_CONFIG、GPMC_READ_REG (GPMC_CONFIG)&~(0x2));
}
现在、我可以操作 FPGA 和 NAND 闪存、但在 FPGA 和 NAND 闪存协同工作时、我发现了一些有趣的事情:
步骤1: 加载 FPGA 固件。
步骤2:读取 FPGA 版本寄存器:__raW_readw (FPGA_BASE + 0x6);
步骤3:nandtest /dev/mtd0
然后、步骤3将失败:
[root@Ronds:~]# nandtest /dev/mtd0
ECC 校正:0
ECC 故障 :128
坏块 :0
BBT 块 :0
00000000:读取(第1页、共4页)...[53.863347] OMAP2-nand 8000000.nand:找到不可纠正的位翻转
[53.871043] OMAP2-nand 8000000.nand:找到不可纠正的位翻转
[53.877252] OMAP2-nand 8000000.nand:找到不可纠正的位翻转
…
如果我跳过步骤1、步骤3不会失败、这意味着 如果 FPGA 正常工作、它 将影响 nand flash...
为了进一步调试、我找到了一个针对这个问题的 WA、如下所示:
步骤1: 加载 FPGA 固件。
步骤2:读取 FPGA 版本寄存器:__raW_readw (FPGA_BASE + 0x6);
步骤3:devmem 0x50000114 ->读取 GPMC_NAND_DATA_3寄存器
步骤4:nandtest /dev/mtd0
这次、nandtest 将正常运行、不会失败...
我将此 WA 添加到 nand controllers 驱动程序(drivers/MTD/nand/OMAP2.c):
void GPMC_wr_for_nand_FPGA (void)
{
GPMC_cs_read_reg (3、GPMC_CS_NAND_DATA);
}
静态空__MAL_UNDESTING_OMAP-ENABLE_hwecc_BCH (struct MTD_info *MTD,int 模式)
{
…
GPMC_wr_for_nand_FPGA ();
用于计算 ECC 的/* GPMC 配置*/
开关(ECC_OPT){
…
}
FPGA 和 NAND 闪存可以很好地协同工作。
我的问题是、为什么我需要在 nand ECC 之前对 GPMC_NAND_DATA_3寄存器(必须是该寄存器、不能是其他寄存器)执行虚拟读取、否则 nand ECC 将报告错误?????
谢谢!