您的位置:首页 > 运维架构 > Linux

AM335x启动流程(BootRom->MLO->Uboot)

2017-04-12 17:13 357 查看
http://blog.chinaunix.NET/uid-28458801-id-3486399.html

参考文件:

1,AM335x ARM Cortex-A8 Microprocessors (MPUs) Technical Reference Manual.pdf;

2,am3359.pdf;



1,am335x的cpu上电后,会跳到哪个地址去执行?

答:

芯片到uboot启动流程 :ROM → MLO(SPL)→ uboot.img

AM335x 中bootloader被分成了 3 个部分:

第一级 bootloader:引导加载程序,板子上电后会自动执行这些代码,如选择哪种方式启动(NAND,SDcard,UART。。。),然后跳转转到第二级 bootloader。这些代码应该是存放在 176KB 的 ROM 中。





第二级 bootloader:MLO(SPL),用以硬件初始化:关闭看门狗,关闭中断,设置 CPU 时钟频率、速度等操作。然后会跳转到第三级bootloader。MLO文件应该会被映射到 64 KB的 Internal SRAM 中。



第三级 bootloader:uboot.img,C代码的入口。



其中第一级 bootloader 是板子固化的,第二级和第三级是通过编译 uboot 所得的。





2,[b]第二级 bootloader:MLO(SPL)做了哪些事情?[/b]

MLO(SPL)内存分布如下:





SPL内存重映射:

    @1@ 保存启动参数bl    save_boot_params

问题:这些参数是保存在哪里的?大概有哪些参数?

答:

这些参数保存的内存地址为 64 KB 的 OCM RAM 中:





注:Dowloaded Image 区域:是用来保存 MLO(SPL) 文件的,其最大可达到 109 KB









    @a2@ 设置 CPU 为 SVC32 模式

   CPSR:程序状态寄存器(current program status register)(当前程序状态寄存器),在任何处理器模式下被访问。它包含了条件标志位、中断禁止位、当前处理器模式标志以及其他的一些控制和状态位。

CPSR在用户级编程时用于存储条件码。

  SPSR:程序状态保存寄存器(saved program statusregister),每一种处理器模式下都有一个状态寄存器SPSR,SPSR用于保存CPSR的状态,以便异常返回后恢复异常发生时的工作状态。当特定的异常中断发生时,这个寄存器用于存放当前程序状态寄存器的内容。在异常中断退出时,可以用SPSR来恢复CPSR。由于用户模式和系统模式不是异常中断模式,所以他没有SPSR。当用户在用户模式或系统模式访问SPSR,将产生不可预知的后果。

CPSR格式如下所示。SPSR和CPSR格式相同。

31 30 29 28 27 26 7 6 5 4 3 2 1 0

N Z C V Q DNM(RAZ) I F T M4 M3 M2 M1 M0

详解:http://blog.chinaunix.net/uid-28458801-id-3487199.html

    @a3@ CPU的初始化

问题:CPU的初始化有哪些内容?

答:

           @b1@ 首先要设置堆栈区,因为将会调用 C函数来实现CPU的初始化


问题:这个堆栈在什么位置,其内存大小是多少?














           @b2@ 执行 s_init() 函数,实现 CPU 的初始化

                   @c1@
使能第二级缓冲区




                   @c2@
关闭看门狗(WDT)















                   @c3@
给外设设置好 PLL 和 时钟频率等







                   @c4@
使能 32-KHz 频率的实时时钟






                   @c5@
使能UART0




                   @c6@
初始化 定时器






                   @c7@
初始化控制台,通过UART可以查看相关信息


                   @c8@
配置 DDR




                   @c
DONE@


           @b DONE@

    @a4@ 设置 internal RAM 内存空间的栈指针,调用 board_init_f()函数

    @a5@ 代码重定位

[b]代码重定向,它首先检测自己(MLO)是否已经在内存中:[/b]

如果是直接跳到下面的堆栈初始化代码 clear_bss。

如果不是就将自己从Nor Flash中拷贝到内存中。

Nor Flash 和Nand Flash 本质区别就在于是否进行代码拷贝,也就是下面代码所表述:无论

是Nor Flash 还是Nand Flash,核心思想就是将 uboot 代码搬运到内存中去运行,但是没有拷

贝bss 后面这段代码,只拷贝bss 前面的代码,bss 代码是放置全局变量的。Bss 段代码是为

了清零,拷贝过去再清零重复操作。


    @a6@ 清空 bss 段

    @a7@ 调用函数 board_init_r,用以完成 MLO(SPI)阶段的所有初始化,并跳转到 uboot.img 阶段

    @a DONE@

3,[b]第三级 bootloader:uboot.img做了哪些事情?[/b]

uboot.img 内存分布如下:





访问/arch/arm/lib/board.c 中
board_init_f() 函数


在 uboot.img 运行过程中,有两个非常重要的结构体:gd_t 和 bd_t 。

其中 gd_t :global_data

数据结构的定义,位于:/arch/arm/include/asm/global_data.h 中。

                 其成员主要是一些全局的系统初始化参数。

其中 bd_t :bd_info 数据结构的定义,位于:/arch/arm/include/asm/u-boot.h 中。

                 其成员是开发板的相关参数。

其中 DECLARE_GLOBAL_DATA_PTR 宏定义在系统初始化过程中会被频繁调用,

的作用是,声明gd这么一个全局的指针,这个指针指向gd_t结构体类型,并且这个gd指针是保存在ARM的r8这个寄存器里面的。



uboot.img 第一个运行的文件还是 start.o,其在运行访问的 board_init_f() 函数定义在 /arch/arm/lib/board.c 中:

因此,系统初始化参数将会被保存在 (保存 MLO(SPL)文件的内存空间的)末尾 2 KB 处。

通过计算的 gb 指针指向的内存空间地址为 gb = 0x4030B000



gb_t 结构体中某些元素的值是来自于 uboot.img's header,这个header的数据保存在内存的0x807FFFCO,大小为 64字节

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  AM335X u-boot linux arm