• 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 }
  • 相关阅读:
    python编写规范
    我们分析了400位华语歌手的歌词,发现人们重点关注的人事物情
    外部厂商公开工具
    OSI七层与TCP/IP五层网络架构详解
    npm run dev--The 'mode' option has not been set, webpack will fallback to 'production' for this value
    webpack-dev-server --inline --progress --config build/webpack.dev.conf.js
    PPTV(pplive)_forap_1084_9993.exe 木马清除经历
    【转】【Nginx】Nginx 入门教程 + 常用配置解析
    【转】【Python】Python 中文编码报错
    【Centos】systemd入门教程
  • 原文地址:https://www.cnblogs.com/wrjvszq/p/4242731.html
Copyright © 2020-2023  润新知