S3C2410 bootloader ----VIVI阅读笔记

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

S3C2410 bootloader ----VIVI阅读笔记

建议读一读《嵌入式系统BootLoader技术内幕》(詹荣开著),google一下就会找到一片。什么是Bootloader就不再这里废话了,看看上面的文章就明了了。Bootloader有非常多种,如本文将要阅读的vivi,除此之外更有uboot,redboot,lilo等等。Vivi 是韩国mizi公司专门为三星s3c2410芯片设计的Bootloader。

先来看看vivi的源码树:

vivi-+-arch-+-s3c2410

|-Documentation

|-drivers-+-serial

|

…-mtd-+-maps

|

|-nor

|

…-nand

|-include-+-platform

| |-mtd

| …-proc

|-init

|-lib-+-priv_data

|-scripts-+-lxdialog

|-test

|-util

能google一下,搜到源码vivi.tar.gz。

前面提到的文件已系统的分析了bootloader的,这里就按原始码来具体说事。vivi也能分为2个阶段,阶段1的代码在arch/s3c2410/head.S中,阶段2的代码从init/main.c的main函数开始。

1.阶段1

阶段1从程式arch/s3c2410/head.S开始,按照head.S的代码执行顺序,一次完成了下面几个任务:

u

1、关WA TCH DOG (disable watch dog timer)

上电后,WATCH DOG默认是开着的

u

2、禁止所有中断(disable all interrupts)

vivi中不会用到中断,中断是系统的事,bootloader可不能去干这事的(不过这段代码实在多余,上电后中断默认是关闭的)

u

3、初始化系统时钟(initialise system clocks)

启动MPLL,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz,“CPU bus mode”改为“Asynchronous bus mode”。

u

4、初始化内存控制寄存器(memsetup)

S3c2410共有15个寄存器,在此开始初始化13个寄存器。

u

5、检查是否从掉电模式唤醒(Check if this is a wake-up from sleep)

若是,则调用WakeupStart函数进行处理。

u

6、点亮所有LED (All LED on)

点一下灯,通知外面的同志,告诉他们有情况发生。

u

7、初始化UART0 (set GPIO for UART & InitUART)

a.设置GPIO,选择UART0使用的引脚

b.初始化UART0,设置工作方式(使用FIFO)、波特率115200 8N1、无流控等。这可是使用串口和s3c2410通信的条件啊,在终端也要如此设置。

u

8、跳到内存测试函数(simple memory test to find some DRAM flaults)

当然要定义了CONFIG_BOOTUP_MEMTEST这个参数才会跳到内存测试。

u

9、如果定义了以Nand

flash方式启动(#ifdef

CONFIG_S3C2410_NAND_BOOT),则此时要将vivi所有代码(包括阶段1和阶段2)从Nand flash复制到SDRAM中(因为在Nand flash 中是不能执行程式的,他只能做为程式和数据的存储器,而Nor flash可就不同了,Nor

flash能执行程式,但贵是他发展得瓶颈):

a.设置nand flash控制寄存器

b.设置堆栈指针

c.设置即将调用的函数nand_read_ll的参数:r0=目的地址(SDRAM的地址),r1=源地址(nand flash的地址),r2=复制的长度(以字节为单位)

d.调用nand_read_ll进行复制

u

10、跳到bootloader的阶段2运行,亦即调用init/main.c中的main函数(get read to call C functions)

a.重新设置堆栈

b.设置main函数的参数

c.调用main函数

head.S有900多行,都是些arm汇编,看的云山雾罩,汇编看来是忘的差不多了,所以这部分代码也看的相当糙,只知道大概在干什么,至于个中缘由就不是非常了解。先学学arm汇编再回来看。

2.阶段2

从init/main.c中的main函数开始,终于步入C语言的世界了。Main函数总共有8步(8 steps),先看看原始码:

int main(int argc, char *argv[])

{

int ret;

/*

Step 1: */

putstr("\r\n");

putstr(vivi_banner);

//vivi_banner是vivi执行开始的显示信息,vivi_banner在文件version.c中定义

reset_handler();

/* Step 2: */

ret = board_init();

if (ret) {

putstr("Failed a board_init() procedure\r\n"); error();

}

/*Step 3: */

mem_map_init();

mmu_init();

putstr("Succeed memory mapping.\r\n");

/* Now, vivi

is running on the ram. MMU is enabled.

* Step 4: */

/* initialize the heap area*/

ret = heap_init();

if (ret) {

putstr("Failed initailizing heap region\r\n");

error();

}

/* Step 5:

MTD */

ret = mtd_dev_init();

/* Step 6: */

init_priv_data();

/* Step 7:*/

misc();

init_builtin_cmds();

/* Step 8:*/

boot_or_vivi();

return 0;

}

下面按照上面的步骤逐步来分析一下。

相关文档
最新文档