xunwei笔记5---uboot开发

//uboot开发
基本概念:
1)uboot是最通用的bootloader,适合x86,arm,powerpc;
2)vivi是三星针对自己的arm芯片(2440)开发的bootloader;
3)irom根据拨码开关决定从哪个外部存储器启动bootloader;
=================
4)sd卡和emmc都是含有ecc纠错机制的,sd卡连接到ch2,即芯片的mmc2系列引脚;
5)4412芯片具有nandflash纠错能力,硬件产生ECC,软件纠错;
=================
6)4412无需JTAG,因为irom支持tf卡启动,可以从tf卡启动uboot;jtag是给以前的芯片第一次烧写uboot使用的;
7)除了tf卡,还可以从usb存储器启动uboot;
8)uboot启动以后,才可以使用usb_otg;
9)BL1首先被检查校验和,然后验证数据,然后解码,然后被运行;
10)编译环境搭建和烧写命令:参考三星文档SEC_Exynos4x12_[SSCR][TC4]ICS_Installation_Guide_RTM1.0.2;
11)uboot流程解释文档:exynos4412_irom_secure_booting_guide_ver1.0;
12)BL1不是8kB了,更新为15kB;以《itop4412开发板教程》为准;
13)uboot镜像文件分为四部分:BL1(15K),BL2(16K),U-BOOT.bin(328K),TZSW(小于156K,用户自定义部分);
====================
第5讲:uboot源码目录分析:/home/topeet/android4.0/iTop4412_uboot/
1.all00_padding.bin,用0来补全。
2.api,常用的接口
3.board,常用的主板文件。只需要留下samsung/smdkc210目录
4.build_uboot.sh,编译脚本(直接执行该文件,即启动编译)
5.common,通用的文件,与架构无关的文件
6.config.mk,配置文件,后面详细分析
7.cpu,arm_cortexa9保留,其它去掉
8.CREDITS,工作人员名单
9.disk,实现磁盘分区的接口
10.doc,说明的文档
11.drivers,uboot中的驱动,mmc,看门狗,时钟等等
12.E4212,E4412_N.bl1.bin文件(8KB,BL1),可能没有用到它
13.examples,例程
14.fs,文件系统格式,使用ext2(或ext3)。
15.include,头文件,有用的只是asm-arm,其余可删除:
rm -rf asm-avr32 asm-blackfin asm-i386 asm-m68k asm-microblazeasm-mips asm-nios asm-nios2 asm-ppc asm-sh asm-sparc
16.lib*,(lib开头的目录),留下lib_arm,libfdt,lib_generic
rm -rf lib_avr32 lib_blackfin lib_i386 lib_m68k lib_microblaze lib_mips lib_nios lib_nios2 lib_ppc lib_sh lib_sparc
17.MAINTAINERS,MAKEALL不用管。Makefile很重要,mkconfig配置文件要详细分析。mkbl2 编译的时候看一下。
18.onenand_ipl和nand_spl,没用
19.net,网络驱动
20.paddingaa,补丁,作用未知,留着
21.post,自检,应该没什么用,留着
22.rules.mk脚本编译的规则说明;readme.txt,README说明文档
23.sdfuse和sdfuse_q sd卡烧写相关
24.tc4_cmm.cmm和uboot_readme.txt文件,三星tc4开发板的文档
25.tools,编译烧写等等工具
26.CodeSign4SecureBoot_POP和CodeSign4SecureBoot_SCP,对应SCP和POP核心板,uboot中和安全相关的加密文件
===========================
第6讲:uboot编译脚本文件分析:(build_uboot.sh文件)
(编译命令:./build_uboot.sh SCP_1GDDR,也就是执行该文件,再加一个描述参数)
4-10行
脚本的条件判断,判断是否有参数传进去,没有参数,则打印退出。

12-29行
条件判断
配置参数sec_path和CoreBoard_type
以SCP1G为例,脚本的$1 =SCP_1GDDR
sec_path="../CodeSign4SecureBoot_SCP/"
CoreBoard_type="SCP"

32行
CPU核数
ROOT_DIR=CUR_DIR等于当前目录pwd

39-43行
设置distclean参数
删除两个文件

45-50行
clean相关

52-57行
需要../CodeSign4SecureBoot_SCP/
60-91行
条件判断,然后执行
make itop_4412_android_config_scp_1GDDR
Makefile文件(后面详细分析)
93行
make -j4 多核编译,4核,与虚拟机设置配套,虚拟机CPU核心数小于实际电脑核心数
95-101行
判断checksum_bl2_14k.bin是否存在

103-105行
拷贝文件checksum_bl2_14k.bin和u-boot.bin
删除checksum_bl2_14k.bin

