u-boot分析(十)----堆栈设置|代码拷贝|完成BL1阶段
2015-01-22 21:11
316 查看
u-boot分析(十)
上篇博文我们按照210的启动流程,分析到了初始化nand flash,由于接下来的关闭ABB比较简单所以跳过,所以我们今天按照u-boot的启动流程继续进行分析。
今天我们会用到的文档:
1. 2440芯片手册:http://download.csdn.net/detail/wrjvszq/8358949
2. 6410芯片手册:http://download.csdn.net/detail/wrjvszq/8358965
3. 210芯片手册:S5PV210_UM_REV1.1(我的不知道为什么传不上去大家去百度搜吧)
4. Nand flash芯片手册:大家根据自己的nand flash芯片型号,找到对应的手册
今天我们会分析到以下内容:
1. 设置堆栈
2. 复制BL2到内存,并跳到内存执行代码
l 设置栈
1. 什么栈
相信学过数据结构的,都知道栈是一种先进后出的数据存储形式。
2. 基本概念
l 满栈:堆栈指针SP总是指向最后进栈的数据。(如下图)
l 空栈:SP总是指向下一个将要存放数据的空位置(如下图)
l 升栈:SP由低地址向高地址移动。(如下图)
l 降栈:SP由高地址向低地址移动。(如下图)
l 栈帧:每个进程程对应一个栈空间,进程中的函数会在该栈空间分配到一个属于自己的空间,该空间就是栈帧。栈帧有边界,上边界是FP(r11),下边界是SP(r13)。
注:arm采用的是满降栈
3. 如何初始化
栈的初始化比较简单,我们只要将SP指针指向内存中的某地址即可。在此就不过多分析
l 复制BL2到内存,并跳到内存执行代码
因为我们初始化了栈,所以此时完全可以用C语言完成我们代码的拷贝,整个过程也是相当简单的,代码也没有任何难度,所以在此不再分析。
上篇博文我们按照210的启动流程,分析到了初始化nand flash,由于接下来的关闭ABB比较简单所以跳过,所以我们今天按照u-boot的启动流程继续进行分析。
今天我们会用到的文档:
1. 2440芯片手册:http://download.csdn.net/detail/wrjvszq/8358949
2. 6410芯片手册:http://download.csdn.net/detail/wrjvszq/8358965
3. 210芯片手册:S5PV210_UM_REV1.1(我的不知道为什么传不上去大家去百度搜吧)
4. Nand flash芯片手册:大家根据自己的nand flash芯片型号,找到对应的手册
今天我们会分析到以下内容:
1. 设置堆栈
2. 复制BL2到内存,并跳到内存执行代码
l 设置栈
1. 什么栈
相信学过数据结构的,都知道栈是一种先进后出的数据存储形式。
2. 基本概念
l 满栈:堆栈指针SP总是指向最后进栈的数据。(如下图)
l 空栈:SP总是指向下一个将要存放数据的空位置(如下图)
l 升栈:SP由低地址向高地址移动。(如下图)
l 降栈:SP由高地址向低地址移动。(如下图)
l 栈帧:每个进程程对应一个栈空间,进程中的函数会在该栈空间分配到一个属于自己的空间,该空间就是栈帧。栈帧有边界,上边界是FP(r11),下边界是SP(r13)。
注:arm采用的是满降栈
3. 如何初始化
栈的初始化比较简单,我们只要将SP指针指向内存中的某地址即可。在此就不过多分析
call_board_init_f: ldr sp, =(CONFIG_SYS_INIT_SP_ADDR) bic sp, sp, #7 /* 8-byte alignment for ABI compliance */ ldr r0,=0x00000000
l 复制BL2到内存,并跳到内存执行代码
因为我们初始化了栈,所以此时完全可以用C语言完成我们代码的拷贝,整个过程也是相当简单的,代码也没有任何难度,所以在此不再分析。
void board_init_f_nand(unsigned long bootflag) { __attribute__((noreturn)) void (*uboot)(void); copy_uboot_to_ram_nand(); /* Jump to U-Boot image */ uboot = (void *)CONFIG_SYS_TEXT_BASE; (*uboot)(); /* Never returns Here */ }
int copy_uboot_to_ram_nand (void) { int large_block = 0; int i; vu_char id; NAND_CONTROL_ENABLE(); NAND_ENABLE_CE(); NFCMD_REG = NAND_CMD_READID; NFADDR_REG = 0x00; /* wait for a while */ for (i=0; i<200; i++); id = NFDATA8_REG; id = NFDATA8_REG; if (id > 0x80) large_block = 1; /* read NAND Block. * 128KB ->240KB because of U-Boot size increase. by scsuh * So, read 0x3c000 bytes not 0x20000(128KB). */ return nandll_read_blocks(CONFIG_SYS_TEXT_BASE, COPY_BL2_SIZE, large_block); }
static int nandll_read_blocks (ulong dst_addr, ulong size, int large_block) { uchar *buf = (uchar *)dst_addr; int i; uint page_shift = 9; if (large_block) page_shift = 11; /* Read pages */ for (i = (0x6000>>page_shift); i < (size>>page_shift); i++, buf+=(1<<page_shift)) { nandll_read_page(buf, i, large_block);//最终调用到了nand的页读 } return 0; }
相关文章推荐
- 对U-BOOT的第1阶段代码的分析
- U-Boot启动第二阶段代码分析
- 对U-BOOT的第1阶段代码的分析
- U-Boot启动第二阶段代码分析
- U-Boot 第二阶段代码分析
- Uboot优美代码赏析2:第一阶段_硬件平台启动start.s分析
- U-Boot启动第二阶段代码分析
- U-Boot启动第一阶段代码分析
- 对U-BOOT的第1阶段代码的分析
- U-Boot启动第一阶段代码分析
- U-Boot启动第二阶段代码分析
- U-Boot启动第二阶段代码分析
- u-boot源码分析 --- 启动第二阶段 ,基于2410 启动代码 分析
- U-boot第二阶段代码分析
- U-Boot启动第一阶段代码分析
- 分析 u-boot 的第一阶段代码(cpu/arm920t/start.S)
- U-Boot学习-第二阶段代码分析
- u-boot-2012.04.1 第一阶段分析 内存划分 代码重定位
- U-Boot启动第一阶段代码分析
- u-boot源码分析 --- 启动第二阶段 ,基于2410 启动代码 分析