5. 初步配置
5.1 引入
根据我们上述的分析,arm < arm920t < samsung < s3c2440 < smdk2440是依次后者包含前者的关系,也只有到了最后的开发板级别,我们才能在此基础上面做出具体的项目产品,想一想,我们只有一个arm核、一个soc芯片可以做什么?答案是什么也做不了,因为它不满足一个微型计算机系统构成所必需的各种部件。
首先,我们需要明确的是,我们移植的目标是开发板级别,所以我们第一步应该关心的就是board/samsung目录。但是该版本的u-boot已经不提供对smdk2440开发板的支持了,这点我们可以从board/samsung目录下得到验证,
所以正好,我们可以尝试着站在soc芯片原厂的角度来进行移植工作。
5.2 新建单板目录
我们在board/samsung目录下新建一个目录,命名为jz2440,
接下来,我们可以看一下同目录下的其他开发板目录都有什么文件,如下图
我们发现,除去特有的部分,它们基本都有Kconfig、Makefile、MAINTAINERS、目录同名的c文件,所以我们复制其中一个开发板目录的上述文件到我们刚刚新建的jz2440目录,这里我们以smdkc100为例进行复制,
接着,我们依次对上述四个文件进行介绍以及修改。
-
Kconfig文件
原文件内容如下,
if TARGET_SMDKC100 config SYS_BOARD default "smdkc100" config SYS_VENDOR default "samsung" config SYS_SOC default "s5pc1xx" config SYS_CONFIG_NAME default "smdkc100" endif
这是一个Kconfig文件,熟悉内核编译的应该都清楚,u-boot好像在2015版本就使用了与linux内核相同的编译系统。
- 开始的if/endif表明只有TARGET_SMDKC100配置为y,下述的几个config才有效,所以我们应该在某个地方将该宏设置为y,现在我们先不管这个问题,这里我们将其改为TARGET_JZ2440;
接下来的几个宏,default的意思是默认将对应的宏的值设为default后面的值:
-
SYS_BOARD 表明开发板的名称,这里我们改为jz2440
-
SYS_VENDOR 表明soc厂家的名称,这里还是使用samsung
-
SYS_SOC 表明具体的soc芯片名称,这里我们改为s3c2440
-
SYS_CONFIG_NAME 表明对应的配置文件的名称,这里我们改为jz2440,其对应一个.h文件,所以我们需要建立这么一个文件,具体内容下文会有介绍,该文件位置在include/configs目录,下图列出目录下部分.h文件
改好后如下,
if TARGET_JZ2440
config SYS_BOARD
default "jz2440"
config SYS_VENDOR
default "samsung"
config SYS_SOC
default "s3c2440"
config SYS_CONFIG_NAME
default "jz2440"
endif
-
Makefile文件
原文件内容如下,
# SPDX-License-Identifier: GPL-2.0+ # # (C) Copyright 2000, 2001, 2002 # Wolfgang Denk, DENX Software Engineering, wd@denx.de. # # (C) Copyright 2008 # Guennadi Liakhovetki, DENX Software Engineering, <lg@denx.de> obj-y := smdkc100.o obj-$(CONFIG_SAMSUNG_ONENAND) += onenand.o obj-y += lowlevel_init.o
这里我们暂时只保留一个.c文件,
# SPDX-License-Identifier: GPL-2.0+ # # (C) Copyright 2020 Asymptote obj-y := jz2440.o
-
MAINTAINERS文件
原文件内容如下,
SMDKC100 BOARD M: Minkyu Kang <mk7.kang@samsung.com> S: Maintained F: board/samsung/smdkc100/ F: include/configs/smdkc100.h F: configs/smdkc100_defconfig
这是一个描述文件,我们改为
JZ2440 BOARD M: Asymptote S: Maintained F: board/samsung/jz2440/ F: include/configs/jz2440.h F: configs/jz2440_defconfig
-
目录同名的c文件
这个文件主要描述了我们jz2440单板的一些内容,我们将文件名改为jz2440.c,内容暂时为空。
5.3 新建.h配置文件
由4.2我们知道,我们还需要在include/configs目录新建一个jz2440.h的文件,在新建之前我们先看看对应的smdkc100.h的内容是什么,以作为参考,
/* SPDX-License-Identifier: GPL-2.0+ */
/*
* (C) Copyright 2009 Samsung Electronics
* Minkyu Kang <mk7.kang@samsung.com>
* HeungJun Kim <riverful.kim@samsung.com>
* Inki Dae <inki.dae@samsung.com>
*
* Configuation settings for the SAMSUNG SMDKC100 board.
*/
#ifndef __CONFIG_H
#define __CONFIG_H
/*
* High Level Configuration Options
* (easy to change)
*/
#define CONFIG_SAMSUNG 1 /* in a SAMSUNG core */
#define CONFIG_S5P 1 /* which is in a S5P Family */
#define CONFIG_S5PC100 1 /* which is in a S5PC100 */
#include <asm/arch/cpu.h> /* get chip and board defs */
/* input clock of PLL: SMDKC100 has 12MHz input clock */
#define CONFIG_SYS_CLK_FREQ 12000000
/* DRAM Base */
#define CONFIG_SYS_SDRAM_BASE 0x30000000
/* Text Base */
#define CONFIG_SETUP_MEMORY_TAGS
#define CONFIG_CMDLINE_TAG
#define CONFIG_INITRD_TAG
/*
* Size of malloc() pool
* 1MB = 0x100000, 0x100000 = 1024 * 1024
*/
#define CONFIG_SYS_MALLOC_LEN (CONFIG_ENV_SIZE + (1 << 20))
/*
* select serial console configuration
*/
/* PWM */
#define CONFIG_PWM 1
/* allow to overwrite serial and ethaddr */
#define CONFIG_ENV_OVERWRITE
#define CONFIG_BOOTCOMMAND "run ubifsboot"
#define CONFIG_RAMDISK_BOOT "root=/dev/ram0 rw rootfstype=ext2" \
" console=ttySAC0,115200n8" \
" mem=128M"
#define CONFIG_COMMON_BOOT "console=ttySAC0,115200n8" \
" mem=128M " \
" " CONFIG_MTDPARTS_DEFAULT
#define CONFIG_UPDATEB "updateb=onenand erase 0x0 0x40000;" \
" onenand write 0x32008000 0x0 0x40000\0"
#define CONFIG_ENV_OVERWRITE
#define CONFIG_EXTRA_ENV_SETTINGS \
CONFIG_UPDATEB \
"updatek=" \
"onenand erase 0x60000 0x300000;" \
"onenand write 0x31008000 0x60000 0x300000\0" \
"updateu=" \
"onenand erase block 147-4095;" \
"onenand write 0x32000000 0x1260000 0x8C0000\0" \
"bootk=" \
"onenand read 0x30007FC0 0x60000 0x300000;" \
"bootm 0x30007FC0\0" \
"flashboot=" \
"set bootargs root=/dev/mtdblock${bootblock} " \
"rootfstype=${rootfstype} " \
"ubi.mtd=${ubiblock} ${opts} " CONFIG_COMMON_BOOT ";" \
"run bootk\0" \
"ubifsboot=" \
"set bootargs root=ubi0!rootfs rootfstype=ubifs " \
" ubi.mtd=${ubiblock} ${opts} " CONFIG_COMMON_BOOT "; " \
"run bootk\0" \
"boottrace=setenv opts initcall_debug; run bootcmd\0" \
"android=" \
"set bootargs root=ubi0!ramdisk ubi.mtd=${ubiblock} " \
"rootfstype=ubifs init=/init.sh " CONFIG_COMMON_BOOT "; " \
"run bootk\0" \
"nfsboot=" \
"set bootargs root=/dev/nfs ubi.mtd=${ubiblock} " \
"nfsroot=${nfsroot},nolock " \
"ip=${ipaddr}:${serverip}:${gatewayip}:" \
"${netmask}:nowplus:usb0:off " CONFIG_COMMON_BOOT "; " \
"run bootk\0" \
"ramboot=" \
"set bootargs " CONFIG_RAMDISK_BOOT \
" initrd=0x33000000,8M ramdisk=8192\0" \
"rootfstype=cramfs\0" \
"mtdparts=" CONFIG_MTDPARTS_DEFAULT "\0" \
"meminfo=mem=128M\0" \
"nfsroot=/nfsroot/arm\0" \
"bootblock=5\0" \
"ubiblock=4\0" \
"ubi=enabled"
/*
* Miscellaneous configurable options
*/
#define CONFIG_SYS_PBSIZE 384 /* Print Buffer Size */
/* memtest works on */
#define CONFIG_SYS_LOAD_ADDR CONFIG_SYS_SDRAM_BASE
/* SMDKC100 has 1 banks of DRAM, we use only one in U-Boot */
#define PHYS_SDRAM_1 CONFIG_SYS_SDRAM_BASE /* SDRAM Bank #1 */
#define PHYS_SDRAM_1_SIZE (128 << 20) /* 0x8000000, 128 MB Bank #1 */
#define CONFIG_SYS_MONITOR_BASE 0x00000000
/*-----------------------------------------------------------------------
* FLASH and environment organization
*/
#define CONFIG_SYS_MONITOR_LEN (256 << 10) /* 256 KiB */
#if !defined(CONFIG_NAND_SPL) && (CONFIG_SYS_TEXT_BASE >= 0xc0000000)
#define CONFIG_ENABLE_MMU
#endif
#ifdef CONFIG_ENABLE_MMU
#define CONFIG_SYS_MAPPED_RAM_BASE 0xc0000000
#else
#define CONFIG_SYS_MAPPED_RAM_BASE CONFIG_SYS_SDRAM_BASE
#endif
/*-----------------------------------------------------------------------
* Boot configuration
*/
#define CONFIG_USE_ONENAND_BOARD_INIT
#define CONFIG_SAMSUNG_ONENAND 1
#define CONFIG_SYS_ONENAND_BASE 0xE7100000
#define CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_LOAD_ADDR - 0x1000000)
/*
* Ethernet Contoller driver
*/
#ifdef CONFIG_CMD_NET
#define CONFIG_ENV_SROM_BANK 3 /* Select SROM Bank-3 for Ethernet*/
#endif /* CONFIG_CMD_NET */
#endif /* __CONFIG_H */
显然,这是一个配置文件,包含有各种宏定义。
我们在include/configs目录新建一个jz2440.h的文件,内容暂时如下:
/* SPDX-License-Identifier: GPL-2.0+ */
/*
* (C) Copyright 2020 Asymptote
*
* Configuation settings for the SAMSUNG JZ2440 board.
*/
#ifndef __CONFIG_JZ2440_H
#define __CONFIG_JZ2440_H
#endif /* __CONFIG_JZ2440_H */
没错,我们里面什么配置也不做,读者不必在此纠结,先看下去。
5.4 新建defconfig文件
编译过比较新版本u-boot的读者一定会知道,现在u-boot与linux内核的编译系统已经基本相同,都有Kconfig、Makefile,以及用于配置的make xxx_defconfig和make menuconfig的功能,所以此处我们需要新建一个defconfig文件,以用于控制各个源代码文件的编译,其位置位于顶层目录的configs目录下。
我们在configs目录新建一个jz2440_defconfig的文件,与jz2440.h类似,内容暂时为空。
5.5 defconfig与.h文件的内容
我们已经知道,这两个文件都是配置文件,但是内容究竟应该写什么?
此时,我们应该停下脚步,好好思考一下,请看下文。
5.6 初探u-boot的配置系统
首先,根据我们3明确移植方向中的内容,我们应该选择描述arm架构的宏;其次,我们应该选择描述arm920t架构的宏。我们知道,所谓选择某个宏,其作用就是控制是否编译某个(几个)c文件。
根据上述思路,我们进入到arch/arm/cpu/arm920t目录,
再看该目录下的Makefile,
# SPDX-License-Identifier: GPL-2.0+
#
# (C) Copyright 2000-2006
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
extra-y = start.o
obj-y += cpu.o
obj-$(CONFIG_EP93XX) += ep93xx/
obj-$(CONFIG_IMX) += imx/
# some files can only build in ARM mode
ifdef CONFIG_$(SPL_)SYS_THUMB_BUILD
CFLAGS_cpu.o := -marm
endif
可以看到,主要是start.S以及cpu.c两个文件,它们均已经默认被设置为了y,表示编译进u-boot,至于其他的均是其他soc相关的,我们可以不用管。这里顺便说一下,start.S是不是有点熟悉?没错,它就是arm920t架构cpu的汇编启动代码,里面的内容这里就不分析了,它不是此篇文章的重点。
接着,我们再看上一层目录arch/arm/cpu的文件以及Makefile,
# SPDX-License-Identifier: GPL-2.0+
obj- += dummy.o
这里的Makefile,我没有看懂,此处留一个疑问,欢迎大家解答O(∩_∩)O
这里再顺便提一句,大家看到u-boot.lds没?没错,它就是此目录下所有使用arm架构soc芯片的开发板的u-boot可执行文件的链接脚本,同样,不是重点,此处也不分析了。
我们再看上一层目录arch/arm的文件,
这个目录的文件我们在3.1有过分析。
重点关注此目录下的Kconfig,由于Kconfig内容众多,我们此处挑选比较关心的内容,
# arch/arm/Kconfig
menu "ARM architecture"
depends on ARM
......
config CPU_ARM920T
bool
select SYS_CACHE_SHIFT_5
imply SYS_ARM_MMU
......
config CPU_V7A
bool
select HAS_THUMB2
select HAS_VBAR
select SYS_CACHE_SHIFT_6
imply SYS_ARM_MMU
......
config ARCH_S5PC1XX
bool "Samsung S5PC1XX"
select CPU_V7A
select DM
select DM_GPIO
select DM_I2C
select DM_SERIAL
imply CMD_DM
......
source "arch/arm/mach-s5pc1xx/Kconfig"
......
endmenu
此处我们注意最上面的depends on ARM,也就是说,我们需要配置CONFIG_ARM=y之后,整个menu才会生效,并且会导入arch/arm/mach-s5pc1xx/Kconfig等众多子Kconfig,所以这应该是我们的配置文件中的第一个配置项。
接着,看到ARCH_S5PC1XX以及最后的source "arch/arm/mach-s5pc1xx/Kconfig"了吗?我们暂且先看看这个Kconfig,
# arch/arm/mach-s5pc1xx/Kconfig
if ARCH_S5PC1XX
choice
prompt "S5PC1XX board select"
optional
config TARGET_S5P_GONI
bool "S5P Goni board"
select OF_CONTROL
select BLK
select DM_MMC
config TARGET_SMDKC100
bool "Support smdkc100 board"
select OF_CONTROL
endchoice
config SYS_SOC
default "s5pc1xx"
source "board/samsung/goni/Kconfig"
source "board/samsung/smdkc100/Kconfig"
endif
首先,看到ARCH_S5PC1XX了吗?它就是上文提到的arch/arm/Kconfig中的ARCH_S5PC1XX,
# arch/arm/Kconfig
......
config ARCH_S5PC1XX
bool "Samsung S5PC1XX"
select CPU_V7A
select DM
select DM_GPIO
select DM_I2C
select DM_SERIAL
imply CMD_DM
......
以及source “board/samsung/smdkc100/Kconfig”,
# board/samsung/smdkc100/Kconfig
if TARGET_SMDKC100
config SYS_BOARD
default "smdkc100"
config SYS_VENDOR
default "samsung"
config SYS_SOC
default "s5pc1xx"
config SYS_CONFIG_NAME
default "smdkc100"
endif
也就是说,当我们配置CONFIG_ARCH_S5PC1XX=y之后:
- 根据arch/arm/Kconfig,它会自动配置CONFIG_CPU_V7A=y,CONFIG_DM=y,CONFIG_DM_GPIO=y,CONFIG_DM_I2C=y,CONFIG_DM_SERIAL=y,CONFIG_CMD_DM=y;
- 根据arch/arm/mach-s5pc1xx/Kconfig(根据上文,当我们配置CONFIG_ARM=y时便会导入),它会导入board/samsung/smdkc100/Kconfig;
- 根据board/samsung/smdkc100/Kconfig,我们需要配置CONFIG_TARGET_SMDKC100=y,之后u-boot便会执行board/samsung/smdkc100目录下的Makefile,以及知道你的.h配置文件为smdkc100.h;
综上,继CONFIG_ARM=y之后,我们需要配置CONFIG_ARCH_S5PC1XX=y以及CONFIG_TARGET_SMDKC100=y。
5.7 举一反三,新增Kconfig与defconfig中的内容
有了上述smdkc100单板的例子,凭大家聪明的头脑,举一反三的能力,应该知道怎么做了吧?
5.7.1 新增Kconfig中的内容
在arch/arm/Kconfig中增加关于jz2440的内容,
menu "ARM architecture"
depends on ARM
......
config CPU_ARM920T
bool
select SYS_CACHE_SHIFT_5
imply SYS_ARM_MMU
......
config CPU_V7A
bool
select HAS_THUMB2
select HAS_VBAR
select SYS_CACHE_SHIFT_6
imply SYS_ARM_MMU
......
config ARCH_S5PC1XX
bool "Samsung S5PC1XX"
select CPU_V7A
select DM
select DM_GPIO
select DM_I2C
select DM_SERIAL
imply CMD_DM
......
config TARGET_JZ2440
bool "Support jz2440"
select CPU_ARM920T
......
source "arch/arm/mach-s5pc1xx/Kconfig"
......
source "board/samsung/jz2440/Kconfig"
......
endmenu
注意,由于我们针对的soc只有s3c2440,所以这里我们就不在arch/arm目录下新建mach-xxx的目录了,建立这些mach-xxx目录的目的在于同一厂家或者同一厂家下的同一代产品可能会包含有好多soc产品,这里来进行统一描述。
所以,我们越过了ARCH_S3C24XX,直接配置TARGET_JZ2440,有兴趣的读者也可以新建诸如mach-s3c24xx目录,配置ARCH_S3C24XX,以支持s3c2410、s3c2440等等。
5.7.2 新增defconfig中的内容
在configs/jz2440_defconfig中进行增加后,内容如下,
CONFIG_ARM=y
CONFIG_TARGET_JZ2440=y
这样,我们便初步串联起了jz2440的配置过程。
5.8 make xxx_defconfig与.config的关系
到这里,我们可以尝试进行配置并编译了,但是,这里我们再暂停一下,解决一个疑惑。
好多人,包括我自己,之前一直认为,make xxx_defconfig就是将xxx_defconfig复制为.config,但是,是这么简单吗?这里我们正好可以做个实验。
我们先在jz2440_defconfig中将之前的内容注释掉,
# CONFIG_ARM=y
# CONFIG_TARGET_JZ2440=y
然后开始配置,执行如下命令,
接下来看一下.config的内容,由于太多,只截取前面的一小部分,
#
# Automatically generated file; DO NOT EDIT.
# U-Boot 2020.07-rc2 Configuration
#
# CONFIG_ARC is not set
# CONFIG_ARM is not set
# CONFIG_M68K is not set
# CONFIG_MICROBLAZE is not set
# CONFIG_MIPS is not set
# CONFIG_NDS32 is not set
# CONFIG_NIOS2 is not set
# CONFIG_PPC is not set
# CONFIG_RISCV is not set
CONFIG_SANDBOX=y
# CONFIG_SH is not set
# CONFIG_X86 is not set
# CONFIG_XTENSA is not set
CONFIG_SYS_ARCH="sandbox"
CONFIG_SYS_CPU="sandbox"
CONFIG_SYS_BOARD="sandbox"
CONFIG_SYS_CONFIG_NAME="sandbox"
CONFIG_SYS_TEXT_BASE=
CONFIG_SYS_MALLOC_F_LEN=0x2800
CONFIG_ENV_SIZE=0x1f000
CONFIG_DM_GPIO=y
CONFIG_ERR_PTR_OFFSET=0x0
CONFIG_NR_DRAM_BANKS=4
CONFIG_BOOTSTAGE_STASH_ADDR=0
CONFIG_IDENT_STRING=""
CONFIG_BUILD_TARGET=""
#
# Sandbox architecture
#
# CONFIG_SANDBOX64 is not set
# CONFIG_SANDBOX_SPL is not set
# CONFIG_HOST_32BIT is not set
CONFIG_HOST_64BIT=y
CONFIG_SANDBOX_BITS_PER_LONG=64
# CONFIG_DEBUG_UART is not set
# CONFIG_AHCI is not set
#
# General setup
#
CONFIG_LOCALVERSION=""
CONFIG_LOCALVERSION_AUTO=y
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
# CONFIG_CC_COVERAGE is not set
# CONFIG_DISTRO_DEFAULTS is not set
# CONFIG_ENV_VARS_UBOOT_CONFIG is not set
# CONFIG_SYS_BOOT_GET_CMDLINE is not set
# CONFIG_SYS_BOOT_GET_KBD is not set
CONFIG_SYS_MALLOC_F=y
CONFIG_EXPERT=y
CONFIG_SYS_MALLOC_CLEAR_ON_INIT=y
# CONFIG_SYS_MALLOC_DEFAULT_TO_INIT is not set
# CONFIG_TOOLS_DEBUG is not set
# CONFIG_PHYS_64BIT is not set
# CONFIG_SYS_CUSTOM_LDSCRIPT is not set
CONFIG_PLATFORM_ELFENTRY="_start"
怎么样?是不是直接复制已经一目了然了吧?可以看到,由于我们在jz2440_defconfig中什么也没指定,u-boot在.config中给了我们一个cpu架构的默认值sandbox,此外还有好多架构无关的默认值。
接下来我们在jz2440_defconfig中打开CONFIG_ARM,
CONFIG_ARM=y
# CONFIG_TARGET_JZ2440=y
然后清理工程后重新进行配置,
再次查看.config内容,同样只列出前面一小部分,
#
# Automatically generated file; DO NOT EDIT.
# U-Boot 2020.07-rc2 Configuration
#
CONFIG_CREATE_ARCH_SYMLINK=y
# CONFIG_ARC is not set
CONFIG_ARM=y
# CONFIG_M68K is not set
# CONFIG_MICROBLAZE is not set
# CONFIG_MIPS is not set
# CONFIG_NDS32 is not set
# CONFIG_NIOS2 is not set
# CONFIG_PPC is not set
# CONFIG_RISCV is not set
# CONFIG_SANDBOX is not set
# CONFIG_SH is not set
# CONFIG_X86 is not set
# CONFIG_XTENSA is not set
CONFIG_SYS_ARCH="arm"
CONFIG_SYS_CPU="armv8"
CONFIG_SYS_SOC="hi6220"
CONFIG_SYS_VENDOR="hisilicon"
CONFIG_SYS_BOARD="hikey"
CONFIG_SYS_CONFIG_NAME="hikey"
# CONFIG_SYS_ICACHE_OFF is not set
# CONFIG_SYS_DCACHE_OFF is not set
#
# ARM architecture
#
CONFIG_ARM64=y
# CONFIG_POSITION_INDEPENDENT is not set
# CONFIG_INIT_SP_RELATIVE is not set
# CONFIG_GIC_V3_ITS is not set
CONFIG_STATIC_RELA=y
CONFIG_DMA_ADDR_T_64BIT=y
CONFIG_ARM_ASM_UNIFIED=y
# CONFIG_SYS_ARM_CACHE_CP15 is not set
# CONFIG_SYS_ARM_MMU is not set
# CONFIG_SYS_ARM_MPU is not set
CONFIG_SYS_ARM_ARCH=8
CONFIG_SYS_CACHE_SHIFT_6=y
CONFIG_SYS_CACHELINE_SIZE=64
CONFIG_SYS_ARM_CACHE_WRITEBACK=y
# CONFIG_SYS_ARM_CACHE_WRITETHROUGH is not set
# CONFIG_SYS_ARM_CACHE_WRITEALLOC is not set
# CONFIG_ARCH_CPU_INIT is not set
CONFIG_SYS_ARCH_TIMER=y
CONFIG_ARM_SMCCC=y
怎么样,变为arm了吧?只不过之后的cpu,soc等等都不对,我们再打开jz2440_defconfig中的CONFIG_TARGET_JZ2440,
CONFIG_ARM=y
CONFIG_TARGET_JZ2440=y
然后清理工程后再次重新进行编译,
再次查看.config内容,同样只列出前面一小部分,
#
# Automatically generated file; DO NOT EDIT.
# U-Boot 2020.07-rc2 Configuration
#
CONFIG_CREATE_ARCH_SYMLINK=y
# CONFIG_ARC is not set
CONFIG_ARM=y
# CONFIG_M68K is not set
# CONFIG_MICROBLAZE is not set
# CONFIG_MIPS is not set
# CONFIG_NDS32 is not set
# CONFIG_NIOS2 is not set
# CONFIG_PPC is not set
# CONFIG_RISCV is not set
# CONFIG_SANDBOX is not set
# CONFIG_SH is not set
# CONFIG_X86 is not set
# CONFIG_XTENSA is not set
CONFIG_SYS_ARCH="arm"
CONFIG_SYS_CPU="arm920t"
CONFIG_SYS_SOC="s3c2440"
CONFIG_SYS_VENDOR="samsung"
CONFIG_SYS_BOARD="jz2440"
CONFIG_SYS_CONFIG_NAME="jz2440"
# CONFIG_SYS_ICACHE_OFF is not set
# CONFIG_SYS_DCACHE_OFF is not set
#
# ARM architecture
#
# CONFIG_GIC_V3_ITS is not set
CONFIG_ARM_ASM_UNIFIED=y
CONFIG_SYS_ARM_CACHE_CP15=y
CONFIG_SYS_ARM_MMU=y
# CONFIG_SYS_ARM_MPU is not set
CONFIG_CPU_ARM920T=y
CONFIG_SYS_ARM_ARCH=4
CONFIG_SYS_CACHE_SHIFT_5=y
CONFIG_SYS_CACHELINE_SIZE=32
CONFIG_SYS_ARM_CACHE_WRITEBACK=y
# CONFIG_SYS_ARM_CACHE_WRITETHROUGH is not set
# CONFIG_SYS_ARM_CACHE_WRITEALLOC is not set
# CONFIG_ARCH_CPU_INIT is not set
# CONFIG_SEMIHOSTING is not set
# CONFIG_SYS_THUMB_BUILD is not set
# CONFIG_SYS_L2CACHE_OFF is not set
# CONFIG_ENABLE_ARM_SOC_BOOT0_HOOK is not set
CONFIG_USE_ARCH_MEMCPY=y
CONFIG_USE_ARCH_MEMSET=y
# CONFIG_SET_STACK_SIZE is not set
# CONFIG_ARCH_AT91 is not set
# CONFIG_TARGET_EDB93XX is not set
# CONFIG_TARGET_ASPENITE is not set
感觉如何?
可以看到,
CONFIG_SYS_ARCH="arm"
CONFIG_SYS_CPU="arm920t"
CONFIG_SYS_SOC="s3c2440"
CONFIG_SYS_VENDOR="samsung"
CONFIG_SYS_BOARD="jz2440"
CONFIG_SYS_CONFIG_NAME="jz2440"
这些正是在arch/arm/Kconfig以及borad/samsung/jz2440/Kconfig中配置的选项值,忘记的读者可以回头去看看,只不过要注意Kconfig中并没有CONFIG_的前缀,这是u-boot默认给加上去的。
到这里,我们可以想到,执行make xxx_defconfig的背后,不仅会读取xxx_defconfig中的内容,还会读取各级Kconfig中的配置,最终生成.config。