1 uboot 的版本的选择。
疑问: uboot 的社区会有代码,这里也会有一些 板卡的代码合入 社区, 但是 有时候 cpu 厂商也会 单独拉出一份 开源代码 来维护。
也就是说, 你有两种下载方式,一种是下载uboot 社区的代码,还有一种是下载cpu 厂商的 维护的uboot 的代码,这两种方式的 代码下载的地址是不一样的。
总结: 我觉得他们是有交集的。
这是 arm 设计的 目录是 arch/arm/cpu .
这是 三星设计的,目录是 /board/sumsang/
接下来是关于 spl 的 内容。
先来看一下 关于 6410 的手册。
注意: 这里 看上去 bl1 与 bl2 是两个东西,实际上 bl2= bl1+xxxx= uboot.
bl1 是 Uboot 的前 8K,
首先加载到sram , 然后初始化 内存。
然后加载 整个uboot 到内存。
然后跳转到 内存,然后判断试一下 如果在内存,就跳转到 8K之后运行。
这里的os 指的是 kernel。
我觉得 他后面讲的 goni 开发板就是这种方式。
然后来看一下 V210 的。
注意: 这个时候 实际上 ,uboot 出现了 spl.bin , 此时 , bl2 就不等于 bl1+xxx .了, bl1 与 bl2 通过宏定义成了两个不同的东西。
uboot 还是采用的 6410 的加载方式,只不过镜像不一样了。
接下来是 异常向量 + 地址映射问题。
在 sram 中 三星自己 在 内存中 有开辟一段区域 专门用于存放 中断向量表。
如下图:
当bl1 在运行过程中,如果 出现异常了。
那么 cpu 会自动到 0xD003_7400 去寻找 异常向量表。
这个是 硬件自动完成了,不需要设置。
我们需要做的就是 将异常向量表 拷贝到这个地方。
疑问: 但是程序中有 拷贝的动作吗?
那么如果 要是在 DRAM 中呢?
cp15 协处理器 的 VBAR 专门用于设置 dram 的 中断向量表地址。
也就是说 我只要 把 异常向量表的地址 ,写入掉 VBAR 寄存器就可以了。
然后是关于ENTRY 的展开。
u-boot.lds 中的 ENTRY 的定义是在。
include/linux/linkage.h
64 #define ENTRY(name) \
1 ▎ .globl SYMBOL_NAME(name); \
2 ▎ LENTRY(name)
3 ▎
然后 SYMBOL_NAME(name) 的定义是。
#define SYMBOL_NAME(X) X
然后 LENTRY(name) 的定义是。
6 #define LENTRY(name) \
5 ▎ ALIGN; \
4 ▎ SYMBOL_NAME_LABEL(name)
ALIGN 的定义如下:
#define ALIGN __ALIGN
__ALIGN 的定义如下:
10 #ifndef __ALIGN
9 #define __ALIGN .align 4
8 #endif
SYMBOL_NAME_LABEL(name) 的定义如下:
21 #ifdef __STDC__
20 #define SYMBOL_NAME_LABEL(X) X##:
19 #else
18 #define SYMBOL_NAME_LABEL(X) X:
17 #endif
这里没有定义 __STDC__
所以是 后面的内容。
最终 的代码 展开就是这样的。
#define ENTRY(name)
.globl (name);
.align 4;
(name):
总结: 就是定义了一个段,并且把这个段导出到全局变量了。
然后是关于CPSR寄存器的说明。
总结: 这个寄存器的主要作用就是 , 开关中断,并且设置 程序的 运行模式。
它的东西可以保存到 SPSR中。
然后是关于 CP15 协处理器的说明。
总结一下:
1 cp 是一组 协处理器。
2 cp15 自己就是很多个寄存器的集合。
3 操作 cp15 使用的是 MRC 与MCR。
对于 cp15 以 s5pv210 的 uboot 的这段代码 为例。
12 /*
11 ▎* Setup vector:
10 ▎* (OMAP4 spl TEXT_BASE is not 32 byte aligned.