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字节
参考文件:
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内存重映射:
答:
这些参数保存的内存地址为 64 KB 的 OCM RAM 中:
注:Dowloaded Image 区域:是用来保存 MLO(SPL) 文件的,其最大可达到 109 KB
@a2@ 设置 CPU 为 SVC32 模式
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的初始化
答:
@b1@ 首先要设置堆栈区,因为将会调用 C函数来实现CPU的初始化
问题:这个堆栈在什么位置,其内存大小是多少?
答
@b2@ 执行 s_init() 函数,实现 CPU 的初始化
使能第二级缓冲区
@c2@
关闭看门狗(WDT)
@c3@
给外设设置好 PLL 和 时钟频率等
@c4@
使能 32-KHz 频率的实时时钟
@c5@
使能UART0
@c6@
初始化 定时器
@c7@
初始化控制台,通过UART可以查看相关信息
配置 DDR
@c
DONE@
@b DONE@
@a4@ 设置 internal RAM 内存空间的栈指针,调用 board_init_f()函数
[b]代码重定向,它首先检测自己(MLO)是否已经在内存中:[/b]
如果是直接跳到下面的堆栈初始化代码 clear_bss。
如果不是就将自己从Nor Flash中拷贝到内存中。
Nor Flash 和Nand Flash 本质区别就在于是否进行代码拷贝,也就是下面代码所表述:无论
是Nor Flash 还是Nand Flash,核心思想就是将 uboot 代码搬运到内存中去运行,但是没有拷
贝bss 后面这段代码,只拷贝bss 前面的代码,bss 代码是放置全局变量的。Bss 段代码是为
了清零,拷贝过去再清零重复操作。
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 中。
其成员是开发板的相关参数。
其的作用是,声明gd这么一个全局的指针,这个指针指向gd_t结构体类型,并且这个gd指针是保存在ARM的r8这个寄存器里面的。
uboot.img 第一个运行的文件还是 start.o,其在运行访问的 board_init_f() 函数定义在 /arch/arm/lib/board.c 中:
通过计算的 gb 指针指向的内存空间地址为 gb = 0x4030B000
gb_t 结构体中某些元素的值是来自于 uboot.img's header,这个header的数据保存在内存的0x807FFFCO,大小为 64字节
相关文章推荐
- 转:AM335x启动流程(BootRom->MLO->Uboot)
- AM335x启动流程(BootRom->MLO->Uboot)
- AM335x启动流程(BootRom->MLO->Uboot)
- AM335x启动流程(BootRom->MLO->Uboot)
- AM335x启动流程(BootRom->MLO->Uboot)
- AM335x启动流程(BootRom->MLO->Uboot)
- AM335x启动流程(BootRom-> MLO->的Uboot)
- [UBOOT] AM335x 启动流程(u-boot-2011.09)
- 什么是JTAG,U-BOOT的启动流程及移植,如何正确使用ads(axd)
- 14.3 U-Boot启动流程分析
- U-BOOT的启动流程及移植
- mips平台的u-boot启动流程
- U-BOOT的启动流程及移植
- 正式学习bootloader,基于u-boot1.1.4(启动流程框架)
- arm linux 启动流程之 ppcboot
- u-boot移植随笔:u-boot启动流程简图
- u-boot启动流程一
- u-boot系统启动流程
- u-boot启动流程
- U-BOOT的启动流程