删除uboot中无关代码及其配置系统分析

        学习嵌入式linux第一关就是uboot,对于这个稍显复杂的单片机程序,很多朋友觉得束手无策,这主要是因为一个uboot压缩包解压后会有很多文件夹,其中包含的代码很多,除此之外还有makefile、Kconfig、设备树等等,不知道该从哪里下手。如果这时我们能够把其中用不到的代码删掉,这样对于我们分析、配置和移植uboot会有很大的帮助。

        这里以xilinx发布的2018.3版本uboot为例进行分析,对于其他芯片厂商发布的uboot处理方式是类似的。首先解压uboot压缩包后,如下图所示,

首先点开README,这里对arch文件夹讲解如下,

/arch			Architecture specific files

该文件夹是和架构相关的,而我们的soc是arm架构的,所以其他架构对于我们都是没用的,可以删掉,如下,

同时该目录下的Kconfig也需要进行修改如下,

 上面标红色的都是需要删除的,由于我们只保留了arm架构,其余的都删除了,所以其他目录下的Kconfig自然也运行不了了,保存,关闭。

        我们点开arm文件夹可以看到其中有很多以mach开头,后面是soc名字的文件夹,

 这里我们用到的soc是zynq,所以我们只保留mach-zynq就好,其余的删掉如下,

另外,Kconfig中source保留下面这些,其余删掉,

我们再回到arm文件夹下,这里有一个dts文件夹,点进去,

大家可以看到很多针对不同soc的设备树文件, 这里我们保留如下和zynq相关的,其余删掉,

同时该目录下的makefile,做如下修改,其余不动,

接着我们进入到根目录下,进入board文件夹,该文件夹下有很多针对不同开发板的文件夹,这里我们只保留xilinx,

 接下来我们进入到根目录下configs文件夹,这里保存着很多不同开发板的配置文件,我们只保留zynq_zc702_defconfig,其余全部删掉。

 然后我们进入根目录下include文件夹下的configs文件夹,我们保留如下两个头文件,

 全部完成后,输入如下两个命令进行编译,

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zynq_zc702_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- 

 应该是能够编译通过的。 

        此时的uboot看起来清爽很多了,接下来我们分析下uboot的配置系统,如今的uboot都引入了kconfig,在上面的叙述中,大家也看到了,我们需要修改kconfig。在uboot根目录下readme中,有如下内容,

Selection of Processor Architecture and Board Type:
---------------------------------------------------

For all supported boards there are ready-to-use default
configurations available; just type "make <board_name>_defconfig".

Example: For a TQM823L module type:

	cd u-boot
	make TQM823L_defconfig

 也就是每个板子有自己的默认配置文件,我们以zynq的7020为例,所以我们的配置文件就是configs文件夹下的zynq_zc702_defconfig,当我们输入如下命令后,

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zynq_zc702_defconfig

会看到如下打印信息,

 也就是在uboot根目录下有一个.config文件会被创建,里面保存着配置信息,既然.config和zynq_zc702_defconfig都是配置文件,是不是两个文件是一摸一样的呢?大家比较就能发现,.config中的很多配置信息是zynq_zc702_defconfig中没有的!这些多出来的配置信息是哪里来的?比如下面这几个配置项,

CONFIG_SYS_CPU="armv7"
CONFIG_SYS_SOC="zynq"
CONFIG_SYS_VENDOR="xilinx"
CONFIG_SYS_BOARD="zynq"

就是.config有而zynq_zc702_defconfig中没有的,接下来我就以这几个配置项为例揭晓答案!,我们用vscode打开uboot文件夹。在zynq_zc702_defconfig中有如下配置项,

CONFIG_ARCH_ZYNQ=y

也就是说我们定义用的芯片是zynq,我们以ARCH_ZYNQ在uboot文件夹中进行搜索(vscode搜索功能很好用),

 在arch/arm/mach-zynq文件夹下的kconfig中有如下配置,

