_start: b reset //复位向量 ; ; 设置异常向量表 ldr pc, _undefined_instruction ldr pc, _software_interrupt ldr pc, _prefetch_abort ldr pc, _data_abort ldr pc, _not_used ldr pc, _irq //中断向量 ldr pc, _fiq //中断向量 … /* the actual reset code * / reset: //复位启动子程序 /* 设置CPU为SVC32模式 * / mrs r0, cpsr bic r0, r0, # 0x1f ; ; 位清除,将某些位的值置0:r0 = r0 AND ( ! 0x1f) orr r0, r0, # 0xd3 ; ; 逻辑或,将r0与立即数进行逻辑或,放在r0中(第一个) msr cpsr, r0 /* 关闭看门狗 * / /* turn off the watchdog * / #if defined( CONFIG_S3C2400) # define pWTCON 0x15300000 # define INTMSK 0x14400008 /* Interupt- Controller base addresses * / # define CLKDIVN 0x14800014 /* clock divisor register * / #elif defined( CONFIG_S3C2410) # define pWTCON 0x53000000 # define INTMSK 0x4A000008 /* Interupt- Controller base addresses * / # define INTSUBMSK 0x4A00001C # define CLKDIVN 0x4C000014 /* clock divisor register * / #endif #if defined( CONFIG_S3C2400) | | defined( CONFIG_S3C2410) ldr r0, = pWTCON mov r1, #0x0 str r1, [ r0] /* 禁止所有中断和设置CPU频率 * / /* * mask all IRQs by setting all bits in the INTMR - default * / mov r1, #0xffffffff ldr r0, = INTMSK str r1, [ r0] # if defined( CONFIG_S3C2410) ldr r1, = 0x3ff ldr r0, = INTSUBMSK str r1, [ r0] # endif /* FCLK: HCLK: PCLK = 1: 2: 4 * / ; ; FCLK用于CPU,HCLK用于AHB,PCLK用于APB /* default FCLK is 120 MHz ! * / ldr r0, = CLKDIVN ; ; 根据硬件手册来设置CLKDIVN寄存器 mov r1, #3 ; ; 用户手册的推荐值 str r1, [ r0] #endif /* CONFIG_S3C2400 | | CONFIG_S3C2410 * / /* 这些初始化代码在系统重起的时候执行,运行时热复位从RAM中启动不执行 * / /* * we do sys- critical inits only at reboot, * not when booting from * / #ifndef CONFIG_SKIP_LOWLEVEL_INIT bl cpu_init_crit ; ; 跳转去初始化CPU #endif ; ; # ifdef CONFIG_INIT_CRITICAL 原文中的,估计是1. 1. 16版本的; ; bl cpu_init_crit; ; # endif /* CPU和RAM两个关键的初始化子程序 * / /* 初始化CPU * / cpu_init_crit: /* * flush v4 I/D caches 设置CP15 * / mov r0, #0 mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cache * / ; ; 使I/D cache失效:将寄存器r0的数据传送到协处理器p15的c7中。C7寄存器位对应cp15中的cache控制寄存器 mcr p15, 0, r0, c8, c7, 0 /* flush v4 TLB * / ; ; 使TLB操作寄存器失效:将r0数据送到cp15的c8、c7中。C8对应TLB操作寄存器 /* * disable MMU stuff and caches 禁止MMU和caches * / mrc p15, 0, r0, c1, c0, 0 ; ; 先把c1和c0寄存器的各位置0( r0 = 0) bic r0, r0, #0x00002300 @ clear bits 13, 9: 8 ( - - V- - - RS) bic r0, r0, #0x00000087 @ clear bits 7, 2: 0 ( B- - - - CAM) ; ; 这里我本来有个疑问:为什么要分开设置。因为arm汇编要求的立即数格式所决定的 orr r0,
阅读(1220) | 评论(0) | 转发(0) |