107行
进入“../CodeSign4SecureBoot_SCP/”目录

114-128行
CoreBoard_type= SCP
cat生成u-boot-iTOP-4412.bin镜像

130行
拷贝到编译目录

132-134行
删除文件checksum_bl2_14k.bin和u-boot.bin

合并文件,使用cat命令:
cat
E4412_N.bl1.SCP2G.bin 15K
bl2.bin 14K
all00_padding.bin 2K 14K+2K=16K
u-boot.bin 328K
tzsw_SMDK4412_SCP_2GB.bin 155k <=156K
> u-boot-iTOP-4412.bin 514k<515k

pop板的uboot组成:
bl1 =8K(使用老版本BL1)
bl2 = 16K
u-boot.bin 328K
E4412.TZ.SSCR.EVT1.1.bin 87k<=92k

TZSW----trust zone soft ware
各文件大小参见:SEC_Solution_Training_doc_uboot_mr_structure.pdf
======================
第7讲:makefile文件调用的配置文件---mkconfig文件分析
该文件作用:
创建平台相关的链接文件,创建config.mk文件,创建config.h文件;在执行makefile时,总是先执行该配置文件;
该文件是根据makfile文件中的配置指令执行的,在执行makefile的"make 参数"指令时,该配置指令是:
mkconfig itop_4412_android arm arm_cortexa9 smdkc210 samsung s5pc210 SCP_1GDDR

11-13行
定义两个变量,没有赋值
15行
打印一串字符串
17-28行
条件语句
赋值 BOARD_NAME="itop_4412_android"
30行-38行
判断参数是否为0,为零则执行
40行
重复赋值BOARD_NAME="itop_4412_android"
42-43行
$#表示参数
-lt表示大于
-gt表示小于
45-48行
判断是否为arm架构,不是则退出
50行
打印一串字符串
55-71行
如果SRCTREE和OBJTREE相等,删除asm目录,然后执行70行:
ln -s asm-arm asm,建立硬链接的asm目录,用asm指向asm-arm,以后代码中使用asm目录即可
(使用ls -l asm命令查看指向是否实现)
ln指令相关资料:https://blog.csdn.net/soaringlee_fighting/article/details/78770797
73行
rm -f asm-arm/arch(删除目录)
75-79行
ln -s arch-s5pc210 asm-arm/arch
81-84行
ln -s proc-armv asm-arm/proc
89-95行
新建config.mk文件,并将下列内容打印到config.mk文件
ARCH = arm
CPU = arm_cortexa9
BOARD = smdkc210
VENDOR = samsung
SOC = s5pc210
追加CORE = SCP(109行)
98-102行
给目录变量赋值,板卡目录为:
BOARDDIR=samsung/smdkc210
107-121行
建立链接文件
ln -sf /board/samsung/smdkc210/lowlevel_init_SCP.S /board/samsung/smdkc210/lowlevel_init.S
ln -sf /cpu/arm_cortexa9/s5pc210/cpu_init_SCP.S /cpu/arm_cortexa9/s5pc210/cpu_init.S
127-132行
创建config.h
/* Automatically generated - do not edit */
135-137行
没用
141行
向config.h中输出一行:#define CONFIG_SCP_1GDDR
144-147行
向config.h中输出四行:
#define CONFIG_BOARDDIR board/samsung/smdkc210
#include <config_defaults.h>
#include <configs/$BOARD_NAME.h>
#include <asm/config.h>
===========================
第8讲:makefile文件分析
24-34行
版本相关等
36-44行
运行一下其shell命令,得到HOSTARCH=x86_64,即主机的平台
45-46行
HOSTOS= linux,主机的操作系统
48-51行
SHELL=/bin/bash
53行
设置环境变量参数
HOSTARCH HOSTOS SHELL
56行
定义一个变量VENDOR
59-64行
Allow for silent builds
允许编译的时候不打印信息
88-92行
编译的时候输入参数
94-95行
设置saved-output等于当前目录
97-109行
设置环境变量 TOPDIR SRCTREE OBJTREE
111行
MKCONFIG设置为当前目录下的mkconfig
114-117行
设置环境变量REMOTE_BUILD
122-129行
设置环境变量obj src
127行
不用管
137-140行
不用管
145-147行
包含的预编译的宏
进一步了解,可百度关键词:include/autoconf.mk
150-151行
环境变量ARCH CPU BOARD VENDOR SOC
152-200行
配置编译器
203行
include $(TOPDIR)/config.mk(config.mk决定编译哪些文件)
功能类似于“gcc-xx xx.x xxx.xx …… -I include<libxx.a> -o xxx”里面指定哪些编译文件
这里才是真正的Makefile文件功能。
205行
start必须先运行
221-325行
包含的各种库

