Bootloader
Bootloader 以其本身的含义来讲就是下载和启动系统,它类似于 PC 中的 BIOS,大部
分芯片厂商所提供的嵌入式系统都提供有这样的程序,而且都比较成熟,大可不必自行编写。
为研究其工作原理,清扫上个章节裸机程序中的知识盲点,本章节将通过vivi单独介绍Bootloader的技术细节。vivi由三星提供,韩国 mizi 公司原创,开放源代码,必须使用 arm-linux-gcc 进行编译,主要适用于三星 S3C24xx 系列 ARM 芯片,用以启动 Linux 系统,支持串口下载和网络文件系统启动等常用简易功能。
vivi编译源码
vivi需要在linux环境下编译。本文给出的viv源码交叉编译器版本为arm-linux-gcc-2.95.3。从官网下载gcc,解压到/usr/local/arm/2.95.3目录。下载vivi-20090630.tar.gz,解压到合适目录。cd进入vivi目录,输入make命令进行编译。编译完成后生成vivi二进制文件,使用jlink或者其他BootLoader将其烧录到nand flash中。
vivi源码解析(一)
vivi源码目录层次结构如下:
arch目录包含了芯片启动初始化相关代码。drivers目录为外设相关的驱动代码,包括FLASH、以太网、串口。init目录包含了main主程序和版本信息相关代码。其他目录包含的工具相关的辅助代码 |
首先解析‘vivi/arch/s3c2440/head.S’这个汇编文件。该文件是芯片上电后最开始执行的代码。地址为0x00000000。从下一章节“Nand Flash驱动”章节可知,上电后,硬件会自动将nand flash中前4K代码加载到内部的SRAM缓冲区中运行,映射的起始地址为0x00000000。此处的head.S即对应前4K代码。因Flash内部的SRAM缓冲区只有4K,无法存放bootloader全部功能的代码,故该缓存区代码主要功能是将Nand Flash中存储的vivi代码全部复制到SDRAM中,让其具备足够的内存空间运行。
1 #include "config.h"
2 #include "linkage.h"
3 #include "machine.h"
4 #define CONFIG_DEBUG_LL
5 #define CONFIG_SERIAL_UART0 1
6 ENTRY(_start)
7 ENTRY(ResetEntryPoint)
8 @ 0x00: Reset
9 b Reset
10
11 UndefEntryPoint:
12 b HandleUndef
13
14 SWIEntryPoint:
15 b HandleSWI
16
17 PrefetchAbortEnteryPoint:
18 b HandlePrefetchAbort
19
20 DataAbortEntryPoint:
21 b HandleDataAbort
22
23 NotUsedEntryPoint:
24 b HandleNotUsed
25
26 IRQEntryPoint:
27 b HandleIRQ
28
29 FIQEntryPoint:
30 b HandleFIQ
31
32 @ 0x20: magic number so we can verify that we only put
33 .long 0
34 @ 0x24:
35 .long 0
36 @ 0x28: where this vivi was linked, so we can put it in memory in the right place
37 .long _start
38 @ 0x2C: this contains the platform, cpu and machine id
39 .long ARCHITECTURE_MAGIC
40 @ 0x30: vivi capabilities
41 .long 0
42 #ifdef CONFIG_PM
43 @ 0x34:
44 b SleepRamProc
45 #endif
46 #ifdef CONFIG_TEST
47 @ 0x38:
48 @ b hmi
49 #endif
50 Reset:
51 @ disable watch dog timer
52 mov r1, #0x53000000
53 mov r2, #0x0
54 str r2, [r1]
55 @ disable all interrupts
56 mov r1, #INT_CTL_BASE
57