无网不进  
软硬件开发

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

原创 2015年11月12日 16:27:14

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

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

一般是三个原因:

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

②DDR3某芯片异常。

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

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

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

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

GEL文件部分代码如下:

[javascript] view plain copy
 
  1. if(DDR3)   
  2. {   
  3. /* Setup a small refresh period */  
  4. WR_MEM_32(EMIF4_0_SDRAM_REF_CTRL, 0x0000613B); // Initially a large refresh period  
  5. WR_MEM_32(EMIF4_0_SDRAM_REF_CTRL, 0x1000613B); // Trigger initialization  
  6. WR_MEM_32(EMIF4_0_SDRAM_REF_CTRL, (0x10000000|SDREF)); // Move to a smaller more correct one  
  7.   
  8. if(TWO_EMIF)  
  9. {  
  10. GEL_TextOut("\tInitializing EMIF1 ..... \n","Output",1,1,1);  
  11. /* Setup a small refresh period */  
  12. WR_MEM_32(EMIF4_1_SDRAM_REF_CTRL, 0x0000613B); // Initially a large refresh period  
  13. WR_MEM_32(EMIF4_1_SDRAM_REF_CTRL, 0x1000613B); // Trigger initialization  
  14. WR_MEM_32(EMIF4_1_SDRAM_REF_CTRL, (0x10000000|SDREF)); // Move to a smaller more correct one  
  15. }  
  16. }  

 

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

将这段代码修改为

 

[javascript] view plain copy
 
  1. if(DDR3)   
  2. {   
  3. /* Setup a small refresh period */  
  4. WR_MEM_32(EMIF4_1_SDRAM_REF_CTRL, 0x0000613B); // Initially a large refresh period  
  5. WR_MEM_32(EMIF4_1_SDRAM_REF_CTRL, 0x1000613B); // Trigger initialization  
  6. WR_MEM_32(EMIF4_1_SDRAM_REF_CTRL, (0x10000000|SDREF)); // Move to a smaller more correct one  
  7.   
  8. if(TWO_EMIF)  
  9. {  
  10. GEL_TextOut("\tInitializing EMIF1 ..... \n","Output",1,1,1);  
  11. /* Setup a small refresh period */  
  12. WR_MEM_32(EMIF4_1_SDRAM_REF_CTRL, 0x0000613B); // Initially a large refresh period  
  13. WR_MEM_32(EMIF4_1_SDRAM_REF_CTRL, 0x1000613B); // Trigger initialization  
  14. WR_MEM_32(EMIF4_1_SDRAM_REF_CTRL, (0x10000000|SDREF)); // Move to a smaller more correct one  
  15. }  
  16. }  
既可正常通过。这段代码将EMIF0忽略掉能通过,因此EMIF0异常,EMIF1正常。

 

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

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

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

即,该值为0x80500200。

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

 

[javascript] view plain copy
 
  1. WR_MEM_32(DMM_LISA_MAP__0, 0x80640300);  
  2. WR_MEM_32(DMM_LISA_MAP__1, 0xC0640320);  
  3. WR_MEM_32(DMM_LISA_MAP__2, 0x80640300);  
  4. WR_MEM_32(DMM_LISA_MAP__3, 0xC0640320);  
修改为

 

 

[javascript] view plain copy
 
  1. WR_MEM_32(DMM_LISA_MAP__0, 0x80500200);  
  2. WR_MEM_32(DMM_LISA_MAP__1, 0xC0500220);  
  3. WR_MEM_32(DMM_LISA_MAP__2, 0x80500200);  
  4. WR_MEM_32(DMM_LISA_MAP__3, 0xC0500220);  
在U-boot中修改board/ti/ti8168/evm.c:

 

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

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

posted on 2018-01-10 13:50  无网不进  阅读(300)  评论(0)    收藏  举报