.global _start
_start:
b reset
reset:
b save_boot_params
.align 4
save_boot_params:
b save_boot_params_ret
// 禁用中断(FIQ 和 IRQ),将 CPU 设置为 SVC32 模式,除非已经处于 HYP 模式
save_boot_params_ret:
mrs r0, cpsr @ 状态寄存器到通用寄存器的传送指令,读取 cpsr 的值到 r0 寄存器中
and r1, r0, #0x1f @ r0 按位与 #0x1f,结果保存到 r1 中,#0x1f 保存工作模式,清除工作状态,FIQ 中断,IRQ 中断
teq r1, #0x1a @ 相等测试指令,r1 与 #0x1a 做异或操作
bicne r0, r0, #0x1f @ 如果 r1 = 0x1a 将 r0 和 0x1f 按位与并将结果是1的位清除,结果保存到 r0 中,清除 r0 中的模式标志位
orrne r0, r0, #0x13 @ 将 r0 和 0x13 按位或操作,结果保存到 r0 中,设置 svc 模式
orr r0, r0, #0xc0 @ 禁用 IRQ 和 FIQ 模式
msr cpsr, r0 @ 通用寄存器到状态寄存器的指令传送,将 r0 的值给到 cpsr
mrc p15, 0, r0, c1, c0, 0 @ 读取 CP15 中的 c1寄存器的值到 r0 寄存器中,这里是读取 SCTLR 寄存器的值
bic r0, #0x2000 @ 设置 SCTLR 寄存器中的 V = 0
mcr p15, 0, r0, c1, c0, 0 @ 将 r0 寄存器的值重写写入到寄存器 SCTLR 中
ldr r0, =_star @ 将 r0 寄存器值设置为 _start,_start 是整个 uboot的入口地址
mcr p15, 0, r0, c12, c0, 0 @ 将r0 寄存器的值写入到 CP15的c12寄存器中,设置向量表地址
bl cpu_init_cp15 @ 设置 cp 15寄存器(cache,mmu,TLBs)
bl cpu_init_crit @ 设置关键寄存器和初始化
bl _main @ 跳转到 _main,进入板级初始化
uboot初始化流程
最新推荐文章于 2023-11-03 16:34:48 发布