系统移植(八)u-boot源码解析(未整理)

news2024/9/17 7:19:42

文章目录

  • 一、分析make <board_name>_defconfig执行过程
    • (一)
      • 1. 1. 分析Makefile文件,分析Makefile文件的规则中目标为"<board_name>_defconfig",
    • (二)
    • (三)
  • 二、分析make menuconfig执行过程
  • 三、以GPIO驱动为例分析如何通过图形化界面方式实现驱动的编译
    • (一)GPIO的驱动在u-boot源码的drivers/gpio目录下
    • (二)打开drivers/gpio目录下的Makefile文件,找到以下内容
  • 四、make all执行过程详解
    • (一)通过执行make V=1 all命令,获取make all执行过程的详解介绍
  • 五、

一、分析make <board_name>_defconfig执行过程

(一)

1. 1. 分析Makefile文件,分析Makefile文件的规则中目标为"<board_name>_defconfig",

打开u-boot源码目录下的Makefile,搜索“%config”字符串,得到以下结果
 563 %config: scripts_basic outputmakefile FORCE
 		echo $(Q)
 		echo $(MAKE)
 		echo $(build)
 564     $(Q)$(MAKE) $(build)=scripts/kconfig $@

解析以上命令:
$@ : 目标
$^ : 所有的依赖
$< : 第一个依赖

Q = @			---> 取消命令在终端的回显
MAKE = make		---> make命令
build = -f ./scripts/Makefile.build obj

以下命令展开之后的结果:
	@make -f ./scripts/Makefile.build obj=scripts/kconfig stm32mp15_trusted_defconfig
	
