您的位置:首页 > 其它

如何制作bootloader

2015-12-08 19:13 351 查看
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)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: