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语言-if语句
    C语言-表达式
    C语言-基础
    Java for LeetCode 187 Repeated DNA Sequences
    Java for LeetCode 179 Largest Number
    Java for LeetCode 174 Dungeon Game
    Java for LeetCode 173 Binary Search Tree Iterator
    Java for LeetCode 172 Factorial Trailing Zeroes
    Java for LeetCode 171 Excel Sheet Column Number
    Java for LeetCode 169 Majority Element
  • 原文地址:https://www.cnblogs.com/PengfeiSong/p/6401371.html
Copyright © 2011-2022 走看看