if ARCH_ZYNQ

config SPL_LDSCRIPT
	default "arch/arm/mach-zynq/u-boot-spl.lds"

config SPL_FAT_SUPPORT
	default y

config SPL_LIBCOMMON_SUPPORT
	default y

config SPL_LIBDISK_SUPPORT
	default y

config SPL_LIBGENERIC_SUPPORT
	default y

config SPL_MMC_SUPPORT
	default y if MMC_SDHCI_ZYNQ

config SPL_SERIAL_SUPPORT
	default y

config SPL_SPI_FLASH_SUPPORT
	default y if ZYNQ_QSPI

config SPL_SPI_SUPPORT
	default y if ZYNQ_QSPI

config ZYNQ_DDRC_INIT
	bool "Zynq DDRC initialization"
	default y
	help
	  This option used to perform DDR specific initialization
	  if required. There might be cases like ddr less where we
	  want to skip ddr init and this option is useful for it.

config SYS_BOARD
	default "zynq"

config SYS_VENDOR
	string "Vendor name"
	default "xilinx"

config SYS_SOC
	default "zynq"

也就是说如果CONFIG_ARCH_ZYNQ配置项有效,那么SYS_BOARD、SYS_VENDOR和SYS_SOC的数值也就确定了。另外在arch/arm文件夹下的kconfig中有如下内容,

config ARCH_ZYNQ
	bool "Xilinx Zynq based platform"
	select BOARD_LATE_INIT
	select CPU_V7
	select SUPPORT_SPL
	select OF_CONTROL
	select SPL_BOARD_INIT if SPL
	select BOARD_EARLY_INIT_F if WDT
	select SPL_OF_CONTROL if SPL
	select DM
	select DM_ETH if NET
	select SPL_DM if SPL
	select DM_MMC if MMC
	select DM_SPI
	select DM_SERIAL
	select DM_SPI_FLASH
	select SPL_SEPARATE_BSS if SPL
	select DM_USB if USB
	select CLK
	select SPL_CLK if SPL
	select CLK_ZYNQ
	imply CMD_CLK
	imply FAT_WRITE
	imply CMD_SPL

选择了ARCH_ZYNQ就选择了CPU_V7,而选择了CPU_V7,SYS_CPU就配置成了armv7,

config SYS_CPU
	default "arm720t" if CPU_ARM720T
	default "arm920t" if CPU_ARM920T
	default "arm926ejs" if CPU_ARM926EJS
	default "arm946es" if CPU_ARM946ES
	default "arm1136" if CPU_ARM1136
	default "arm1176" if CPU_ARM1176
	default "armv7" if CPU_V7
	default "armv7m" if CPU_V7M
	default "pxa" if CPU_PXA
	default "sa1100" if CPU_SA1100
	default "armv8" if ARM64

到目前位置我们可以得出结论,在我们执行make defconfig时,会根据zynq_zc702_defconfig和kconfig文件,生成一个.config。

        另外配置项除了来自于zynq_zc702_defconfig和kconfig文件,还有一个重要的来源,在uboot根目录下,有如下内容,

Configuration Options:
----------------------

Configuration depends on the combination of board and CPU type; all
such information is kept in a configuration file
"include/configs/<board_name>.h".

Example: For a TQM823L module, all configuration settings are in
"include/configs/TQM823L.h".

对于我们的zynq,也就是如下的头文件,

 从上面分析中,我们可以看到,uboot的配置项主要来源于两个地方,一个时kconfig系统,另一个是c语言的头文件,那么为什么不能都来源于kconfig系统呢?在doc文件夹下的readme.kconfig文件给出了答案如下,

   If we could completely switch to Kconfig in a long run
   (i.e. remove all the include/configs/*.h), those additional processings
   above would be removed.

也就是说,如今的uboot是一个过渡期,如果完全过度成功,那么所有的配置项都来源于kconfig!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值