reset标号的代码在处理器启动的时候最先被执行。
106 /*
107 * the actual reset code
108 */
109
110 reset:
111 /*
112 * set the cpu to SVC32 mode
113 */
114 mrs r0,cpsr // 保存CPSR寄存器的值到r0寄存器
115 bic r0,r0,#0x1f // 清除中断
116 orr r0,r0,#0xd3
117 msr cpsr,r0 // 设置CPSR为超级保护模式
118
119 /* turn off the watchdog */ // 关闭看门狗
120 #if defined(CONFIG_S3C2400)
121 # define pWTCON 0x15300000 // 看门狗寄存器地址
122 # define INTMSK 0x14400008 /* Interupt-Controller base addresses */
// 中断控制器基址
123 # define CLKDIVN 0x14800014 /* clock divisor register */
124 #elif defined(CONFIG_S3C2410)
125 # define pWTCON 0x53000000
126 # define INTMSK 0x4A000008 /* Interupt-Controller base addresses */
127 # define INTSUBMSK 0x4A00001C
128 # define CLKDIVN 0x4C000014 /* clock divisor register */
129 #endif
130
131 #if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)
132 ldr r0, =pWTCON // 取出当前看门狗控制寄存器的地址到r0
133 mov r1, #0x0 // 设置r1寄存器值为0
134 str r1, [r0] // 写入看门狗控制寄存器
135
136 /*
137 * mask all IRQs by setting all bits in the INTMR - default
138 */
139 mov r1, #0xffffffff // 设置r1
140 ldr r0, =INTMSK // 取出中断屏蔽寄存器地址到r0
141 str r1, [r0] // r1的值写入中断屏蔽寄存器
142 # if defined(CONFIG_S3C2410)
143 ldr r1, =0x3ff
144 ldr r0, =INTSUBMSK
145 str r1, [r0]
146 # endif
147
148 /* FCLK:HCLK:PCLK = 1:2:4 */
149 /* default FCLK is 120 MHz ! */
150 ldr r0, =CLKDIVN // 取出时钟寄存器地址到r0
151 mov r1, #3 // 设置r1的值
152 str r1, [r0] // 写入时钟配置
153 #endif /* CONFIG_S3C2400 || CONFIG_S3C2410 */
154
155 /*
156 * we do sys-critical inits only at reboot,
157 * not when booting from ram!
158 */
159 #ifndef CONFIG_SKIP_LOWLEVEL_INIT
160 bl cpu_init_crit // 跳转到开发板相关初始化代码
161 #endif
程序第114行取出CPSR寄存器的值,CPSR寄存器保存当前系统状态,第115行使用比特清除命令清空了CPSR寄存器的中断控制位,表示清除中断。程序116行设置了CPSR寄存器的处理器模式位为超级保护模式,然后在第117行写入 CPSR的值强制切换处理器为超级保护模式。
程序第120~129行定义看门狗控制器有关的变量,第131~153行根据平台设置看门狗定时器。在程序第150行设置时钟分频寄存器的值。
程序第160行需要根据CONFIG_SKIP_LOWLEVEL_INIT宏的值是否跳转到cpu_init_crit标号执行。请注意这里使用bl指令,在执行完cpu_init_crit标号的代码后会 返回。