zoukankan      html  css  js  c++  java
  • 第1阶段——uboot分析之硬件初始化start_armboot函数(5)

    start_armboot()分析:
    start.S初始化后跳转到start_armboot实现第2阶段硬件相关的初始化(烧写擦除flash,网卡驱动,usb驱动,串口驱动,从FLASH读内核,启动内核等)然后调用main_loop();实现u-boot环境参数设置(print),读内核,启动内核等

    start_armboot函数代码如下(位于u-boot-1.1.6/lib_arm/borad.c)

    void start_armboot (void)
    {
    ...
    for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) { //init_sequence:进入初始化序列,初始化CPU,GPIO,中断,环境,串口,设置SDRAM首地址和长度等
    if ((*init_fnc_ptr)() != 0) {
    hang ();
    }
    }
    
    size = flash_init (); //初始化NOR FLASH
    mem_malloc_init (_armboot_start - CFG_MALLOC_LEN); //初始化malloc(相当于C语言中的malloc()和free(),实现堆的分配和释放)
    nand_init();    //初始化NAND FLASH
    env_relocate (); //将环境参数[enviconment]迁移[relocate]到内存指定位置
    cs8900_get_enetaddr (gd->bd->bi_enetaddr); //初始化网络设备
    ....
    for (;;) {
    main_loop (); //死循环调用main_loop();
    }
    
    main_loop()分析(位于u-boot-1.1.6/common/main.c):
    环境参数设置,从flash读出内核,启动内核等
    void main_loop (void)
    {
    ...
    
    s = getenv ("bootdelay"); //char指针变量s指向bootdelay(开机倒计时)环境变量
    bootdelay = s ? (int)simple_strtol(s, NULL, 10) : CONFIG_BOOTDELAY; //这个CONFIG_BOOTDELAY全局变量等于3,表示bootdelay=3S、
    ...
    ...
    s = getenv ("bootcmd"); //char指针变量s指向bootcmd(command)环境变量
    ...
    ...
    if (bootdelay >= 0 && s && !abortboot (bootdelay)) { //当开机bootdelay秒内无串口输入时
    ...
    # ifndef CFG_HUSH_PARSER
    {
    printf("Booting Linux ...
    "); //启动 Linux ...
    run_command (s, 0); //执行bootcmd命令 s= getenv ("bootcmd");
    }
    ...
    }
    /*bootcmd:启动命令 */
    /*在uboot里输入print就会有这么一行"boodcmd=nand read .jffs2 0x30007FC0 kernel; bootm 0x30007FC0" */ 
    /*当在开机bootdelay秒内未有串口输入,则会执行bootcmd命令: */ 
    /*1.从NAND FLASH中读出内核到SDRAM的0x30007FC0中(nand read .jffs2 0x30007FC0 kernel) */ 
    /* 2.从0x30007FC0中启动内核 */
    ...
    ...
    run_command("menu", 0); //当开机bootdelay秒内有串口输入时,进入菜单界面,按q(queue)键退出
    ...
    ...
    for (;;) { //进入u-boot界面
    ...
    len = readline (CFG_PROMPT); //一直扫描串口输入的命令(以回车结尾)
    ...
    rc = run_command (lastcommand, flag); //执行串口输入的命令
    }
    ...
    }

    本章小结:

    uboot-第二阶段硬件初始化主要主要执行以下三个过程:
    1.启动内核(开机不按空格)
    {
    s = getenv ("bootcmd"); //char指针变量s指向bootcmd(command)环境变量
    run_command (s, 0); //执行bootcmd命令 run_command():执行命令函数
    }
    2.进入菜单(开机按空格)
    {
    run_command("menu", 0); //进入菜单界面,按q(queue)键退出
    }
    3.进入u-boot界面(退出菜单后)
    {
    len = readline (CFG_PROMPT); //一直扫描串口输入的命令(以回车结尾)
    rc = run_command (lastcommand, flag); //执行串口输入的命令
    }

    *上面三个过程都是执行了run_command()函数,所以u-boot核心在于执行命令。接下来开始分析u-boot怎么实现查找命令和制作命令。

  • 相关阅读:
    Day10
    Day9
    Day8
    Day 7
    Day-6
    java中的原子性
    java 原子性
    内存可见性
    JVM 常忘笔记
    JVM 解释执行 编译执行 JIT
  • 原文地址:https://www.cnblogs.com/lifexy/p/7309811.html
Copyright © 2011-2022 走看看