UBOOT之DDR2内存移植相关修改简记

原文地址:http://blog.csdn.net/lightsoure/archive/2010/09/22/5900500.aspx

环境:S5PC100+android(UBOOT 1.3.4)

DDR2 256MB 

由于DDR2相对于mobile ddR的低功耗优势,加上产品本身对功耗要求较高,所以需要使用DD2代替MOBILE DDR;

从/board/samsung/smdkc100下的UBOOT链表u-boot.LDS

 

  1. .text      :  
  2. {  
  3.   cpu/s5pc1xx/start.o (.text)  
  4.   cpu/s5pc1xx/s5pc100/cpu_init.o (.text)  
  5.   board/samsung/smdkc100/lowlevel_init.o (.text)  
  6.          cpu/s5pc1xx/onenand_cp.o      (.text)                   
  7.          cpu/s5pc1xx/nand_cp.o (.text)                       
  8.          cpu/s5pc1xx/movi.o (.text)   
  9.   *(.text)  
  10. }  

 

可以知道UBOOT整个工作流程,很清晰。我们要做的应该是修改内存部分相关配置;

从START.S中

 /*
  * Go setup Memory and board specific bits prior to relocation.
  */

 ldr sp, =0xd0036000 /* end of sram dedicated to u-boot */
 sub sp, sp, #12 /* set stack */
 mov fp, #0
 
 bl lowlevel_init /* go setup pll,mux,memory */

以及lowlevel_init .S中

/* when we already run in ram, we don't need to relocate U-Boot.
  * and actually, memory controller must be configured before U-Boot
  * is running in ram.
  */
 ldr r0, =0xff000fff
 bic r1, pc, r0  /* r0 <- current base addr of code */
 ldr r2, _TEXT_BASE  /* r1 <- original base addr in ram */
 bic r2, r2, r0  /* r0 <- current base addr of code */
 cmp     r1, r2                  /* compare r0, r1                  */
 beq     1f   /* r0 == r1 then skip sdram init   */

 /* init system clock */
 bl system_clock_init
 
 bl mem_ctrl_asm_init知道内存相关配置在CPU_INIT.S中,好吧,不罗嗦了。直接贴上配置:

 