解析以上命令的含义:
	make 		---> 执行make命令
	-f ./scripts/Makefile.build 	---> 使用file文件作为Makefile文件
	obj=scripts/kconfig 		---> 执行make命令时,给obj变量赋值
	stm32mp15_trusted_defconfig   ---> make命令对应的目标
  1. 打开u-boot源码目录下的./scripts/Makefile.build,查找“config”目标,
    没有找到对应的目标,通过include包含了其它目录下的Makefile文件,得到以下信息
    55 kbuild-dir := $(if ( f i l t e r / (filter /%, (filter/(src)), ( s r c ) , (src), (src),(srctree)/$(src))
    56 kbuild-file := $(if $(wildcard ( k b u i l d − d i r ) / K b u i l d ) , (kbuild-dir)/Kbuild), (kbuilddir)/Kbuild),(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile)
    57 include $(kbuild-file)

    以上命令展开之后的结果:include scripts/kconfig/Makefile

  2. 打开u-boot源码中的scripts/kconfig/Makefile文件,搜索“%_defconfig”字符串,
    得到以下结果:
    109 %_defconfig: $(obj)/conf
    110 ( Q ) (Q) (Q)< ( s i l e n t ) − − d e f c o n f i g = a r c h / (silent) --defconfig=arch/ (silent)defconfig=arch/(SRCARCH)/configs/$@ $(Kconfig)

    解析以上命令,将命令前边的$(Q)删除,然后重新执行make stm32mp15_trusted_defconfig
    命令,然后查看终端回显的结果,如下所示:
    scripts/kconfig/conf --defconfig=arch/…/configs/stm32mp15_trusted_defconfig Kconfig

    解析以上命令:
    scripts/kconfig/conf —> 使用file命令查看conf文件可知conf是一个
    —> ELF格式的可执行文件。
    —> conf程序通过命令行传参的方式,使用argc和argv获取对应的参数
    –defconfig=arch/…/configs/stm32mp15_trusted_defconfig
    —> config可执行程序的第一个参数
    —> arch/…/configs/目录下存放的是板子的默认的配置文件
    Kconfig
    —> config可执行程序的第二个参数
    —> u-boot源码目录下的Kconfig文件

    以上命令最终执行的效果:
    conf程序解析arch/…/configs/目录下stm32mp15_trusted_defconfig
    和u-boot源码目录下的Kconfig文件,最终在u-boot源码目录下生成.config配置文件,
    .config文件给Makefile文件使用,Makefile文件根据.config文件中的信息最终
    决定了u-boot源码中的哪些文件被编译,哪些文件不被编译。

  • 注:
  • file命令可以查看文件性质

(二)

(三)

二、分析make menuconfig执行过程

  1. 分析Makefile文件,分析Makefile文件的规则中目标为"menuconfig",
    打开u-boot源码目录下的Makefile,搜索“%config”字符串,得到以下结果
    563 %config: scripts_basic outputmakefile FORCE
    echo $(Q)
    echo $(MAKE)
    echo $(build)
    564 ( Q ) (Q) (Q)(MAKE) $(build)=scripts/kconfig $@

    解析以上命令:
    $@ : 目标
    $^ : 所有的依赖
    $< : 第一个依赖

    Q = @ —> 取消命令在终端的回显
    MAKE = make —> make命令
    build = -f ./scripts/Makefile.build obj

    以下命令展开之后的结果:
    @make -f ./scripts/Makefile.build obj=scripts/kconfig menuconfig

    解析以上命令的含义:
    make —> 执行make命令
    -f ./scripts/Makefile.build —> 使用file文件作为Makefile文件
    obj=scripts/kconfig —> 执行make命令时,给obj变量赋值
    menuconfig —> make命令对应的目标

  2. 打开u-boot源码目录下的./scripts/Makefile.build,查找“menuconfig”目标,
    没有找到对应的目标,通过include包含了其它目录下的Makefile文件,得到以下信息
    55 kbuild-dir := $(if ( f i l t e r / (filter /%, (filter/(src)), ( s r c ) , (src), (src),(srctree)/$(src))
    56 kbuild-file := $(if $(wildcard ( k b u i l d − d i r ) / K b u i l d ) , (kbuild-dir)/Kbuild), (kbuilddir)/Kbuild),(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile)
    57 include $(kbuild-file)

    以上命令展开之后的结果:include scripts/kconfig/Makefile

  3. 打开u-boot源码中的scripts/kconfig/Makefile文件,搜索“menuconfig”字符串,
    得到以下结果:
    34 menuconfig: $(obj)/mconf
    35 $< $(silent) $(Kconfig)

    以上命令展开之后的结果为,执行make menuconfig命令
    scripts/kconfig/mconf Kconfig

    解析以上命令的作用:
    scripts/kconfig/mconf —> 使用file命令查看mconf程序的属性可知,
    —> mconf是一个ELF格式的可执行文件,
    Kconfig —> mconf可执行程序的第一个参数
    —> u-boot源码目录下的Kconfig文件

     mconf程序解析Kconfig文件中的信息,最终调用图形化界面的库,
     生成图形化的配置界面。
    
  4. 打开u-boot源码目录下的Kconfig文件,解析Kconfig文件中的信息。
    主菜单:类似于windows软件的菜单栏
    可以包含子菜单和菜单选项
    菜单:类似于windows软件中子菜单
    可以包含下一级的菜单或菜单选项
    菜单选项:菜单选项只能被选择或者不选择

    4.1 mainmenu 关键字
    作用:修饰主菜单
    格式:mainmenu “主菜单的名字”

    4.2 menu…endmenu 关键字
    作用:修饰菜单
    格式:
    menu “菜单的名字”
    // 1. 可以包含下一级的菜单
    // 2. 包含一个菜单选项
    endmenu

    4.3 bool 关键字
    作用:修饰菜单选项,修饰的菜单选项有两种状态[*]或[ ]
    格式:
    bool “菜单选项的名字”

    4.4 default 关键字
    作用:对应的菜单选项的默认的状态
    格式:default y|n

    4.5 help关键字
    作用:修饰帮助信息
    格式:
    help
    帮助信息的字符串

     可以通过:shift + ? 获取菜单选项对应的帮助信息。
    

    4.6 config关键字
    作用:修饰配置选项的
    格式:
    config 配置选项的名字
    |—> 1. 一般配置选项的名字的每个字符都要大写
    |—> 2. 多个单词之间使用“_”隔开

    当config修饰的配置选项对应的菜单选项配置为[*]时,
    此时“CONFIG_配置选项的名字 = y” 被写到.config文件中

    当config修饰的配置选项对应的菜单选项配置为[ ]时,
    此时“# CONFIG_配置选项的名字 is not set” 被写到.config文件中

    因此通过make menuconfig进行图形化界面配置时,最终修改的是.config文件中的配置信息。

    .config文件中的信息给Makefile文件使用,Makefile文件根据.config文件中的信息,
    决定u-boot中的源码哪些被编译,哪些不被编译。

    Makefile文件编译u-boot的伪代码:

    u-boot.stm32:u-boot.bin

    u-boot.bin:u-boot.elf
    objcopy -O binary u-boot.elf u-boot.bin

    u-boot.elf:$(obj-y)
    ld 命令,将.o文件链接生成.elf文件

    obj-y += 1.o
    obj- ( C O N F I G ∗ ∗ ∗ ∗ ) + = ∗ ∗ ∗ ∗ 2. o o b j − (CONFIG_****) += ****2.o obj- (CONFIG)+=2.oobj(CONFIG_
    ) += 3.o

    obj-$(CONFIG_
    ) += ****n.o
    |—> CONFIG对应的变量在.config文件中定义。

    .o:.c
    gcc -c ****.c -o ****.o

    4.8 source关键字
    作用:包含下一级目录下的Kconfig文件
    格式:
    source “Kconfig文件名及对应的路径”

三、以GPIO驱动为例分析如何通过图形化界面方式实现驱动的编译

(一)GPIO的驱动在u-boot源码的drivers/gpio目录下

stm32_gpio.c

(二)打开drivers/gpio目录下的Makefile文件,找到以下内容

在这里插入图片描述

1》GPIO的驱动在u-boot源码的drivers/gpio目录下

stm32_gpio.c

2》打开drivers/gpio目录下的Makefile文件,找到以下内容

 54 obj-$(CONFIG_STM32_GPIO)    += stm32_gpio.o 
 				|---> 这个变量在.config文件中进行定义
 				|---> 如果这个变量被定义为y,则stm32_gpio.c就会被编译

3》打开drivers/gpio/目录下的Kconfig文件,得到以下内容

  5 menu "GPIO Support"
  ......
359 config STM32_GPIO  
360     bool "ST STM32 GPIO driver"
361     depends on DM_GPIO && (ARCH_STM32 || ARCH_STM32MP)
362     default y
363     help
364       Device model driver support for STM32 GPIO controller. It should be
365       usable on many stm32 families like stm32f4/f7/h7 and stm32mp1.
366       Tested on STM32F7.
	......
498 endmenu  

4》打开drivers/目录下的Kconfig文件,得到以下内容

1 menu “Device Drivers”
45 source “drivers/gpio/Kconfig”
151 endmenu
5》打开u-boot源码目录下的Kconfig文件,得到以下内容

476 source "drivers/Kconfig"

6》配置GPIO驱动对应的菜单选项配置为[*]或[ ] ,然后查看.config文件中的信息

Device Drivers ---->
	GPIO Support ---->
		[*] ST STM32 GPIO driver
		 |---> 配置为[*]或者[ ] 然后查看.config中CONFIG_STM32_GPIO变量定义

四、make all执行过程详解

(一)通过执行make V=1 all命令,获取make all执行过程的详解介绍

ld命令将各个目录下的.o文件先链接生成build-in.o文件
|
arm-linux-gnueabihf-ld.bfd -Ttext 0xC0100000 -o u-boot -T u-boot.lds
arch/arm/cpu/armv7/start.o --whole-archive arch/arm/cpu/built-in.o
arch/arm/cpu/armv7/built-in.o arch/arm/lib/built-in.o
arch/arm/mach-stm32mp/built-in.o board/st/common/built-in.o
board/st/stm32mp1/built-in.o cmd/built-in.o common/built-in.o
disk/built-in.o drivers/built-in.o drivers/dma/built-in.o
drivers/gpio/built-in.o drivers/i2c/built-in.o drivers/net/built-in.o
drivers/net/phy/built-in.o drivers/power/built-in.o
drivers/power/battery/built-in.o drivers/power/domain/built-in.o
drivers/power/fuel_gauge/built-in.o drivers/power/mfd/built-in.o
drivers/power/pmic/built-in.o drivers/power/regulator/built-in.o
drivers/serial/built-in.o drivers/spi/built-in.o
drivers/usb/cdns3/built-in.o drivers/usb/common/built-in.o
drivers/usb/dwc3/built-in.o drivers/usb/emul/built-in.o
drivers/usb/eth/built-in.o drivers/usb/gadget/built-in.o
drivers/usb/gadget/udc/built-in.o drivers/usb/host/built-in.o
drivers/usb/mtu3/built-in.o drivers/usb/musb-new/built-in.o
drivers/usb/musb/built-in.o drivers/usb/phy/built-in.o
drivers/usb/ulpi/built-in.o env/built-in.o fs/built-in.o
lib/built-in.o net/built-in.o --no-whole-archive
arch/arm/lib/eabi_compat.o arch/arm/lib/lib.a -Map u-boot.map; true
将各个目录下的build-in.o文件链接生成u-boot文件
|
arm-linux-gnueabihf-objcopy -O binary u-boot u-boot-nodtb.bin
objcopy命令格式化拷贝将u-boot(ELF格式文件)格式化拷贝生成u-boot-nodtb.bin
|
make -f ./scripts/Makefile.build obj=dts dtbs
make -f ./scripts/Makefile.build obj=arch/arm/dts dtbs
编译设备树文件,得到dts/dt.dtb
|
cat u-boot-nodtb.bin dts/dt.dtb > u-boot-dtb.bin
将dts/dt.dtb文件追加到u-boot-nodtb.bin文件结尾,得到u-boot-dtb.bin文件
|
cp u-boot-dtb.bin u-boot.bin
|
./tools/mkimage -T stm32image -a 0xC0100000 -e 0xC0100000 -d u-boot.bin u-boot.stm32 > u-boot.stm32.log && cat u-boot.stm32.log

mkimage : 可以通过man mkimage获取命令的帮助信息,生成镜像文件
-T stm32image :设置镜像文件的类型
-a 0xC0100000 :设置加载地址
-e 0xC0100000 :设置程序入口地址
-d u-boot.bin :镜像对应的数据文件
u-boot.stm32 :mkimage命令给u-boot.bin文件添加对应的数据头,得到u-boot.stm32镜像文件

u-boot.stm32.log :将mkimage命令执行的输出结果重定向到u-boot.stm32.log
&& cat u-boot.stm32.log :将u-boot.stm32.log 文件中的内容在终端进行回显。

五、

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1957719.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【精通Redis】Redis命令详解

引言 Redis是一个内存数据库&#xff0c;在学习它的内部原理与实现之前&#xff0c;我们首先要做到的就是学会使用&#xff0c;学会其丰富的命令操作。 一、字符串 Redis的字符串类型之前笔者的一篇入门介绍中曾经说过&#xff0c;不是简单的只存人可以阅读的字符串&#xf…

JavaWeb笔记_FilterListener

一.过滤器 1.1 过滤器概述 过滤器主要用来拦截目标资源&#xff08;静态资源或动态资源&#xff09;的请求和响应 &#xff08;类似地铁的安检&#xff09; 我们访问动态或静态资源都要通过URL访问&#xff1a;http://localhost:8080/... 所以过滤器本质上拦截的是URL 1.2 过滤…

select ... for update中锁等级转化

一、结论 select ... for update 除了查询功能&#xff0c;还实现了加锁机制&#xff0c;是一种悲观锁。根据是否使用了主键和索引&#xff0c;决定锁等级是表锁还是行锁。如果采用了&#xff0c;则是行锁&#xff0c;否则是表锁。 二、实例 前提条件&#xff1a;将事务自动…

你敢信?1万块存上5年,到手只有900!

1996年的夏天你走进银行&#xff0c;会看到五年期整存整取的利息&#xff0c;可能高达14%左右。1万块存上5年&#xff0c;到手利息高达——7000元。 今天呢&#xff1f;同样的存款方式&#xff0c;5年后&#xff0c;能拿到的利息只有900元。靠吃银行利息就能躺平的年代&#xf…

分布式事务解决方案(一) 2PC、3PC、TCC、Sega

目录 1.绪论 2.2PC 2.1 基本原理 2.1.1 组成 2.1.2 步骤 1.prepare阶段 2.commit阶段 2.2 2PC 存在的问题 2.2.1 阻塞问题 2.2.2 单点故障问题 1. 事务协调器宕机 2.部分数据不一致问题 2.资源管理器宕机 3. 事务协调器和资源管理管理器同时宕机 2.2 实现 2.2.1…

【AI落地应用实战】Amazon Bedrock +Amazon Step Functions实现链式提示(Prompt Chaining)

一、链式提示 Prompt Chaining架构 Prompt Chaining 是一种在生成式人工智能&#xff08;如大型语言模型&#xff09;中广泛使用的技术&#xff0c;它允许用户通过一系列精心设计的提示&#xff08;Prompts&#xff09;来引导模型生成更加精确、丰富且符合特定需求的内容。 P…

freertos-HAL库-STM32Cubemax生成

打开cubemax选好型号配置RCC&#xff08;外部高速时钟&#xff09;这里查看原理图&#xff0c;我们把按键设为输入&#xff0c;led设为输出创建两个新任务&#xff08;default是系统创建的&#xff09;配置时钟&#xff0c;这里HSE是外部高速时钟&#xff0c;HSI是内部的&#…

打卡第27天------贪心算法

再次祈祷上帝,提前预备好自己,希望我可以在机会来临的时候,抓住机会,成功上岸! 一、理论基础 什么是贪心?例如:有一堆钞票,你可以拿走十张,如果想达到最大的金额,你要怎么拿? 你肯定是每次拿最大的,最终结果就是拿走最大数额的钱了。 每次拿最大的就是局部最优,…

【Python从入门到进阶】61、Pandas中DataFrame对象的操作(二)

接上篇《60、Pandas中DataFrame对象的操作&#xff08;一&#xff09;》 上一篇我们讲解了DataFrame对象的简介、基本操作及数据清洗相关的内容。本篇我们来继续讲解DataFrame对象的统计分析、可视化以及数据导出与保存相关内容。 一、DataFrame的统计分析 在数据分析和处理中…

Selenium Java中的isDisplayed()方法

isDisplayed&#xff08;&#xff09;方法用于确定元素是否可见。本文将详细讨论 的WebElement接口isDisplayed&#xff08;&#xff09;方法。 方法声明- boolean isDisplayed&#xff08;&#xff09;它能做什么&#xff1f;此方法用于判断元素是否显示。这个方法节省了我们…

EasyExcel入门

目录 一、文章简介 二、概念 1.EasyExcel是什么&#xff1f; 2.EasyExcel 能用在哪里&#xff1f; 3.为什么要选用EasyExcel解析excel&#xff1f; 4.如何使用EasyExcel&#xff1f; 三、EasyExcel快速入门 1.环境搭建 2.简单写excel 代码示例 TestFileUtil Employe…

C++(week14): C++提高:(二)C++11线程库

文章目录 一、线程1.C11线程库的概述2.构造函数3.线程启动: 线程入口函数的传递方式4.线程终止5.线程状态6.获取线程id&#xff1a;get_id() 二、互斥锁1.什么是互斥锁2.头文件3.常用函数接口 三、lockguard与unique_lock1.lock_guard2.unique_lock(1)概念(2)函数接口 3.原子数…

Python脚本:使用PyPDF2给一个PDF添加上页数/总页数标签

一、实现代码 import PyPDF2 from PyPDF2 import PdfWriter from PyPDF2.generic import AnnotationBuilder# 指定输入和输出pdf pdf_path rC:\Users\ASUS\Desktop\temp\xxxx.pdf out_path rC:\Users\ASUS\Desktop\temp\xxxx2.pdf# 创建 PdfWriter 对象 writer PdfWriter()…

Python转换Excel文件为SVG文件

SVG&#xff08;Scalable Vector Graphics&#xff09;是一种基于XML的矢量图像格式。这种格式在Web开发和其他图形应用中非常流行&#xff0c;提供了一种高效的方式来呈现复杂的矢量图形。如果我们需要在网页中嵌入Excel表格&#xff0c;或是直接使用Excel工作表制作网页&…

基于元神系统编写“清屏”程序

1. 背景 本文介绍了基于元神系统开发软件的操作流程&#xff0c;并详细介绍了“清空屏幕”程序的编写以及测试结果。 2. 方法 &#xff08;1&#xff09;编写程序 在元神系统0.4版的基础上&#xff0c;用FASM汇编语言进行软件开发。假设屏幕为80列25行的文本显示模式&#…

【更新2022】各省农业科技活动经费(RD)测算 1999-2022 无缺失

各省农业科技活动经费&#xff08;R&D&#xff09;测算数据在农业经济学、政策研究和农村发展规划等领域的论文研究中具有重要应用价值。首先&#xff0c;这些数据可以用于分析不同省份在农业科技投入上的差异及其对农业生产力和产出的影响&#xff0c;帮助揭示不同地区农业…

Node.js版本管理工具之NVM

目录 一、NVM介绍二、NVM的下载安装1、NVM下载2、卸载旧版Node.js3、安装 三、NVM配置及使用1、设置nvm镜像源2、安装Node.js3、卸载Node.js4、使用或切换Node.js版本5、设置全局安装路径和缓存路径 四、常用命令技术交流 博主介绍&#xff1a; 计算机科班人&#xff0c;全栈工…

坐牢十八天 20240729(IO)

一.笔记 1. 有关系统时间的函数 1> 有关时间的函数 #include <time.h> time_t time(time_t *tloc); 功能&#xff1a;获取系统时间&#xff0c;从1970年1月1日0时0分0秒&#xff0c;到目前累计的秒数 参数&#xff1a;用于接收的秒数 返回值&#xff1a;秒数使…

【每日刷题】Day89

【每日刷题】Day89 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 102. 二叉树的层序遍历 - 力扣&#xff08;LeetCode&#xff09; 2. 155. 最小栈 - 力扣&#xff0…