Board logo

标题: U-Boot启动过程完全分析(2) [打印本页]

作者: yuyang911220    时间: 2015-9-22 16:12     标题: U-Boot启动过程完全分析(2)

2CPU进入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的工作模式位设置为管理模式,并将中断禁止位和快中断禁止位置一,从而屏蔽了IRQFIQ中断。

3)设置控制寄存器地址

# if defined(CONFIG_S3C2400)
#
define pWTCON
0x15300000

#
define INTMSK
0x14400008

#
define CLKDIVN
0x14800014

#else
/*s3c2410s3c2440下面4个寄存器地址相同 */
#
define pWTCON
0x53000000
/* WATCHDOG控制寄存器地址
*/
#
define INTMSK
0x4A000008
/* INTMSK寄存器地址
*/
#
define INTSUBMSK
0x4A00001C
/* INTSUBMSK寄存器地址 */
#
define CLKDIVN
0x4C000014


/* CLKDIVN寄存器地址 */
# endif

对与s3c2440开发板,以上代码完成了WATCHDOGINTMSKINTSUBMSKCLKDIVN四个寄存器的地址的设置。各个寄存器地址参见参考文献[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所处理


根据参考文献4INTMSK寄存器是一个32位的寄存器,每位对应一个中断,向其中写入0xffffffff就将INTMSK寄存器全部位置一,从而屏蔽对应的中断。

# if defined(CONFIG_S3C2440)


ldr
r1, =0x7fff



ldr
r0, =INTSUBMSK


str
r1, [r0]
# endif

INTSUBMSK每一位对应SUBSRCPND中的一位,表明SUBSRCPND相应位代表的中断请求是否被CPU所处理


根据参考文献4INTSUBMSK寄存器是一个32位的寄存器,但是只使用了低15位。向其中写入0x7fff就是将INTSUBMSK寄存器全部有效位(低15位)置一,从而屏蔽对应的中断。







欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0