(2)CPU进入SVC模式
start_code:
/*
* set the cpu to SVC32 mode
*/
mrs
r0, cpsr
bic
r0, r0, #0x1f
/*工作模式位清零 */
orr
r0, r0, #0xd3
/*工作模式位设置为“10011”(管理模式),并将中断禁止位和快中断禁止位置1 */
msr
cpsr, r0
以上代码将CPU的工作模式位设置为管理模式,并将中断禁止位和快中断禁止位置一,从而屏蔽了IRQ和FIQ中断。
(3)设置控制寄存器地址
# if defined(CONFIG_S3C2400)
#
define pWTCON
0x15300000
#
define INTMSK
0x14400008
#
define CLKDIVN
0x14800014
#else
/*s3c2410与s3c2440下面4个寄存器地址相同 */
#
define pWTCON
0x53000000
/* WATCHDOG控制寄存器地址
*/
#
define INTMSK
0x4A000008
/* INTMSK寄存器地址
*/
#
define INTSUBMSK
0x4A00001C
/* INTSUBMSK寄存器地址 */
#
define CLKDIVN
0x4C000014
/* CLKDIVN寄存器地址 */
# endif
对与s3c2440开发板,以上代码完成了WATCHDOG,INTMSK,INTSUBMSK,CLKDIVN四个寄存器的地址的设置。各个寄存器地址参见参考文献[4]
。
(4)关闭看门狗
ldr
r0, =pWTCON
mov
r1, #0x0
str
r1, [r0]
/*看门狗控制器的最低位为0时,看门狗不输出复位信号 */
以上代码向看门狗控制寄存器写入0,关闭看门狗。否则在U-Boot启动过程中,CPU将不断重启。
(5)屏蔽中断
/*
* mask all IRQs by setting all bits in theINTMR - default
*/
mov
r1, #0xffffffff
/* 某位被置1则对应的中断被屏蔽 */
ldr
r0, =INTMSK
str
r1, [r0]
INTMSK是主中断屏蔽寄存器,每一位对应SRCPND(中断源引脚寄存器)中的一位,表明SRCPND相应位代表的中断请求是否被CPU所处理。
根据参考文献4,INTMSK寄存器是一个32位的寄存器,每位对应一个中断,向其中写入0xffffffff就将INTMSK寄存器全部位置一,从而屏蔽对应的中断。
# if defined(CONFIG_S3C2440)
ldr
r1, =0x7fff
ldr
r0, =INTSUBMSK
str
r1, [r0]
# endif
INTSUBMSK每一位对应SUBSRCPND中的一位,表明SUBSRCPND相应位代表的中断请求是否被CPU所处理。
根据参考文献4,INTSUBMSK寄存器是一个32位的寄存器,但是只使用了低15位。向其中写入0x7fff就是将INTSUBMSK寄存器全部有效位(低15位)置一,从而屏蔽对应的中断。
|