1. 简介
Microchip的Sam9x60芯片开机启动流程分为三部分
① 芯片内嵌的一级引导
② BootStrap二级引导
③ U-boot三级引导
2. at91内嵌一级引导
2.1 一级引导介绍
芯片嵌入了引导ROM代码,启动时,它根据复位时的BMS(引导模式选择)引脚状态启用,ROM代码扫描不同介质的内容,如串行闪存,NAND闪存,标清/ MMC卡和串行EEPROM。
如果里面有有效的引导应用程序可用,则它将该引导应用程序下载到芯片内部SRAM(Cache)中重映射,映射到0x00并运行它。
为了确定是否存在有效的引导应用程序,ROM 代码会检查八个 ARM 异常向量(包含跳转或偏移地址转载等arm指令)。
如果没有可用的有效应用程序,则执行 SAM-BA 监视器。它等待 USB 设备或 DBGU 串行端口上的事务,然后 SAM-BA 工具可用于对电路板上存在的闪存或 EEPROM 进行编程。
2.2 sam9x60内部存储配置
3. BootStrap二级引导
3.1 二级引导介绍
Bootstrap 是第二级引导加载程序,它提供了一组算法来管理硬件初始化。
例如时钟速度配置、PIO 设置、DRAM 初始化,以将主应用程序从指定的引导介质(NAND 闪存、串行闪存(与 DataFlash 的 AT25 兼容)、串行 EEPROM、SD 卡等)下载到主内存并启动它。
① 初始化时钟、PIO等设置
② 初始化PIO、PMC、SDRAM等外设
③ 初始化DataFlash、NandFlash等
④ 从DataFlash、NandFlash中装载U-Boot到SDRAM,并跳转执行
3.2 代码部分
我们可以在BootStrap源码里面找到binaries目录里的.map文件
什么是 MAP 文件?
简单地讲, MAP 文件是程序的全局符号、源文件和代码行号信息的唯一的文本表示方法,它可以在任何地方、任何时候使用,不需要有额外的程序进行支持。而且,这是唯一能找出程序崩溃的地方的救星。
从map可以了解到程序crt0_gnu.S汇编开始
再跳转到main.c
然后初始化相关硬件代码部分
关闭看门狗、led、使能PLLA、启动外部复位、初始化时钟、DDR等
其中DDR的初始化代码部分,个别参数需要查阅相关DDR手册填写
最后是加载u-boot代码部分
加载完成后,就会跳转执行u-boot
四、U-boot启动
u-boot在作为第三级引导,Uboot 拿到 CPU 使用权就开始做初始化工作,比如关闭看门狗、设置 CPU 运行模式、设置堆栈、初始化内存、网卡、nand flash 等,最后把 Linux 内核加载到内存中。
u-boot这里就不做详细的分析了
五、开机log