coldstart.S

coldstart.s实现如下功能:
1. Initialize all of the gpios based on the hardware design
2. Initialize the Cache and TLB
3. Setup the MPU frequence and MEM frequence
4. Initialize the DDRAM controller
5. load u-boot from SPI Flash to DDRAM

但load u-boot from SPI Flash to DDRAM如何实现呢?还没想明白。

2010/9/14 17:50:
今天终于明白了如何实现load u-boot from SPI Flash to DDRAM,方法是通过
spi_read (UBOOT_CODE_OFFSET, (size + UBOOT_CHECKSUM_LEN), (char *) buf);将u-boot的stage2部分的程序一边读出来,一边写到相应的RAM空间地址。
下面是以上方法的基本思路:
由于 Boot Loader 的实现依赖于 CPU 的体系结构,因此大多数 Boot Loader 都分为 stage1 和 stage2 两大部分。依赖于 CPU 体系结构的代码,比如设备初始化代码等,通常都放在 stage1 中,而且通常都用汇编语言来实现,以达到短小精悍的目的。而 stage2 则通常用C语言来实现,这样可以实现很复杂的功能,而且代码会具有更好的可读性和可移植性。

Boot Loader 的 stage1 通常包括以下步骤(以执行的先后顺序):

  • 硬件设备初始化。
  • 为加载 Boot Loader 的 stage2 准备 RAM 空间。
  • 拷贝 Boot Loader 的 stage2 到 RAM 空间中。
  • 设置好堆栈。
  • 跳转到 stage2 的 C 入口点。

Boot Loader 的 stage2 通常包括以下步骤(以执行的先后顺序):

  • 初始化本阶段要使用到的硬件设备。
  • 检测系统内存映射(memory map)。
  • 将 kernel 映像和根文件系统映像从 flash 上读到 RAM 空间中。
  • 为内核设置启动参数。
  • 调用内核。

为了获得更快的执行速度,通常把 stage2 加载到 RAM 空间中来执行,因此必须为加载 Boot Loader 的 stage2 准备好一段可用的 RAM 空间范围。
拷贝stage2 到 RAM 中 ,拷贝时要确定两点:(1) stage2 的可执行映象在固态存储设备的存放起始地址和终止地址;(2) RAM 空间的起始地址。
从 Flash 上拷贝 :由于像 ARM 这样的嵌入式 CPU 通常都是在统一的内存地址空间中寻址 Flash 等固态存储设备的,因此从 Flash 上读取数据与从 RAM 单元中读取数据并没有什么不同。用一个简单的循环就可以完成从 Flash 设备上拷贝映像的工作,比如:
while(count) {
*dest++ = *src++; /* they are all aligned with word boundary */
count -= 4; /* byte number */
};

感谢詹荣开 ,他的博客 “嵌入式系统 Boot Loader 技术内幕”给了我很大的启发。该博客地址是:https://www.ibm.com/developerworks/cn/linux/l-btloader/

;