uboot移植及源码分析(1)-start.s(1)

uboot版本v2016.11-rc3

mini2440

代码位置arch/arm/cpu/arm920t/start.S

    mrs r0, cpsr
    bic r0, r0, #0x1f
    orr r0, r0, #0xd3
    msr cpsr, r0

对于cpsr描述如下

uboot移植及源码分析(1)-start.s(1)_第1张图片

uboot移植及源码分析(1)-start.s(1)_第2张图片

上面的代码首先将cpsr的值读入R0

然后R0 & ~0x1f 即将M4~M0所在bit位清0

接着R0 | 0xd3      即I=1 F=1 M4~M0 = 10011

关闭IRQ FIQ进入svc模式

    ldr r0, =pWTCON
    mov r1, #0x0
    str r1, [r0]

uboot移植及源码分析(1)-start.s(1)_第3张图片

将该寄存器的 值清0,关闭看门狗

    mov r1, #0xffffffff
    ldr r0, =INTMSK
    str r1, [r0]
# if defined(CONFIG_S3C2410)
    ldr r1, =0x3ff
    ldr r0, =INTSUBMSK
    str r1, [r0]
# endif

# if defined(CONFIG_S3C2440)
    ldr r1, =0x3ff
    ldr r0, =INTSUBMSK
    str r1, [r0]
# endif

以上操作是屏蔽中断,和关闭看门狗一样的思路

# if defined(CONFIG_S3C2440)

# define MPLLCON   0x4C000004
# define UPLLCON   0x4C000008

# define P_MDIV     92
# define P_PDIV     1
# define P_SDIV     1
# define S3C2440_MPLL400MHZ ((P_MDIV << 12) | (P_PDIV << 4) | (P_SDIV << 0))

# define U_MDIV     56
# define U_PDIV     2
# define U_SDIV     2
# define S3C2440_UPLL48MHZ  ((U_MDIV << 12) | (U_PDIV << 4) | (U_SDIV << 0))

    /* FCLK:HCLK:PCLK = 1:4:8 */
    /* default FCLK is 400 MHz ! */
    ldr r0, =CLKDIVN
    mov r1, #5
    str r1, [r0]

    /* asynchronous bus mode*/
    mrc p15,0,r0,c1,c0,0
    orr r0,r0,#0xc0000000
    mcr p15,0,r0,c1,c0,0

    ldr r0, =MPLLCON
    ldr r1, =S3C2440_MPLL400MHZ
    str r1, [r0]

    ldr r0, =UPLLCON
    ldr r1, =S3C2440_UPLL48MHZ
    str r1, [r0]

# else

    /* FCLK:HCLK:PCLK = 1:2:4 */
    /* default FCLK is 120 MHz ! */
    ldr r0, =CLKDIVN
    mov r1, #3
    str r1, [r0]
# endif

以上是移植到2440上的时候,添加的配置2440的时钟

2440的主时钟有2个选择,
1.外部的晶振
2.外部的时钟
对于这2者的选择,通过下面设置

uboot移植及源码分析(1)-start.s(1)_第4张图片

即OM3和OM2
手里的板子是mini2440,OM3 = 0 OM2 = 0,且外部晶振是12Mhz

对于外部的晶振来说,连接到内部的振荡器,有2个PLL,产生高频率从时钟
      虽然MPLL在复位后立即启动,但MPLL输出(Mpll)不会用作系统时钟,直到软件将有效设置写入MPLLCON寄存器。 (下面的蓝线)
       在此有效设置之前,外部晶振或EXTCLK源的时钟将直接用作系统时钟。 即使用户不想更改MPLLCON寄存器的默认值,用户也应该将相同的值写入MPLLCON寄存器。

uboot移植及源码分析(1)-start.s(1)_第5张图片

可以看到HCLK FCLK PCLK都是从MPLL输出的时钟获得的
其值可以通过下面设置

uboot移植及源码分析(1)-start.s(1)_第6张图片

假设我们想设置HCLK为400Mhz
计算方式如下

400 = (2*m*12)/(p*2^s)
        = ( 2*100*12 )/(3*2)
MDIV = 92
PDIV = 1
SDIV = 1


对于usb的时钟,我们要设置为48Mhz

48 = (m*12)/(p*2^s)
     = (64*12)/(4*4)
MDIV = 58
PDIV = 2
SDIV = 2

以上主要是分析了start.s中的中断及时钟配置

待续。。。

你可能感兴趣的:(uboot)