u-boot

本文详细介绍了U-Boot的编译过程,包括配置mx28_evk_config、编译步骤,以及启动流程的关键步骤,如设置SVC模式、内存初始化、内核加载与启动。重点讲解了第一阶段和第二阶段的代码执行,以及uboot获取的不同途径和定制化选项。
摘要由CSDN通过智能技术生成


前言

U-BOOT功能:启动内核
流程:
1、硬件相关初始化: | 开发功能:
关闭看门狗 | 烧写flash
初始化时钟 | 网卡
初始化SDRAM | USB
| 串口
从Flash读出内核到SDRAM
启动内核


一、uboot编译过程

make   disclean      //清楚依赖
make    mx28_evk_config     //配置
make   //编译

1、配置过程:

Makefile 找到 mx28_evk_config
执行: @$(MKCONFIG) $(@:_config=) arm arm926ejs mx28_evk freescale mx28
== mkconfig mx28_evk arm arm926ejs mx28_evk freescale mx28
mkconfig :当前目录下的脚本,里面生成一些软连接(include/asm、asm-arm/arch、asm-arm/proc)和include/config.mk和include/config.h
在这里插入图片描述config.mk
在这里插入图片描述config.h

2、编译过程

最重要文件 start.S 和 u-boot.lds 和 起始地址 0x41008000
start.S:uboot汇编启动文件(第一阶段)
u-boot.lds:uboot存放在存储器的结构
0x41008000:开始存放uboot的地址
1、包含配置生成的config.mk ,并export 出去
在这里插入图片描述
2、OBJS、LIBS
在这里插入图片描述
----OBJS = cpu/arm926ejs/start.o
在这里插入图片描述
----LIBS:把涉及到单板的lib*.a连接起来

3、make
①、生成u-boot.bin:在这里插入图片描述
②、u-boot.bin 依赖于 uboot:
在这里插入图片描述
③、u-boot:链接之前OBJS、LIBS

在这里插入图片描述
生成跟之前对应如下:最重要的是链接脚本u-boot.ldsstart文件
在这里插入图片描述
生成链接指令 :
在这里插入图片描述
uboot程序存放位置:
在这里插入图片描述

④、u-boot.lds链接脚本 从哪个地址处开始存放各种段、先存放start.o文件,此文件由start.S汇编文件生成 0x41008000:uboot存放的起始地址
在这里插入图片描述

二、UBOOT第一阶段

设置SVC模式
flush cache、tlb
关闭mmu cache
初始化SDRAM
设置栈
从Flash把uboot代码拷到SDRAM(重定位)
清bss段
调用start_armboot(进入第二阶段)lib_arm/board.c

设置栈格式:
uboot
0x33F80000
MALLOC_LEN
GBL_DATA_SIZE
IRQ
FIQ
12
sp

三、UBOOT第二阶段

start_armboot 函数里面为主要逻辑
1、gd结构体指针 uboot 需要使用到的全局变量 里面有一个db结构体存放板级相关的信息 bi_arch_number(机器ID)、bi_boot_params(环境参数地址、mem大小bootargs参数保存在一个地址供内核去使用)

2、init_fnc_ptr = init_sequence 外设初始化工作,init_sequence存放外设的函数指针
3、各类硬件初始化。
1-3详细信息参考
4、进入死循环 main_loop 进行倒计时 命令解析 执行
在倒计时内如果没有打断就会执行 bootcmd后的内容. 通过调用run_command
否则进入uboot阶段,核心UBOOT命令通过 getenv、run_command、readline 进行读、执行指令。

5、启动内核就是去执行bootcmd的指令
bootcmd = nand |read.jffes | 内核存放在SDRAM地址 | NANDFLASHkernel分区 ; bootm |内核存放在SDRAM地址

run_command 去解析此命令成两部分 (;作为分界) :
①、从Flash读内核到SDRAM
执行 nand 指令、存放地址为uimage的加载地址(ih-addr)-64作为此地址 ih-ep(内核入口地址,之后bootm 中的thekernel会调用此地址的函数)
②、启动内核
分为2阶段 :
一、设置TAG (设置环境参数比如内存大小,bootargs重中之中:root、roottype、console、init 一个程序linuxrc) 设置换环境参数后进入二

二、启动 thekernel(0,机器id bi_arch_number,环境参数地址bi_boot_params)
thekernel 指针指向 内核入口地址ih-ep 通过R0、1、2寄存器传递环境参数。R0=0,R1为机器id用来内核跟板子进行匹配 成功才能运行。R2 为SDRAM存放环境参数的地址,因为内核要知道板的环境如内存、需要挂载文件系统类型、控制终端那一个波特率多少、第一个执行程序。

四、uboot获取

1、uboot官网:缺点就是支持少,比如某一款具体芯片驱动等不完善
2、SOC厂商:从官网下载某uboot进行加上相应soc以及驱动,这就是soc厂商定制版uboot。nxp官方的i.mx6ull evk板
3、做开发板厂商:参考soc厂商uboot。参考soc厂商的evk板。(做产品公司一般这样操作)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值