zoukankan      html  css  js  c++  java
  • u-boot分析(十)----堆栈设置|代码拷贝|完成BL1阶段

    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  栈帧:每个进程程对应一个栈空间,进程中的函数会在该栈空间分配到一个属于自己的空间,该空间就是栈帧。栈帧有边界,上边界是FPr11),下边界是SPr13)。

    注:arm采用的是满降栈

    3.       如何初始化

    栈的初始化比较简单,我们只要将SP指针指向内存中的某地址即可。在此就不过多分析

     

    1 call_board_init_f:
    2     ldr    sp, =(CONFIG_SYS_INIT_SP_ADDR)
    3     bic    sp, sp, #7 /* 8-byte alignment for ABI compliance */
    4     ldr    r0,=0x00000000

     

    l  复制BL2到内存,并跳到内存执行代码

    因为我们初始化了栈,所以此时完全可以用C语言完成我们代码的拷贝,整个过程也是相当简单的,代码也没有任何难度,所以在此不再分析。 

     1 void board_init_f_nand(unsigned long bootflag)
     2 {
     3         __attribute__((noreturn)) void (*uboot)(void);
     4         copy_uboot_to_ram_nand();
     5 
     6         /* Jump to U-Boot image */
     7         uboot = (void *)CONFIG_SYS_TEXT_BASE;
     8     (*uboot)();
     9         /* Never returns Here */
    10 }

     

     1 int copy_uboot_to_ram_nand (void)
     2 {
     3     int large_block = 0;
     4     int i;
     5     vu_char id;
     6 
     7     NAND_CONTROL_ENABLE();
     8         NAND_ENABLE_CE();
     9         NFCMD_REG = NAND_CMD_READID;
    10         NFADDR_REG =  0x00;
    11 
    12     /* wait for a while */
    13         for (i=0; i<200; i++);
    14     id = NFDATA8_REG;
    15     id = NFDATA8_REG;
    16 
    17     if (id > 0x80)
    18         large_block = 1;
    19 
    20     /* read NAND Block.
    21      * 128KB ->240KB because of U-Boot size increase. by scsuh
    22      * So, read 0x3c000 bytes not 0x20000(128KB).
    23      */
    24     return nandll_read_blocks(CONFIG_SYS_TEXT_BASE, COPY_BL2_SIZE, large_block);
    25 }
     1 static int nandll_read_blocks (ulong dst_addr, ulong size, int large_block)
     2 {
     3         uchar *buf = (uchar *)dst_addr;
     4         int i;
     5     uint page_shift = 9;
     6 
     7     if (large_block)
     8         page_shift = 11;
     9 
    10         /* Read pages */
    11         for (i = (0x6000>>page_shift); i < (size>>page_shift); i++, buf+=(1<<page_shift)) {
    12                 nandll_read_page(buf, i, large_block);//最终调用到了nand的页读
    13         }
    14 
    15         return 0;
    16 }
  • 相关阅读:
    leetcode 122. Best Time to Buy and Sell Stock II
    leetcode 121. Best Time to Buy and Sell Stock
    python 集合(set)和字典(dictionary)的用法解析
    leetcode 53. Maximum Subarray
    leetcode 202. Happy Number
    leetcode 136.Single Number
    leetcode 703. Kth Largest Element in a Stream & c++ priority_queue & minHeap/maxHeap
    [leetcode]1379. Find a Corresponding Node of a Binary Tree in a Clone of That Tree
    正则表达式
    十种排序算法
  • 原文地址:https://www.cnblogs.com/wrjvszq/p/4242731.html
Copyright © 2011-2022 走看看