首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

U-Boot启动过程完全分析(2)

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位)置一,从而屏蔽对应的中断。


继承事业,薪火相传
返回列表