zoukankan      html  css  js  c++  java
  • uboot两阶段代码分析

    1、启动过程特征总结
    (1)第一阶段为汇编阶段(start.s)、第二阶段为C阶段(board.c中的start_armboot 函数)
    (2)第一阶段在SRAM中、第二阶段在DRAM中
    (3)第一阶段注重SoC内部、第二阶段注重SoC外部Board内部

    2、移植时的注意点
    (1)x210_sd.h头文件中的宏定义
    (2)特定硬件的初始化函数位置(譬如网卡)

    start.s分析

    主要功能分析    
    头文件包含                  -28-
    启动代码的16字节头部占位           -49-
    (1)构建异常向量表              -58- (2)设置CPU为SVC模式             -149-
    设置L2、L1cache和MMU            -216-
    启动方式读取                 -224-
    设置栈(SRAM中的栈)             -280-(在sram中设置的栈)
    跳到lowlevel_init.S中执行lowlevel_init -288- (
    3)关看门狗                 lowlevel_init.S(-61-) (4)开发板供电置锁              lowlevel_init.S(100-104)
    判断当前代码执行位置             lowlevel_init.S(110-115)
    (5)时钟初始化                lowlevel_init.S(-118-) 配置值在x210_sd.h中
    (6)DDR初始化                lowlevel_init.S(-121-)
    (7)串口初始化并打印"OK"          lowlevel_init.S(-125-)
    (8)重定位                  -349-
    (9)建立映射表并开启MMU           -360-
    再次设置栈(ddr中)             -386-
    清bss                    -400-
    (10)跳转到第二阶段             -441-

    其中lowlevel_init.S中总共做了哪些事情:

    检查复位状态、IO恢复、关看门狗、开发板供电锁存、时钟初始化、DDR初始化、串口初始化并打印'O'、tzpc初始化、打印'K'。
    其中值得关注的:关看门狗、开发板供电锁存、时钟初始化、DDR初始化、打印"OK"

    第二阶段主要是对开发板级别的硬件、软件数据结构进行初始化。

    board.c中的start_armboot 函数
        init_sequence
            cpu_init    空的
            board_init    网卡、机器码、内存传参地址
                dm9000_pre_init            网卡
                gd->bd->bi_arch_number    机器码
                gd->bd->bi_boot_params    内存传参地址
            interrupt_init    定时器
            env_init
            init_baudrate    gd数据结构中波特率
            serial_init        空的
            console_init_f    空的
            display_banner    打印启动信息
            print_cpuinfo    打印CPU时钟设置信息
            checkboard        检验开发板名字
            dram_init        gd数据结构中DDR信息
            display_dram_config    打印DDR配置信息表
        mem_malloc_init        初始化uboot自己维护的堆管理器的内存
        mmc_initialize        inand/SD卡的SoC控制器和卡的初始化
        env_relocate        环境变量重定位
        gd->bd->bi_ip_addr    gd数据结构赋值
        gd->bd->bi_enetaddr    gd数据结构赋值
        devices_init        空的
        jumptable_init        不用关注的
        console_init_r        真正的控制台初始化
        enable_interrupts    空的
        loadaddr、bootfile     环境变量读出初始化全局变量
        board_late_init        空的
        eth_initialize        空的
        x210_preboot_init    LCD初始化和显示logo
        check_menu_update_from_sd    检查自动更新
        main_loop            主循环



  • 相关阅读:
    C#中Dictionary的用法及用途
    Spring AOP面向切面编程
    一般处理程序(.ashx)中使用Session
    HTTP 错误 500.0
    IIS7.5和IIS6网站权限配置与区别
    查找和排序-4.选择排序
    查找和排序-3.冒泡排序
    查找和排序-2.二分查找
    查找和排序-1.顺序查找
    汉诺塔问题
  • 原文地址:https://www.cnblogs.com/PengfeiSong/p/6401371.html
Copyright © 2011-2022 走看看