前言
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.lds 和 start文件
生成链接指令 :
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板。(做产品公司一般这样操作)