天嵌 ARM开发社区

 找回密码
 注册
查看: 2679|回复: 4

裸跑程序启动代码的的疑问?

[复制链接]
kpshare 发表于 2010-3-6 14:31:27 | 显示全部楼层 |阅读模式
这几天俺看了裸跑程序的启动代码,但有个疑搞不懂,为什么程序需要在两个地方设置相同时钟值,如MPLL,FCLK,HCLK,PCLK等。
    第一次是在2440init.s文件的200行位置,代码如下:
[ PLL_ON_START
                ; Added for confirm clock divide. for 2440.
                ; Setting value Fclk:Hclk:Pclk
                ldr        r0,=CLKDIVN
                ldr        r1,=CLKDIV_VAL                ; 0=1:1:1, 1=1:1:2, 2=1:2:2, 3=1:2:4, 4=1:4:4, 5=1:4:8, 6=1:3:3, 7=1:3:6.
                str        r1,[r0]

        ;program has not been copied, so use these directly
                [ CLKDIV_VAL>1                 ; means Fclk:Hclk is not 1:1.
                        mrc p15,0,r0,c1,c0,0
                        orr r0,r0,#0xc0000000;R1_nF:OR:R1_iA
                        mcr p15,0,r0,c1,c0,0
                        |
                        mrc p15,0,r0,c1,c0,0
                        bic r0,r0,#0xc0000000;R1_iA:OR:R1_nF
                        mcr p15,0,r0,c1,c0,0
                ]

                ;Configure UPLL
                ldr        r0,=UPLLCON
                ldr        r1,=((U_MDIV<<12)+(U_PDIV<<4)+U_SDIV)                                ;Fin = 12.0MHz, UCLK = 48MHz
                str        r1,[r0]
                nop        ; Caution: After UPLL setting, at least 7-clocks delay must be inserted for setting hardware be completed.
                nop
                nop
                nop
                nop
                nop
                nop
                ;Configure MPLL
                ldr        r0,=MPLLCON
                ldr        r1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV)                                ;Fin = 12.0MHz, FCLK = 400MHz
                str        r1,[r0]
        ]

第二次是在程序复制到SDRARM后,跳到Main中运行时,代码在文件Main.c中的195行,代码如下:
//init FCLK=400M, so change MPLL first
        ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);
        ChangeClockDivider(key, 12);
        cal_cpu_bus_clk();


函数的定义如下:
//*************************[ MPLL ]*******************************
void ChangeMPllValue(int mdiv,int pdiv,int sdiv)
{
        rMPLLCON = (mdiv<<12) | (pdiv<<4) | sdiv;
}


//************************[ HCLK, PCLK ]***************************
void ChangeClockDivider(int hdivn_val,int pdivn_val)
{
        int hdivn=2, pdivn=0;
       
        // hdivn_val (FCLK:HCLK)ratio hdivn
        // 11           1:1       (0)
        // 12           1:2       (1)
        // 13           1:3       (3)
        // 14           1:4       (2)
        // pdivn_val (HCLK:PCLK)ratio pdivn
        // 11           1:1       (0)
        // 12           1:2       (1)
        switch(hdivn_val) {
                case 11: hdivn=0; break;
                case 12: hdivn=1; break;
                case 13:
                case 16: hdivn=3; break;
                case 14:
                case 18: hdivn=2; break;
        }
       
        switch(pdivn_val) {
                case 11: pdivn=0; break;
                case 12: pdivn=1; break;
        }
       
        //Uart_Printf("Clock division change [hdiv:%x, pdiv:%x]\n", hdivn, pdivn);
        rCLKDIVN = (hdivn<<1) | pdivn;

        switch(hdivn_val) {
                case 16:                // when 1, HCLK=FCLK/8.
                        rCAMDIVN = (rCAMDIVN & ~(3<<8)) | (1<<8);
                break;
                case 18:         // when 1, HCLK=FCLK/6.
                        rCAMDIVN = (rCAMDIVN & ~(3<<8)) | (1<<9);
                break;
        }
       
        if(hdivn!=0)
                MMU_SetAsyncBusMode();
        else
                MMU_SetFastBusMode();
}


     现在我的疑问是为什么要在两个地方设定同样一个时钟,既然一开始启动代码已设置后了,后面为何还要重新设置,还是因为我没有把代码看懂了??
 楼主| kpshare 发表于 2010-3-8 14:44:25 | 显示全部楼层
唉。。。。。怎就没回应我啊。。。。。
回复

使用道具 举报

 楼主| kpshare 发表于 2010-3-15 15:50:40 | 显示全部楼层
:L。。。。。。。。。。。。。。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2025-6-18 07:31 , Processed in 2.040758 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表