Open game Samsung A8 S5pc110 --u-boot(zz)

发布于 2022-09-18 11:38:25 字数 24608 浏览 12 评论 0

目录进入:s5pc110-android/uboot/cpu/s5pc1xx/s5pc100$ vim cpu_init.S

#include <config.h>
#include <s5pc100.h>

    .globl mem_ctrl_asm_init
mem_ctrl_asm_init:

    ldr    r0, =APB_DMC_BASE            @APB_DMC_BASE 0xE6000000

    ldr    r1, =PRO_ID_BASE               s5pc110产品信息(产品ID,版本号),在上一篇blog中提到了u-boot的分区说明,当中有一个

efuse这块区域,手册中是这样说的,上电的时候efuse ROM中的值自动装载到硬件寄存器当中,ROM中存有主和次版本号,

软件不能去读寄存器的复位值,也没有必要用软件去改变。

    ldr    r2, [r1, #PRO_ID_OFFSET]
    bic    r2, #0xfffffdff
    mov    r2, r2, lsr #9
    cmp    r2, #0x1
    beq    onenand_pop

single:

/************ delay loop *************/

#if 0
    ldr        r1, =0x10000000
    mov         r2, #0
loop1:

    cmp        r2, r1
    addne    r2, r2, #0x1
    bne loop1
#endif

/************ DLL initialization *************/
     
        ldr     r1, =0x6A101000                @ Phycontrol0 DLL parameter setting
        str     r1, [r0, #DMC_PHYCONTROL0]

        ldr     r1, =0x000084F4                            @Phycontrol1 DLL parameter setting
        str     r1, [r0, #DMC_PHYCONTROL1]

        ldr     r1, =0x00000000                             @Phycontrol2 DLL parameter setting
        str     r1, [r0, #DMC_PHYCONTROL2]

        ldr     r1, =0x6A101002                      @DLL on
        str     r1, [r0, #DMC_PHYCONTROL0]

        ldr     r1, =0x6A101003                  @Dll start
        str     r1, [r0, #DMC_PHYCONTROL0]

    ldr    r2, = 0xE6000040        @DMC_PHYSTATUS0

loop1:

    ldr    r1, [r2]                @Check DLL lock
    ands    r1, r1, #4
    beq    loop1

    ldr    r1, [r2]
    mov    r1, r1,  LSR #(0x6)
    and    r1, r1, #(0xff)
    mov    r1, r1, LSL  #(0x1
    ldr     r2,  = 0xE6000018            @DMC_PHYCONTROL0
    ldr    r3, [r2]
    bic    r3,  r3, #(0xff000000)
    orr    r1, r3, r2
    str    r1, [r2]

        ldr     r1, =0x6A101003            @Force Value locking
        str     r1, [r0, #DMC_PHYCONTROL0]

        ldr     r1, =0x6A101009            @Dll off
        str     r1, [r0, #DMC_PHYCONTROL0]

#if 0
        ldr     r1, =0x6A101000                @ Phycontrol0 DLL parameter setting
        str     r1, [r0, #DMC_PHYCONTROL0]

        ldr     r1, =0x00008484                             @Phycontrol1 DLL parameter setting
        str     r1, [r0, #DMC_PHYCONTROL1]

        ldr     r1, =0x00000000                             @Phycontrol2 DLL parameter setting
        str     r1, [r0, #DMC_PHYCONTROL2]

#endif
/************ DLL initialization - END *************/

        ldr     r1, =0x0FF01010                         @auto refresh off  自刷新关闭
        str     r1, [r0, #DMC_CONCONTROL]

        ldr     r1, =0x00212400                         @ BL=4 , 2 chip , DDR2     2 chips,DDR2,chip0和chip1都用了
        str     r1, [r0, #DMC_MEMCONTROL]

#if 1    // add charles 512MB enable              这个是hardkernel开发者增加的512的支持,从算法来看,主要是提高了Row位的

                                                                             宽度,16x8x2

        ldr     r1, =0x20E01323                            @ 512MB config , 8banks , linear, Row=14bit,COL=10bit
        str     r1, [r0, #DMC_MEMCONFIG0]

        ldr     r1, =0x40E00323
        str     r1, [r0, #DMC_MEMCONFIG1]
#else    // 256MB enable                                    8x8x2
        ldr     r1, =0x20F80313                            @ 128MB config , 8banks , linear, Row=13bit,COL=10bit
        str     r1, [r0, #DMC_MEMCONFIG0]

        ldr     r1, =0x40F80313
        str     r1, [r0, #DMC_MEMCONFIG1]
#endif

        ldr     r1, =0x20000000      
        str     r1, [r0, #DMC_PRECHCONFIG]     预取的设置

         ldr     r1, =0x00100004            @ PwrdnConfig  DDR power down动态调整配置,DDR2节省功耗技术

可以阅读:http://www.laogu.com/wz_64520.htm

        str     r1, [r0, #DMC_PWRDNCONFIG]

#ifdef    CONFIG_HCLKD0_222    这个在s5pc110-android/uboot$ vim include/configs/hkdkc100.h当中定义,

默认选择的是CONFIG_CLK_833_166_66,DDR总线是166,如果打开 CONFIG_HCLKD0_222  ,DDR总线时钟就可以到222。

   ldr     r1, =0x000006c3                         @7.8us*222MHz=0x6c3, 7.8us*166MHz=1294(0x50E)

这里如果DDR2 跑222MHz,值为0x6c3,如果跑166,就是0x50E。

   下面是时序的配置。如果用的是220MHz,DDR cas 用的是5,理论上这个值越小越好,要看具体内存参数。

   不过这还要看内存颗粒的原始设定值,否则会造成系统的不稳定。
    str     r1, [r0, #DMC_TIMINGAREF]
    /* T-rfc   127.5nS/5ns  64 */
       ldr     r1, =0x202332C8                                 @TimingRow      @222MHz
       str     r1, [r0, #DMC_TIMINGROW]

       ldr     r1, =0x24450304                            @CL=5
       str     r1, [r0, #DMC_TIMINGDATA]

#else

          ldr     r1, =0x0000050E      
        str     r1, [r0, #DMC_TIMINGAREF]

        ldr     r1, =0x16233297                         @TimingRow      @166MHz
        str     r1, [r0, #DMC_TIMINGROW]

@;        ldr     r1, =0x24250304                         @CL=5
        ldr     r1, =0x23230000                         @CL=3
        str     r1, [r0, #DMC_TIMINGDATA]
#endif

        ldr     r1, =0x07c80232                           @ Timing Power
        str     r1, [r0, #DMC_TIMINGPOWER]

/* Direct Command for DDR2 */
        ldr     r1, =0x07000000                         @chip0 Deselect
        str     r1, [r0, #DMC_DIRECTCMD]

        ldr     r1, =0x01000000                        @chip0 PALL
        str     r1, [r0, #DMC_DIRECTCMD]

        ldr     r1, =0x00020000                         @chip0 EMRS2
        str     r1, [r0, #DMC_DIRECTCMD]

        ldr     r1, =0x00030000                         @chip0 EMRS3
        str     r1, [r0, #DMC_DIRECTCMD]

        ldr     r1, =0x00010400                         @chip0 EMRS1 (MEM DLL on = DQS# disable)
        str     r1, [r0, #DMC_DIRECTCMD]

@;        ldr     r1, =0x00000552                         @chip0 MRS (MEM DLL reset) CL=5, Burst Length=4
        ldr     r1, =0x00000532                         @chip0 MRS (MEM DLL reset) CL=3, Burst Length=4
        str     r1, [r0, #DMC_DIRECTCMD]

        ldr     r1, =0x01000000                         @chip0 PALL
        str     r1, [r0, #DMC_DIRECTCMD]

        ldr     r1, =0x05000000                         @chip0 REFA
        str     r1, [r0, #DMC_DIRECTCMD]

        ldr     r1, =0x05000000                         @chip0 REFA
        str     r1, [r0, #DMC_DIRECTCMD]

@;        ldr     r1, =0x00000452                         @chip0 MRS (MEM DLL unreset) , BL=4 , CL=5
        ldr     r1, =0x00000432                         @chip0 MRS (MEM DLL unreset) , BL=4 , CL=3
        str     r1, [r0, #DMC_DIRECTCMD]

        ldr     r1, =0x00010780                         @chip0 EMRS1 (OCD default)
        str     r1, [r0, #DMC_DIRECTCMD]

//         ldr     r1, =0x00010400                         @chip0 EMRS1 (OCD exit)
        ldr     r1, =0x00010402                         @chip0 EMRS1 (OCD exit)  Reduced Strength
//      ldr     r1, =0x00010000                         @chip0 EMRS1 (OCD exit)  ODT Disabled
        str     r1, [r0, #DMC_DIRECTCMD]

/* Direct Command for LPDDR  - END */

    ldr     r1, =0x00FF20B0            @ConControl auto refresh on
        str     r1, [r0, #DMC_CONCONTROL]

#if 0
        ldr     r1, =0x001000FF            @ PwrdnConfig
        str     r1, [r0, #DMC_PWRDNCONFIG]
#endif

        ldr     r1, =0x00212413                @ MemControl
        str     r1, [r0, #DMC_MEMCONTROL]

        b    exit_cpu_init

onenand_pop:
    ldr    r1, =0x50101000                @Phycontrol0 DLL parameter setting
    str    r1, [r0, #DMC_PHYCONTROL0]

    ldr    r1, =0x000000F4                @Phycontrol1 DLL parameter setting
    str    r1, [r0, #DMC_PHYCONTROL1]

    ldr    r1, =0x00000000                @Phycontrol2 DLL parameter setting
    str    r1, [r0, #DMC_PHYCONTROL2]

    ldr    r1, =0x50101002                @Dll on
    str    r1, [r0, #DMC_PHYCONTROL0]

    ldr    r1, =0x50101003                @dll start
    str    r1, [r0, #DMC_PHYCONTROL0]

    ldr    r1, =0x50101003                @Force Value locking
    str    r1, [r0, #DMC_PHYCONTROL0]

    ldr    r1, =0x50101001                @Dll off
    str    r1, [r0, #DMC_PHYCONTROL0]

    ldr    r1, =0xFF001010                @auto refresh off
    str    r1, [r0, #DMC_CONCONTROL]

    ldr    r1, =0x00212100                @Dll off
    str    r1, [r0, #DMC_MEMCONTROL]

@;    ldr    r1, =0x28F80222
    ldr    r1, =0x28F00222
    str    r1, [r0, #DMC_MEMCONFIG0]

    ldr    r1, =0x20F80222
    str    r1, [r0, #DMC_MEMCONFIG1]

    ldr    r1, =0x20000000
    str    r1, [r0, #DMC_PRECHCONFIG]

    ldr    r1, =0x0000050E
    str    r1, [r0, #DMC_TIMINGAREF]

    ldr    r1, =0x0C233287                @TimingRow    @133MHz
    str    r1, [r0, #DMC_TIMINGROW]

    ldr    r1, =0x32330303
    str    r1, [r0, #DMC_TIMINGDATA]

    ldr    r1, =0x04141433                @Timing Power
    str    r1, [r0, #DMC_TIMINGPOWER]

    ldr    r1, =0x07000000                @chip0 Deselect
    str    r1, [r0, #DMC_DIRECTCMD]

    ldr    r1, =0x01000000                @chip0 PALL
    str    r1, [r0, #DMC_DIRECTCMD]

    ldr    r1, =0x05000000                @chip0 REFA
    str    r1, [r0, #DMC_DIRECTCMD]

    ldr    r1, =0x05000000                @chip0 REFA
    str    r1, [r0, #DMC_DIRECTCMD]

    ldr    r1, =0x00000032                @chip0 MRS
    str    r1, [r0, #DMC_DIRECTCMD]

    ldr    r1, =0x07100000                @chip1 Deselect
    str    r1, [r0, #DMC_DIRECTCMD]

    ldr    r1, =0x01100000                @chip1 PALL
    str    r1, [r0, #DMC_DIRECTCMD]

    ldr    r1, =0x05100000                @chip1 REFA
    str    r1, [r0, #DMC_DIRECTCMD]

    ldr    r1, =0x05100000                @chip1 REFA
    str    r1, [r0, #DMC_DIRECTCMD]

    ldr    r1, =0x00100032                @chip1 MRS
    str    r1, [r0, #DMC_DIRECTCMD]

    ldr    r1, =0xFF002030                @ConControl auto refresh on
    str    r1, [r0, #DMC_CONCONTROL]

    ldr    r1, =0x00100002                @PwrdnConfig
    str    r1, [r0, #DMC_PWRDNCONFIG]

@;    ldr    r1, =0xFF212113                @MemControl
    ldr    r1, =0xFF212100                @MemControl
    str    r1, [r0, #DMC_MEMCONTROL]

    b    exit_cpu_init

exit_cpu_init:
    mov    pc, lr

/* Below code is for ARM926EJS and ARM1026EJS */
    .globl cleanDCache
cleanDCache:
    mrc    p15, 0, pc, c7, c10, 3    /* test/clean D-Cache */
    bne    cleanDCache
    mov    pc, lr

    .globl cleanFlushDCache
cleanFlushDCache:
    mrc    p15, 0, pc, c7, c14, 3    /* test/cleanflush D-Cache */
    bne    cleanFlushDCache
    mov    pc, lr

    .globl cleanFlushCache
cleanFlushCache:
    mrc    p15, 0, pc, c7, c14, 3    /* test/cleanflush D-Cache */
    bne    cleanFlushCache
    mcr    p15, 0, r0, c7, c5, 0    /* flush I-Cache */
    mov    pc, lr

    .ltorg

来源:机锋网

(Email :hongjiujing@gmail.com)
  (此文章适合于初学者,说的不对的地方欢迎大家指正和完善。大牛们可以绕道^^)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

与君绝 2022-09-25 11:38:25

文章似乎不完整?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文