1.按照ARM版的芯片手册,通过CPSR设置cpu为管理员模式(svc),

关闭IRQ和FRQ中断。正常情况下启动后的默认设置就是这样的。

2、通过协处理器设置CP15中的C1寄存器,关掉MMU,默认情况下也不会开启。

2. 通过协处理器cp15中的c1寄存器, 关掉mmu(默认不会开启)

关掉数据缓存。

3. 通过协处理器cp15中的c15寄存器, 映射外设寄存器的地址。如果不映射,外设寄存器无法配置。


4. 关闭看门狗,因为看门狗默认是开启的. 不关闭的话,大概3秒后,cpu会重启。


5. cpu倍频


供参考的步骤:


a. 先在OTHERS寄存器中设置总线工作模式为同步模式,并轮询应答位。


b. 在CLK_DIV0寄存器中设置分频


c. 在APLL_CON, MPLL_CON中设置如何倍频(31位要使能)


d. 在CLK_SRC中设置使用apll, mpll倍频后的频率


e. 延时一会,确保输出频率已稳定


6. 内存初始化


具体步骤如下:


a. 在P1MEMCCMD寄存器中设置,让DRAMC进入config状态


b. 结合相关文档和具体芯片手册设置时序。时序有典型值就要使用典型值,没有可以使用最小值或加1(当然不能超过最大值)。


c. 执行内存初始化的工作次序。


d. 在P1MEMCCMD寄存器中设置,  让DRAMC进入ready状态


e. 读取P1MEMSTAT中的状态,直到真的是ready状态为止


7. 设置栈指针


8. 初始化串口,实现串口输出字符串。


9. 初始化nand flash。


10. 从nandflash中把整个bootloader读入已初始化好的内存中(放的位置要与链接脚本中指定的地址一致),一般我们称这段bootloader为第二阶段。这里可能需要初始化网卡,USB等设备,支持更多的命令,如nand flash擦除,烧写,tftp,ping等功能。如果我们的bootloader比较简单,8KB的SRAM已经足够,就不需要第二阶段。


11. 让cpu运行在内存的第二阶段代码, 通过"ldr  pc, =函数名"实现。


12. 第二阶段要把内核映像从nand flash拷贝到内存0x50008000地址处。如果使用uImage,注意64字节的头,所以应该跳到(0x50008000+0x40)执行内核。执行内核之前要把传递给内核的参数准备好。内核和bootloader参数传递使用taglist的方式参考(arch/arm/include/asm/setup.h)


调用内核之前,要满足下列条件:


 1)CPU 寄存器的设置。


R0=0。


R1=机器类型 ID;对于 ARM 结构的 CPU,其机器类型 ID 可以参见 (linux/arch/arm/tools/mach-types。smdk6410是1626)。


R2=启动参数标记列表在 RAM 中起始基地址。


(2)CPU 工作模式。


必须禁止中断(IRQs 和 FIQs)。


CPU 必须为 SVC 模式。


(3)Cache 和 MMU 的设置。


MMU 必须关闭。                                        


数据 Cache 必须关闭。


指令 Cache 可以关闭也可以打开。




关于这部分,可参考(Documentation/arm/Booting)。