1、将uboot源码拷贝ubuntu中
1.在家目录创建一 -个demo文件夹
2.将en. SOURCES - stm32mp1- openstlinux-5.10- dunfell- mp1-21- 11-17_ tar_ v3.1.0. xz文件夹拷贝到~/ demo文件夹下面
3.进入~/demo目录下,对en . SOURCES- stm32mp1 - openstlinux-5. 10- dunfell-mp1- 21 -11-17_ tar_ v3.1.0.xz解压
4.在家目录创建一 个FSMP1A文件夹
5.将uboot源码拷贝到FSMP1A目录下
cp u-boot- stm32mp- v2020.10- stm32mp-r2-r0/ ~/FSMP1A/ -rf
2、分析uboot源码
1.进入/home/linux/FSMP1A/u- boot - stm32mp-v2020.10- stm32mp-r2-r0目录下,对uboot源码进行解压
tar -vxf u- boot-stm32mp-v2020.10- stm32mp-r2-r0. tar.gz
2.进入uboot源码目录下
cd u- boot-stm32mp-v2020.10- stm32mp-r2/
3.分析uboot源码目录
1>平台相关代码
arch:存放平台架构相关的文件
board :存放板子相关的文件
2>平台无关代码
Makefile:工程管理文件
include :存放板子相关的头文件信息
drivers :存放就是各个驱动相关文件
dts:设备树相关文件
Kconfig:配置相关文件
1>基于图形化界面配置信息----- >make menuconfig
menuconfig 一使用基于菜单的程序更新当前配置
2>编译uboot源码命令----->make all
all 一根据配置构建所有必需的映像
通过以上内容分析可知,对于不同的板子默认的配置命令: make <board_ name>_ defconfig
3、如何确定<board_ name>名字!
一、方式1:如何确定<board_name>?
1.在uboot源码顶层目录下执行:make fsmp1a_defconfig
2.出现如下错误信息:
***
*** Can't find default configuration "arch/../configs/fsmp1a_defconfig"!
***
make[1]: *** [scripts/kconfig/Makefile:110:fsmp1a_defconfig] 错误 1
make: *** [Makefile:565:fsmp1a_defconfig] 错误 2
3.通过分析错误打印信息,可知<<board_name>配置信息路径
路径:arch/../configs/*_defconfig
4.进入到uboot源码顶层目录下arch/../configs/目录下,查看stm32mp15系列相关配置文件
5.通过查看目录下文件过滤可知:
stm32mp15_basic_defconfig: 非安全版本默认缺省配置文件
stm32mp15_trusted_defconfig:安全版本默认缺省配置文件
二、方式2:因为make make <board_name>_defconfig,使用make进行编译的,一定通过Makefile文件进行管理
1.在uboot源码顶层目录,打开Makefile文件,搜索:config,查找到如下打印信息
564 %config: scripts_basic outputmakefile FORCE
565 $(Q)$(MAKE) $(build)=scripts/kconfig $@
2.打开uboot源码顶层目录Makefile文件,使用echo打印每个变量的信息
564 %config: scripts_basic outputmakefile FORCE
565 @echo $(Q)
566 @echo $(MAKE)
567 @echo $(build)
568 @echo $@
569 $(Q)$(MAKE) $(build)=scripts/kconfig $@
3.在uboot源码顶层目录下,执行make fsmp1a_defconfig,会打印相应的变量信息
@
make
-f ./scripts/Makefile.build obj
fsmp1a_defconfig
Can't find default configuration "arch/../configs/fsmp1a_defconfig"!
三、方式3:通过方式2分析可知$(Q)就是@符,@会取消回显,所以在Makefile文档中,将$(Q)变量去掉
1.在uboot源码顶层目录,打开Makefile文件,搜索:config,去掉$(Q)
564 %config: scripts_basic outputmakefile FORCE
565 @echo $(Q)
566 @echo $(MAKE)
567 @echo $(build)
568 @echo $@
569 $(MAKE) $(build)=scripts/kconfig $@
2.在uboot源码顶层目录下,执行make fsmp1a_defconfig,会打印相应的变量信息
make -f ./scripts/Makefile.build obj=scripts/kconfig fsmp1a_defconfig = make obj=scripts/kconfig fsmp1a_defconfig
3.在uboot源码顶层目录下,进入scripts/kconfig目录,打开Makefile文件,搜索defconfig
109 %_defconfig: $(obj)/conf
110 $(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)
4.在uboot源码顶层目录下,进入scripts/kconfig目录,打开Makefile文件,使用echo打印变量信息
109 %_defconfig: $(obj)/conf
110 @echo $<
111 @echo $(silent)
112 @echo $(SRCARCH)
113 @echo $@
114 @echo $(Kconfig)
115 $< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)
5.在uboot源码顶层目录下,执行make fsmp1a_defconfig,会打印相应的变量信息
scripts/kconfig/conf
..
fsmp1a_defconfig
Kconfig
scripts/kconfig/conf --defconfig=arch/../configs/fsmp1a_defconfig Kconfig
6.通过以上分析可知,make <board_name>_defconfig执行的完成语句内容:
scripts/kconfig/conf --defconfig=arch/../configs/fsmp1a_defconfig Kconfig
分析:
scripts/kconfig/conf:通过file命令进行查看,可知conf文件是一个elf可执行文件
--defconfig=arch/../configs/fsmp1a_defconfig:板子的默认的缺省配置文件
Kconfig:uboot源码顶层目录下的配置文件
整体分析:conf作为可执行参数,板子的默认的缺省配置文件和uboot源码顶层目录下的配置文件传递给conf
任务:自己分析scripts/kconfig/Makefile文件?
目的:make <board_name>_defconfig执行过程?
二、uboot源码配置编译步骤
1.进入~/FSMP1A/uboot源码目录下
cd /home/linux/FSMP1A/u-boot-stm32mp-v2020.10-stm32mp-r2-r0/u-boot-stm32mp-v2020.10-stm32mp-r2
2.配置交叉编译工具链,打开uboot源码顶层目录下Makefile文件,搜索:CROSS_COMPILE
将以下内容:
262 ifeq ($(HOSTARCH),$(ARCH))
263 CROSS_COMPILE ?=
更改为:
262 ifeq (arm,arm)
263 CROSS_COMPILE ?=arm-linux-gnueabihf-
3.在uboot源码顶层目录下,执行默认配置板子的缺省配置文件,为非安全版本配置
make stm32mp15_basic_defconfig
成功现象:
#
# configuration written to .config
#
4.在uboot源码顶层目录下,执行make menuconfig,这个地方不需要修改
5.设备树相关内容
dts ---------------->设备树源文件,相当于C语言中的.c文件
dtsi ---------------->设备树头文件,相当于C语言中的.h文件
DTC ---------------->设备树编译工具,相当于C语言中的gcc编译器 make dtbs
dtb ---------------->设备树下载文件,相当于C语言中的a.out文件
设备树语法格式:
/{
{
设备树节点信息
};
};
6.由于FSMP1A开发板是参考DK1公板进行设计的,所以需要复制DK1公板相关设备树内容
1)进入设备树目录:uboot源码顶层目录下uboot源码目录下/arch/arm/dts,查找到DK1公板设备树文件
stm32mp157a-dk1.dts
stm32mp157a-dk1-u-boot.dtsi
stm32mp15xx-dkx.dtsi
2)进入uboot源码目录下/arch/arm/dts,将DK1公板相关设备树内容,复制成FSMP1A文件
cp stm32mp157a-dk1.dts stm32mp157a-fsmp1a.dts
cp stm32mp157a-dk1-u-boot.dtsi stm32mp157a-fsmp1a-u-boot.dtsi
cp stm32mp15xx-dkx.dtsi stm32mp15xx-fsmp1x.dtsi
3)更改FSMP1A设备树相关内容
将如下内容:
12 #include "stm32mp15xx-dkx.dtsi"
13
14 / {
15 model = "STMicroelectronics STM32MP157A-DK1 Discovery Board";
16 compatible = "st,stm32mp157a-dk1", "st,stm32mp157";
更改为:
12 #include "stm32mp15xx-fsmp1x.dtsi"
13
14 / {
15 model = "HQYJ STM32MP157A-FSMP1A Discovery Board";
16 compatible = "hqyj,stm32mp157a-fsmp1a", "hqyj,stm32mp157";
4) 将FSMP1A开发板相关设备树文件,编译到uboot镜像文件中,打 uboot源码目录下/arch/arm/dts目录下的Makefile文件
945 dtb-$(CONFIG_STM32MP15x) += \
946 stm32mp157a-dk1.dtb \
947 stm32mp157a-fsmp1a.dtb \ -------> 这一行为需要添加内容
7.进入uboot源码顶层目录下,编译uboot源码
time make -j4 all
8.成功现象:
u-boot-spl.stm32
u-boot.img
confi
defconfig 寻找board_name 找到Makefile的位置然后删除回显
make menuconfig界面化处理配置,把开发名字作出更改以及重新运行
make all 执行镜像文件查看是否配置成功