### 基于S3C2440的u-boot移植详解
#### 一、概述
u-boot(Universal Boot Loader)是一种广泛应用于嵌入式系统的引导加载程序,它支持多种处理器架构与各种嵌入式操作系统。u-boot的主要功能是初始化硬件环境并加载操作系统内核到内存中运行。本文将详细介绍如何基于S3C2440平台进行u-boot的移植工作,特别是对启动过程中的关键步骤进行了深入剖析。
#### 二、u-boot的启动过程
##### 2.1 Bootloader的启动过程分类
u-boot的启动过程可以分为两种类型:单阶段(Single-Stage)和多阶段(Multi-Stage)。其中,多阶段启动提供了更丰富的功能和更好的移植性。对于从固态存储设备启动的情况,通常采用的是两阶段启动过程。
##### 2.2 第一阶段(Stage 1)
第一阶段主要负责一些基本的硬件初始化工作,为后续阶段做好准备。具体步骤如下:
- **硬件设备初始化**:包括但不限于设置CPU的工作模式为管理模式、关闭WATCHDOG、设置FCLK、HCLK、PCLK的比例(即设置CLKDIVN寄存器)、关闭MMU和CACHE等。
- **准备RAM空间**:初始化内存芯片使其可用。对于S3C2440来说,在start.S文件中通过调用lowlevel_init函数来设置存储控制器,从而使外接的SDRAM可用。
- **复制第二阶段代码到RAM**:将第二阶段的代码复制到已经准备好的RAM空间中。
- **设置栈**:为了确保后续阶段的正常执行,需要正确地设置栈。
- **跳转到第二阶段入口点**:通过跳转指令跳转到第二阶段的C语言代码入口点。
##### 2.3 第二阶段(Stage 2)
第二阶段主要由C语言编写,能够实现更复杂的功能。这一阶段的任务包括:
- **初始化所需硬件设备**:进一步完善硬件初始化,如设置GPIO等。
- **检测系统内存映射**:获取内存布局信息。
- **加载内核映像**:将内核映像从Flash读取到RAM空间中。
- **设置启动参数**:为内核启动做必要的配置。
- **调用内核**:最终启动操作系统内核。
#### 三、S3C2440上的u-boot启动过程分析
针对S3C2440平台,我们将详细介绍u-boot第一阶段的实现细节。
##### 3.1 硬件初始化
硬件初始化部分主要包括以下步骤:
- **设置异常向量**:通过修改程序计数器(PC),设置不同类型的异常向量地址。
- **CPU进入SVC模式**:通过修改当前程序状态寄存器(CPSR)中的模式位,使CPU进入管理模式。
- **设置控制寄存器地址**:根据不同的S3C2400系列处理器,设置WTCON、INTMSK和CLKDIVN等控制寄存器的地址。
##### 3.2 设置异常向量
在start.S文件中,通过以下步骤设置异常向量:
```assembly
.globl_start
_start: breset
/* 复位向量 */
ldr pc,_undefined_instruction
/* 未定义指令向量 */
ldr pc,_software_interrupt
/* 软件中断向量 */
ldr pc,_prefetch_abort
/* 预取指令异常向量 */
ldr pc,_data_abort
/* 数据操作异常向量 */
ldr pc,_not_used
/* 未使用向量 */
ldr pc,_irq
/* IRQ中断向量 */
ldr pc,_fiq
/* FIQ中断向量 */
```
通过这种方式,可以确保在特定条件下触发相应的异常处理程序。
##### 3.3 CPU进入SVC模式
通过以下指令使CPU进入管理模式:
```assembly
reset:
mrs r0, cpsr
bic r0, r0, #0x1f /* 清除模式位 */
orr r0, r0, #0xd3 /* 设置为管理模式 */
msr cpsr, r0
```
这一步骤对于后续的操作至关重要。
#### 四、结论
通过对u-boot在S3C2440平台上的移植过程的深入分析,我们不仅了解了u-boot的两个阶段的具体实现细节,还掌握了如何针对特定硬件平台进行适当的定制化开发。这对于理解嵌入式系统的启动过程以及如何进行有效的系统移植具有重要的意义。