• 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            主循环



  • 相关阅读:
    vue中sessionStorage的使用
    SQLserver将查询的字段中的数据 拼接成字符串用逗号隔开
    vue中引入百度地图
    已拦截跨源请求:同源策略禁止读取位于XXX的远程资源。(原因:CORS 头缺少 'Access-Control-Allow-Origin'
    前台调用微信接口成功还报Network Error
    SpringBoot获得application.properties中数据的几种方式
    设置session销毁时间
    Linux基本命令-ls
    Linux基础命令-cd
    Linux基础命令-mkdir
  • 原文地址:https://www.cnblogs.com/PengfeiSong/p/6401371.html
Copyright © 2020-2023  润新知