站在芯片原厂角度移植最新u-boot 2020.07到jz2440开发板(2)(全部驱动使用设备树与dm设备模型)

由于论坛的篇幅限制我将此文章分为了四篇,本文为第二篇。 整篇文章遵循着以问题为导向的讲解方式,重实践,基本没有原理性的知识,并且从零开始进行移植。我相信,如果你能认真的跟着文章实际操作一把,以后不管遇到什么类型的芯片、什么类型的开发板,同样都能完成从零移植u-boot的工作。

5. 初步配置

5.1 引入

根据我们上述的分析,arm < arm920t < samsung < s3c2440 < smdk2440是依次后者包含前者的关系,也只有到了最后的开发板级别,我们才能在此基础上面做出具体的项目产品,想一想,我们只有一个arm核、一个soc芯片可以做什么?答案是什么也做不了,因为它不满足一个微型计算机系统构成所必需的各种部件。

首先,我们需要明确的是,我们移植的目标是开发板级别,所以我们第一步应该关心的就是board/samsung目录。但是该版本的u-boot已经不提供对smdk2440开发板的支持了,这点我们可以从board/samsung目录下得到验证,

attachments-2020-06-4T627q5k5ee0f7ca76281.jpg

所以正好,我们可以尝试着站在soc芯片原厂的角度来进行移植工作。

5.2 新建单板目录

我们在board/samsung目录下新建一个目录,命名为jz2440,

attachments-2020-06-PZJrUJJu5ee120292688b.jpg

接下来,我们可以看一下同目录下的其他开发板目录都有什么文件,如下图,

attachments-2020-06-YTN0sGeK5ee0f80c1c13e.jpg

我们发现,除去特有的部分,它们基本都有Kconfig、Makefile、MAINTAINERS、目录同名的c文件,所以我们复制其中一个开发板目录的上述文件到我们刚刚新建的jz2440目录,这里我们以smdkc100为例进行复制,

attachments-2020-06-nm5AFQio5ee1206fc9ff5.jpg

接着,我们依次对上述四个文件进行介绍以及修改。

  1. 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文件

attachments-2020-06-cB4estbU5ee0f8bcb5ace.jpg

改好后如下,

 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
  1. 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
  2. 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
  3. 目录同名的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_SAMSUNG1/* in a SAMSUNG core */
 #define CONFIG_S5P1/* which is in a S5P Family */
 #define CONFIG_S5PC1001/* 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_FREQ12000000
 
 /* DRAM Base */
 #define CONFIG_SYS_SDRAM_BASE0x30000000
 
 /* 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_PWM1
 
 /* 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_PBSIZE384/* Print Buffer Size */
 /* memtest works on */
 #define CONFIG_SYS_LOAD_ADDRCONFIG_SYS_SDRAM_BASE
 
 /* SMDKC100 has 1 banks of DRAM, we use only one in U-Boot */
 #define PHYS_SDRAM_1CONFIG_SYS_SDRAM_BASE/* SDRAM Bank #1 */
 #define PHYS_SDRAM_1_SIZE(128 << 20)/* 0x8000000, 128 MB Bank #1 */
 
 #define CONFIG_SYS_MONITOR_BASE0x00000000
 
 /*-----------------------------------------------------------------------
  * 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_BASE0xc0000000
 #else
 #define CONFIG_SYS_MAPPED_RAM_BASECONFIG_SYS_SDRAM_BASE
 #endif
 
 /*-----------------------------------------------------------------------
  * Boot configuration
  */
 
 #define CONFIG_USE_ONENAND_BOARD_INIT
 #define CONFIG_SAMSUNG_ONENAND1
 #define CONFIG_SYS_ONENAND_BASE0xE7100000
 
 #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的配置系统

首先,根据我们4.明确移植方向中的内容,我们应该选择描述arm架构的宏;其次,我们应该选择描述arm920t架构的宏。我们知道,所谓选择某个宏,其作用就是控制是否编译某个(几个)c文件。

根据上述思路,我们进入到arch/arm/cpu/arm920t目录,

attachments-2020-06-SjoJ8kpo5ee0f9721d4aa.jpg

再看该目录下的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的文件,

attachments-2020-06-CmF3KgRI5ee0fa944b599.jpg

这个目录的文件我们在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之后:

  1. 根据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;

  2. 根据arch/arm/mach-s5pc1xx/Kconfig(根据上文,当我们配置CONFIG_ARM=y时便会导入),它会导入board/samsung/smdkc100/Kconfig;

  3. 根据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。


  • 发表于 2020-06-11 01:40
  • 阅读 ( 388 )
  • 分类:经验分享

0 条评论&回复

请先 登录 后评论
渐进
渐进

12 篇文章

作家榜 »

  1. 百问网-周老师 18 文章
  2. st_ashang 14 文章
  3. 渐进 12 文章
  4. zxq 11 文章
  5. helloworld 8 文章
  6. 谢工 5 文章
  7. Litchi_Zheng 5 文章
  8. 星星之火 5 文章