[DM8168] EVM816x DDR2/3 PRCM Init is Done(DMM_LISA_MAP 修改 EMIF 映射)

DM8168样板制作过程,CCS测试DDR3时,GEL加载不通过:

遇到EVM816x DDR2/3 PRCM Init is Done .....卡住的问题。

一般是三个原因:

①fly-by结构的地址时钟命令线焊接不良。

②DDR3某芯片异常。

③时序参数改变,而寄存器并没有被正确配置。

①③情况还好解决,碰到②可以通过修改EMIF映射的方式回避损坏的DDR3芯片。

比如现成的案例是EMIF0异常,EMIF1正常,那么就可以只使用EMIF1。

EMIF0异常、EMIF1正常是怎么判断的呢?

GEL文件部分代码如下:

if(DDR3) 
{ 
/* Setup a small refresh period */
WR_MEM_32(EMIF4_0_SDRAM_REF_CTRL, 0x0000613B); // Initially a large refresh period
WR_MEM_32(EMIF4_0_SDRAM_REF_CTRL, 0x1000613B); // Trigger initialization
WR_MEM_32(EMIF4_0_SDRAM_REF_CTRL, (0x10000000|SDREF)); // Move to a smaller more correct one

if(TWO_EMIF)
{
GEL_TextOut("\tInitializing EMIF1 ..... \n","Output",1,1,1);
/* Setup a small refresh period */
WR_MEM_32(EMIF4_1_SDRAM_REF_CTRL, 0x0000613B); // Initially a large refresh period
WR_MEM_32(EMIF4_1_SDRAM_REF_CTRL, 0x1000613B); // Trigger initialization
WR_MEM_32(EMIF4_1_SDRAM_REF_CTRL, (0x10000000|SDREF)); // Move to a smaller more correct one
}
}

不修改代码时,GEL文件初始化异常,停在EVM816x DDR2/3 PRCM Init is Done .....

将这段代码修改为

if(DDR3) 
{ 
/* Setup a small refresh period */
WR_MEM_32(EMIF4_1_SDRAM_REF_CTRL, 0x0000613B); // Initially a large refresh period
WR_MEM_32(EMIF4_1_SDRAM_REF_CTRL, 0x1000613B); // Trigger initialization
WR_MEM_32(EMIF4_1_SDRAM_REF_CTRL, (0x10000000|SDREF)); // Move to a smaller more correct one

if(TWO_EMIF)
{
GEL_TextOut("\tInitializing EMIF1 ..... \n","Output",1,1,1);
/* Setup a small refresh period */
WR_MEM_32(EMIF4_1_SDRAM_REF_CTRL, 0x0000613B); // Initially a large refresh period
WR_MEM_32(EMIF4_1_SDRAM_REF_CTRL, 0x1000613B); // Trigger initialization
WR_MEM_32(EMIF4_1_SDRAM_REF_CTRL, (0x10000000|SDREF)); // Move to a smaller more correct one
}
}
既可正常通过。这段代码将EMIF0忽略掉能通过,因此EMIF0异常,EMIF1正常。

那么可以采用只使用EMIF1的方法来暂时挽救这块板,从而启动linux。

修改映射方法:修改DMM_LISA_MAP寄存器,系统默认该寄存器的值为0x80640300

[DM8168] EVM816x DDR2/3 PRCM Init is Done(DMM_LISA_MAP 修改 EMIF 映射)_第1张图片

现我们将DMM_LISA_MAP设置为512MB section,No interleaving,Mapped on SDRC 1 only(not interleaved)

即,该值为0x80500200。

因此,在GEL中,将相应代码段修改为以下内容,EMIF1就成了从0x80000000开始的连续内存:

  WR_MEM_32(DMM_LISA_MAP__0, 0x80640300);
  WR_MEM_32(DMM_LISA_MAP__1, 0xC0640320);
  WR_MEM_32(DMM_LISA_MAP__2, 0x80640300);
  WR_MEM_32(DMM_LISA_MAP__3, 0xC0640320);
修改为

  WR_MEM_32(DMM_LISA_MAP__0, 0x80500200);
  WR_MEM_32(DMM_LISA_MAP__1, 0xC0500220);
  WR_MEM_32(DMM_LISA_MAP__2, 0x80500200);
  WR_MEM_32(DMM_LISA_MAP__3, 0xC0500220);
在U-boot中修改board/ti/ti8168/evm.c:

即可在EMIF0异常的情况下,启动操作系统。

evm.c修改内容大致为,屏蔽EMIF0的初始化,修改DMM_LISA_MAP参数。修改详情:evm.c

你可能感兴趣的:(DDR3,dm8168,DMM_LISA_MAP)