ARM Uboot经历——makefile与uboot目录
makefile是个很复杂的东西,但是只要有耐心层层剥下,也能看到你想看到的东西。很遗憾的事,很多人都没有耐心去层层看,我也是。
对于makefile,我也仅仅从基础上了解了它在uboot中的原理和作用,其实你不一定要完全了解,但是你又不能完全不了解,这就是这个世界的矛盾。
makefile 第一步
最开始当然要看顶层目录下的makefile文件,当你执行make命令是就是默认这个makefile。一般在最开始,你需要告诉makefile你要生成哪种uboot,命令如下:
- make *****_config
****就是你单板的名字。当你执行这个指令后,它的结果就是生成一个.config文件,具体形成的语句对应为:
- %_config:: unconfig
- @$(MKCONFIG) -A $(@:_config=)
unconfig又定义为
- unconfig:
- @rm -f $(obj)include/config.h $(obj)include/config.mk \
- $(obj)board/*/config.tmp $(obj)board/*/*/config.tmp \
- $(obj)include/autoconf.mk $(obj)include/autoconf.mk.dep
变量MKCONFIG定义为
- MKCONFIG := $(SRCTREE)/mkconfig
通常SRCTREE就是空目录,因此就是根目录下的mkconfig文件。
而@:_config=表示将你输入的******_config替换为******,也就是将后面的去掉,因此命令实际上就成了
- $(SRCTREE)/mkconfig -A ******
mkconfig的作用
有很多文章写mkconfig的过程,我就不乱讲了,我也讲不太清楚,或者只能简单讲清楚。
简单来说,mkconfig会根据你输入的参数,比如-A , ******(单板号)去查询根目录下的boards.cfg文件,这个文件很关键,比如内容如下:
- # Target ARCH CPU Board name Vendor SoC Options
- ###########################################################################################################
- integratorcp_cm1136 arm arm1136 integrator armltd - integratorcp:CM1136
- imx31_phycore arm arm1136 - - mx31
- imx31_phycore_eet arm arm1136 imx31_phycore - mx31 imx31_phycore:IMX31_PHYCORE_EET
- qong arm arm1136 - davedenx mx31
- mx31ads arm arm1136 - freescale mx31
- mx31pdk arm arm1136 - freescale mx31 mx31pdk:NAND_U_BOOT
- tt01 arm arm1136 - hale mx31
- imx31_litekit arm arm1136 - logicpd mx31
- flea3 arm arm1136 - CarMediaLab mx35
- mx35pdk arm arm1136 - freescale mx35
它会列举一些用得到的单板的名字,以及各种属性。
比如以tt01为例,当你输入make tt01_config的时候,mkconfig就会在borad.cfg里面找到这一行。
找到这一行之后,它的所有属性就出来了,比如你的ARCH=arm,CPU=arm1136等等,这些属性都会被mkconfig收集起来写入两个文件中,这两个文件就叫做include/config.mk和include/config.h
mkconfig中生成include/config.mk如下:
- 1 ARCH = arm
- 2 CPU = arm1136
- 3 BOARD = tt01
- 4 VENDOR = hale
- 5 SOC = mx31
而生成的config.h文件如下:
- 1 /* Automatically generated - do not edit */
- 2 #define CONFIG_SYS_ARCH "arm"
- 3 #define CONFIG_SYS_CPU "arm1136"
- 4 #define CONFIG_SYS_BOARD "tt01"
- 5 #define CONFIG_SYS_VENDOR "hale"
- 6 #define CONFIG_SYS_SOC "mx31"
- 7 #define CONFIG_BOARDDIR board/hale/tt01
- 8 #include <config_cmd_defaults.h>
- 9 #include <config_defaults.h>
- 10 #include <configs/tt01.h>
- 11 #include <asm/config.h>
- 12 #include <config_fallbacks.h>
- 13 #include <config_uncmd_spl.h>
make的第二步
当make的第一步完成后,第二步就更简单了,直接输入make命令,然后就会按照你的预订配置编译了。
虽然操作简单了,但是实现过程更复杂了,如果要简单的说,那就是会执行All下面的所有操作
- all: $(ALL-y) $(SUBDIR_EXAMPLES)
- $(obj)u-boot.dtb: $(obj)u-boot
- $(MAKE) -C dts binary
- mv $(obj)dts/dt.dtb $@
- $(obj)u-boot-dtb.bin: $(obj)u-boot.bin $(obj)u-boot.dtb
- cat $^ >$@
- $(obj)u-boot.hex: $(obj)u-boot
- $(OBJCOPY) ${OBJCFLAGS} -O ihex $< $@
- $(obj)u-boot.srec: $(obj)u-boot
- $(OBJCOPY) -O srec $< $@
- $(obj)u-boot.bin: $(obj)u-boot
- $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
- $(BOARD_SIZE_CHECK)
- $(obj)u-boot.ldr: $(obj)u-boot
- $(CREATE_LDR_ENV)
- $(LDR) -T $(CONFIG_BFIN_CPU) -c $@ $< $(LDR_FLAGS)
- $(BOARD_SIZE_CHECK)
- $(obj)u-boot.ldr.hex: $(obj)u-boot.ldr
- $(OBJCOPY) ${OBJCFLAGS} -O ihex $< $@ -I binary
- $(obj)u-boot.ldr.srec: $(obj)u-boot.ldr
- $(OBJCOPY) ${OBJCFLAGS} -O srec $< $@ -I binary
我这里没有列全,但是的确是从这里开始运行,直至生成所有应该生成的文件。
makefile与uboot目录的关系
uboot的目录是非常庞大的,包含各种单板各种架构,如何得知哪个架构,进入哪个目录编译,这是makefile必须清楚地。反而言之,用户如果要新增文件,应该怎么增加,应该如何修改makefile,也需要了解。
makefile的参数非常关键,也就是上面介绍的boards.cfg里面的参数。
ARCH=type,对应的源目录为 arch/arm
CPU=arm1136,对应的源目录为arch/arm/arm/cpu1136
SOC=mx31,对应的源目录为arch/arm/arm/cpu1136/mx32
这里对应了三个最关键的源目录路径,在arch/arm目录下有arm公有的东西,比如初始化之类的。在arch/arm/cpu/***目录下就是每个cpu自己的东西了,用户可以将cpu特定的一些函数写在这个目录下。arch/arm/arm/cpu1136/mx32就是当前Soc的特殊函数了,比如定时器,DDR初始化之类的。
VENDOR=hale,对应的头文件目录为board\hale,这里面定义了这个公司的所有头文件。
BOARD=tt01,对应的头文件目录为board\hale\tt01,这里面定义了这个单板的所有头文件。
综上所述,基本和单板相关的文件定义结构就清楚了,但是其他的一些定义,比如flash,net之类的,这些有公共部分,也有私有部分,这个与makefile就关系不大了,这部分以后再详述。
ARM Uboot经历——makefile与uboot目录相关推荐
- u-boot 顶层Makefile 分析
U-Boot 顶层Makefile 解析 u-Boot -Makefile(一) 声明 : 以下解析大部分来自网络大神之手 所以可以放心阅读 Good luck VERSION = 1 PATCH ...
- GNU ARM汇编--(十七)u-boot的makefile和mkconfig解读
自己写的bootloader可以引导kernel了,我以为曾经神秘的u-boot代码将变得毫无挑战,然事实表明u-boot作为优秀的开源代码,阅读起来还是很有挑战的,值得一读! 阅读碰到的头等问题:M ...
- X-003 FriendlyARM tiny4412 uboot移植之添加相应目录文件
X-003 FriendlyARM tiny4412 uboot移植之添加相应目录文件 <<<<<<<<<<<<<< ...
- U-Boot顶层Makefile分析
参考:U-Boot顶层Makefile介绍 作者:一只青木呀 发布时间: 2020-10-22 16:22:17 网址:https://blog.csdn.net/weixin_45309916/ar ...
- u-boot的Makefile分析
U-BOOT是一个LINUX下的工程,在编译之前必须已经安装对应体系结构的交叉编译环境,这里只针对ARM,编译器系列软件为arm-linux-*. U-BOOT的下载地址: http://source ...
- 【正点原子Linux连载】第三十一章 U-Boot顶层Makefile详解 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0
1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...
- U-Boot 顶层 Makefile 详解
U-Boot 顶层 Makefile 详解 1.U-Boot 工程目录分析 我们在分析 uboot 源码之前一定要 先在 Ubuntu 中编译一下 uboot 源码,因为编译过程会生成一些文件,而生成 ...
- uboot研读笔记 | 12 - uboot目录结构分析(2016.03版本)
整个目录结构分析的思维导图:[腾讯文档]uboot 2016.03目录结构分析 背景说明 我使用的是已经移植到atk-imx6ull开发板上的uboot,基于NXP原厂提供的uboot,版本为2016 ...
- 模仿u-boot的makefile结构
u-boot(2014.04)是通过顶层makefile调用各子目录中的makefile来实现整个工程的编译的,实际上子目录的makefile是include进来的.这里仿照这种结构写个模板测试一下. ...
最新文章
- 合工大的计算机专业好不好,合肥工业大学计算机好,还是西电的好?差距有多大?...
- ELECTRA:超越BERT,2019年最佳NLP预训练模型
- 系统检测到您正在使用网页抓取工具_【安全】58反抓取简介
- 使用vscode删除markdown空行
- open-falcon
- 前端vue实现pdf文件的在线预览
- 调研了10家公司的技术架构,我总结出了一套大数据平台的套路
- JavaScript——闭包函数及拓展题目
- 好用的python表白神器_Python|520表白神器
- java执行数学表达式_数学表达式解析-JAVA版
- java基础知识总结(经典)_Java基础知识总结(超级经典)(三)
- android ps icon图标制作,PS设计App图标教程
- 叮叮获取所有用户信息_钉钉小程序获取用户信息
- Realsense-Ros安装配置
- 百度App Android启动性能优化-工具篇
- Python中的对象实例化过程 用python解密__new__
- 一个点围绕另一个点旋转后的坐标
- 侧里——我最钟爱的张国枯照片之Top10来源w
- A7799之STM32程序——STM32测试高精度ADC篇(二)
- 进入日资企业全攻略(转)