step1:

 

  1. /************ DLL initialization *************/  
  2.         
  3.        // ldr     r1, =0x6A101000               @ Phycontrol0 DLL parameter setting  
  4. ldr     r1, =0x50101008                         //added by S  
  5.         str     r1, [r0, #DMC_PHYCONTROL0]  
  6.   
  7.         
  8. //ldr     r1, =0x000000F4                         //added by S  
  9. ldr     r1, =0x000000F6                        //added by S the last bit is 6 for ddr21  
  10.   
  11.         str     r1, [r0, #DMC_PHYCONTROL1]  
  12.   
  13.       //  ldr     r1, =0x00000000                            @Phycontrol2 DLL parameter setting  
  14. ldr     r1, =0x00000000                         //added by S  
  15.         str     r1, [r0, #DMC_PHYCONTROL2]  
  16.   
  17.      //  ldr     r1, =0x6A101002                      @DLL on  
  18. ldr     r1, =0x5010100a                         //added by S  
  19.   
  20.         str     r1, [r0, #DMC_PHYCONTROL0]  
  21.   
  22.       //  ldr     r1, =0x6A101003               @Dll start  
  23. ldr     r1, =0x5010100b                         //added by S  
  24.   
  25.         str     r1, [r0, #DMC_PHYCONTROL0]  
  26.   
  27.   
  28.   
  29.     ldr r2, = 0xE6000040        @DMC_PHYSTATUS0  
  30.   
  31. loop1:  
  32.   
  33.     ldr r1, [r2]                @Check DLL lock  
  34.     ands    r1, r1, #4  
  35.     beq loop1  
  36.   
  37.     ldr r1, [r2]  
  38.     mov r1, r1,  LSR #(0x6)  
  39.     and r1, r1, #(0xff)  
  40.     mov r1, r1, LSL  #(0x18)  
  41.         ldr     r2,  = 0xE6000018           @DMC_PHYCONTROL0  
  42.     ldr r3, [r2]  
  43.     bic r3,  r3, #(0xff000000)  
  44.     orr r1, r3, r2  
  45.     str r1, [r2]  
  46.   
  47.   
  48.   
  49.        // ldr     r1, =0x6A101003           @Force Value locking  
  50. ldr     r1, =0x5010100b                         //added by S  
  51.         str     r1, [r0, #DMC_PHYCONTROL0]  
  52.   
  53.        // ldr     r1, =0x6A101009           @Dll off  
  54. ldr     r1, =0x50101009                         //added by S  
  55.         str     r1, [r0, #DMC_PHYCONTROL0]  
  56.  
  57.  
  58.  
  59. #if 0  
  60.         ldr     r1, =0x6A101000             @ Phycontrol0 DLL parameter setting  
  61.         str     r1, [r0, #DMC_PHYCONTROL0]  
  62.   
  63.         ldr     r1, =0x00008484                             @Phycontrol1 DLL parameter setting  
  64.         str     r1, [r0, #DMC_PHYCONTROL1]  
  65.   
  66.         ldr     r1, =0x00000000                             @Phycontrol2 DLL parameter setting  
  67.         str     r1, [r0, #DMC_PHYCONTROL2]  
  68.  
  69. #endif  
  70. /************ DLL initialization - END *************/  

 

step1中需要注意的是:对于DDR2,手册上说明PHYCONTROL1后最后3位为0X110;

step2:

 

  1.         //ldr     r1, =0x0FF01010                         @auto refresh off  
  2. ldr     r1, =0x0FF01010                    //added S  
  3.   
  4.         str     r1, [r0, #DMC_CONCONTROL]  
  5.   
  6.   
  7.         //ldr     r1, =0x00102100    
  8. ldr     r1, =0x00212400                     //added by S  
  9.   
  10.         str     r1, [r0, #DMC_MEMCONTROL]  
  11.   
  12.        
  13.   
  14.       
  15. ldr     r1, =0x20f00313                    //1CS 256MB0  
  16.        str     r1, [r0, #DMC_MEMCONFIG0]  
  17.   
  18.   
  19. ldr     r1, =0x40f00313                     //added by S  
  20.       
  21.        str     r1, [r0, #DMC_MEMCONFIG1]  
  22.   
  23.     
  24.         ldr     r1, =0x20000000  
  25.   
  26.           
  27.         str     r1, [r0, #DMC_PRECHCONFIG]  
  28.   
  29.   
  30.     ldr     r1, =0x00100004         @ PwrdnConfig  
  31.         str     r1, [r0, #DMC_PWRDNCONFIG  

 

step2中需要注意的是:对于DDR2 与S5PC100来说 需要注意的是要与实际内存电路设计相关,我是32bit 两片内存并联,所以DDR2 对应一个CS为256MB,所以对于DMC_MEMCONFIG0来说chip_mask为f0;如果这里为f8则出现,UBOOT引导内核后,在内核的内存配置部分死掉等现象;

还有个部分:

对于这里的设置是否真的能影响功耗,这个还有待测试。

step3:

 

  1. /************ Timing Optimization *************/  
  2.   
  3. /************ DDR2_166MHz *************///  
  4.   
  5.   
  6. // 7.8us*166MHz=0x50e  
  7.         ldr     r1, =0x0000050E   
  8.       
  9.         str     r1, [r0, #DMC_TIMINGAREF]  
  10.       
  11. ldr     r1, =0x16233288                           //added bu S  
  12.         str     r1, [r0, #DMC_TIMINGROW]  
  13.   
  14.           
  15.   
  16.  ldr     r1, =0x23250304                    @Timing Data   //added bu S  
  17.         str     r1, [r0, #DMC_TIMINGDATA]  
  18.   
  19. ldr     r1, =0x06c80232                     @ Timing Power  !!!!!!!!!!!!!!!  
  20.         str     r1, [r0, #DMC_TIMINGPOWER]  

 

这部分是要根据你的内存时序来设置的,与其他BOOT内存时序配置类似.

step4:

 

  1. /* Direct Command for LPDDR - *///added by S 2010.9.16   
  2. /* chip0*/  
  3.   
  4.     ldr     r1, =0x07000000                    @chip0 Deselect  
  5.         str     r1, [r0, #DMC_DIRECTCMD]  
  6.   
  7.         ldr     r1, =0x01000000                        @chip0 PALL  
  8.         str     r1, [r0, #DMC_DIRECTCMD]  
  9.   
  10.         ldr     r1, =0x00020000                        @ chip0 EMRS2  
  11.         str     r1, [r0, #DMC_DIRECTCMD]  
  12.   
  13.         ldr     r1, =0x00030000                        @ chip0 EMRS3  
  14.         str     r1, [r0, #DMC_DIRECTCMD]  
  15.   
  16.         ldr     r1, =0x00010400                       @ EMRS1 (MEM DLL on, DQS# disable)  
  17.         str     r1, [r0, #DMC_DIRECTCMD]  
  18.   
  19.   
  20.         ldr     r1, =0x00000552                        @ chip0 MRS (MEM DLL reset)  
  21.         str     r1, [r0, #DMC_DIRECTCMD]  
  22.   
  23.         ldr     r1, =0x01000000                        @ chip0 chip0 PALL  
  24.         str     r1, [r0, #DMC_DIRECTCMD]  
  25.   
  26.         ldr     r1, =0x05000000                       @ chip0 chip0 REFA  
  27.         str     r1, [r0, #DMC_DIRECTCMD]  
  28.   
  29.           
  30.         ldr     r1, =0x05000000                       @ chip0 chip0 REFA  
  31.         str     r1, [r0, #DMC_DIRECTCMD]  
  32.   
  33.           
  34.        ldr     r1, =0x00000452                       @ chip0 MRS (MEM DLL unreset), BL=4,CL=5  
  35.         str     r1, [r0, #DMC_DIRECTCMD]  
  36.   
  37.        ldr     r1, =0x00010780                      @ chip0 EMRS1 (OCD default)  
  38.         str     r1, [r0, #DMC_DIRECTCMD]  
  39.   
  40.           
  41.       ldr     r1, =0x00010400                     @ chip0 EMRS1 (OCD exit)  
  42.         str     r1, [r0, #DMC_DIRECTCMD]  
  43. /* chip1*/  
  44. ldr r1, =0x07100000             @DirectCmd  chip1 Deselect  
  45.     str r1, [r0, #DMC_DIRECTCMD]  
  46.   
  47.     ldr r1, =0x01100000             @DirectCmd  chip1 PALL  
  48.     str r1, [r0, #DMC_DIRECTCMD]  
  49.   
  50.     ldr r1, =0x00120000             @DirectCmd  chip1 EMRS2  
  51.     str r1, [r0, #DMC_DIRECTCMD]  
  52.   
  53.     ldr r1, =0x00130000             @DirectCmd  chip1 EMRS3  
  54.     str r1, [r0, #DMC_DIRECTCMD]  
  55.   
  56.     ldr r1, =0x00110440             @DirectCmd  chip1 EMRS1 (MEM DLL on, DQS# disable)  
  57.     str r1, [r0, #DMC_DIRECTCMD]  
  58.   
  59.     ldr r1, =0x00100552             @DirectCmd  chip1 MRS (MEM DLL reset) CL=5, BL=4  
  60.     str r1, [r0, #DMC_DIRECTCMD]  
  61.   
  62.     ldr r1, =0x01100000             @DirectCmd  chip1 PALL  
  63.     str r1, [r0, #DMC_DIRECTCMD]  
  64.   
  65.     ldr r1, =0x05100000             @DirectCmd  chip1 REFA  
  66.     str r1, [r0, #DMC_DIRECTCMD]  
  67.   
  68.     ldr r1, =0x05100000             @DirectCmd  chip1 REFA  
  69.     str r1, [r0, #DMC_DIRECTCMD]  
  70.   
  71.     ldr r1, =0x00100452             @DirectCmd  chip1 MRS (MEM DLL unreset)  
  72.     str r1, [r0, #DMC_DIRECTCMD]  
  73.   
  74.     ldr r1, =0x00110780             @DirectCmd  chip1 EMRS1 (OCD default)  
  75.     str r1, [r0, #DMC_DIRECTCMD]  
  76.   
  77.     ldr r1, =0x00110400             @DirectCmd  chip1 EMRS1 (OCD exit)  
  78.     str r1, [r0, #DMC_DIRECTCMD]  
  79. /***************************end**********************************  

 

既然前面用到了两个片选则,对两个片选的配置。

step5: Start the DMC.

 

  1. // [ 5. Start the DMC.]//added by S    
  2.   
  3.       
  4. ldr     r1, =0x0FF020B0                       //change S  @ConControl auto refresh on  
  5.         str     r1, [r0, #DMC_CONCONTROL]  
  6.  
  7. #if 0  
  8.         ldr     r1, =0x001000FF         @ PwrdnConfig  
  9.         str     r1, [r0, #DMC_PWRDNCONFIG]  
  10. #endif  
  11.   
  12.   
  13.   
  14.   
  15. ldr     r1, =0x00212413                  //change S  @ MemControl  
  16.         str     r1, [r0, #DMC_MEMCONTROL]  
  17.   
  18.         b   exit_cpu_init  

 

启动DMC

到这里这个流程基本结束了,因为没用ONENAND 所以着部分不用关注暂时

经过测试UBOOT能正常引导整个内核以及文件系统。

不过有个疑问:


我是8个BANKS,但是我选2个chips没有问题哦暂时,改成0X00貌似也一样。。这里有点晕忽~

留点疑问吧~等后面再侃侃~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值