331行 ALL所指定的文件都要编译出来
ALL+=$(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND) $(U_BOOT_ONENAND)
332行
目标是生成u-boot.bin
u-boot.bin(二进制文件)依赖u-boot文件(elf文件)及其它文件
u-boot文件(elf文件)依赖:u-boot.lds,以及GEN_UBOOT:

u-boot: depend $(SUBDIRS) $(OBJS) $(LIBBOARD) $(LIBS) $(LDSCRIPT) $(obj)u-boot.lds
$(GEN_UBOOT) -O
GEN_UBOOT文件又依赖u-boot:
GEN_UBOOT:UNDEF_SYM=`$(OBJDUMP) -x $(LIBBOARD) $(LIBS) | \
sed -n -e 's/.*\($(SYM_PREFIX)__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) \
--start-group $(__LIBS) --end-group $(PLATFORM_LIBS) \
-Map u-boot.map -o u-boot

340-353行:u-boot.bin的处理,稍后讲解。
u-boot.map:编译过程的中间文件,里面有各种函数及其头文件

运行编译脚本(即./build_uboot.sh SCP_1GDDR),最后打印出来的命令的简化版本:
UNDEF_SYM=`gcc-xx -x lib*.a ;//首次编译,用了哪些库文件
gcc-xx -Bstatic -T u-boot.lds -Ttext 0xc3e00000 //再次编译,编译u-boot,指定uboot在内存运行的首地址,共64MB空间
$UNDEF_SYM cpu/arm_cortexa9/start.o --start-group lib*.a --end-group //定义了一堆库
-lgcc -Map u-boot.map -o u-boot//编译参数,生成u-boot文件,此处删除了前面的编译命令。
========================================
第9讲:u-boot.lds文件分析
(该文件的作用,将编译出来的各种库和文件链接在一起,组成u-boot.bin)
6行
0x00000000 +0xc3e00000
7行
以四字节对齐
8-14行
.text表示代码段
先放cpu/arm_cortexa9/start.o,这是uboot第一个运行的代码
然后是cpu/arm_cortexa9/s5pc210/cpu_init.o
最后是剩余的代码段
16-18行
.rodata,所有文件的只读数据段
18-19行
.data,所有文件的数据段
21行
.got,自定义段,没有使用
23-24行
.u_boot_cmd,uboot的命令段
25-27行
.bss,没有初始化的静态变量和全局变量
------------------------------
makefile文件340-353行:(是将u-boot.bin转为最终的含有BL1和BL2和TZSW的u-boot.bin)
将(临时的)u-boot.bin分解为14K大小的文件;(没有解释为什么要分解,也不是整除14K)
编译校验和程序和补零程序;
执行校验和程序;(校验14K大小)
执行补零程序;(只给临时的u-boot.bin补零,补成328K)
删除分解文件;(在build_uboot.sh脚本里删除了临时u-boot.bin文件)
===================================
第10讲:uboot第1个执行的文件分析(cpu/arm_cortexa9/start.S)
(该文件主要是汇编语言)
57-65行
中断向量设置
58行跳转到reset到184行
194-197行
设置CPU在SVC工作模式,获取最高等级的权限
201-216行
cache初始化
关闭cache
220-226行
关闭mmu(内存肯定不能用)
240-243行
读取OM状态
#define POWER_BASE 0x10020000
假设是eMMC启动,bit3=bit5=1 即读取值将为0x28
执行271行:如果OM状态为0x28,将#BOOT_EMMC441的值存入r3;
293行
初始化PLL(时钟)、复用口、内存
跳转到board/samsung/smdkc210/lowlevel_init文件中
296行
手机冷启动强制PS_HOLD输出高电平
301-304行
要准备调用C语言,从汇编到C语言必须设置堆栈
317-322行
判断程序是在eMMC中还是在内存中
不相等,直接执行后面的
326-332行
点亮两个灯
336-338行
延时
359-380行
367-368行,判断相等,跳到emmc441_boot行,即418行
418-433行
426行,调用emmc441_uboot_copy函数(是在bl2中),然后返回。
把uboot从emmc中拷贝到内存中(此时内存不能用,因为mmu是关闭的)
428-433行:如果拷贝失败,则去tf卡中找uboot
441-467行
使能MMU(代码已经在内存中,内存打开可以使用)
跳转到内存中
481-491行
堆栈设置以及初始化
509行
start_armboot跳到c语言
汇编阶段完成,到C语言阶段
---------------------------------
注释小技巧:
#if 0 //此处是0,所以代码不被执行
执行代码
#endif
========================================

posted @ 2021-12-11 16:43  随风而释  阅读(451)  评论(0)    收藏  举报