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描述如下
上面的代码首先将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]
将该寄存器的 值清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者的选择,通过下面设置
即OM3和OM2
手里的板子是mini2440,OM3 = 0 OM2 = 0,且外部晶振是12Mhz
对于外部的晶振来说,连接到内部的振荡器,有2个PLL,产生高频率从时钟
虽然MPLL在复位后立即启动,但MPLL输出(Mpll)不会用作系统时钟,直到软件将有效设置写入MPLLCON寄存器。 (下面的蓝线)
在此有效设置之前,外部晶振或EXTCLK源的时钟将直接用作系统时钟。 即使用户不想更改MPLLCON寄存器的默认值,用户也应该将相同的值写入MPLLCON寄存器。
可以看到HCLK FCLK PCLK都是从MPLL输出的时钟获得的
其值可以通过下面设置
假设我们想设置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中的中断及时钟配置
待续。。。