配置Kconfig让内核支持mach-xxx开发板

配置Kconfig 让内核支持mach-xxx开发板

前言

补充之前写的向 Linux 内核添加硬件平台向 Linux 内核添加硬件平台

Linux内核支持的芯片可以通过内核配置直接对SOC进行配置,这些芯片的硬件平台对应的实现文件也都集成在内核中(arch/arm/mach-xxx),每一个mach-xxx都表示一个SOC硬件平台。

向内核添加soc平台主要完成两个工作:

  • Makefile:mach-xxx 各层 Makefile 对文件的编译(所有的编译文件可变翼的前提下)。
  • Kconfig:将添加的soc平台中的驱动进行配置(开/关、关联、依赖)。

配置目标结果如下图:

在这里插入图片描述

注:本文主要对 Kconfig 配置方法说明。

1. 了解Linux内核编译过程

对内核配置进行操作前,我们需要先了解下Linux内核的编译过程:

  1. 遍历每个源码目录的 Makefile文件

  2. 每个 Makefile 会根据 Kconfig 来定制需要编译的对象

  3. 最后回到顶层目录的 Makefile 执行编译

总的来说,Kconfig 文件就是各种配置界面的源文件。当遍历完了 Makefile 和 Kconfig 以后,会在顶层目录生成一个 .config 文件(.config文件保存着所有的内核配置选项),然后回到顶层 Makefile 编译。

(通过配置 Kconfig 将驱动选项添加到内核的编译选项中,我们主要配置的是自己硬件平台mach-asu的Kconfig)

2. Kconfig 基本配置方法

2.1. 添加驱动编译选项

例如,完成了一个 ASU_TEST 驱动,需要将选项加入到内核的编译选项中,可以按照以下步骤进行:

2.1.1. 配置 Kconfig

在 ASU-imx6ull-test/drivers 目录下建立 asu_test 子目录,进入该目录下创建 Kconfig 文件,内容如下:

// ASU-imx6ull-test/drivers/asu_test/Kconfig

config TEST
	bool "ASU_TEST"
	help
		Support for ASU TEST!!

这里定义了一个 TEST 句柄,Kconfig 可以通过这个句柄来控制在 Makefile 中是否编译,ASU_TEST 是显示在中端的名称。具体的语法在Kconfig语法中介绍。

2.1.2. 配置 Makefile

同样在 ASU-imx6ull-test/drivers/asu_test 下新建一个 Makefile 文件,内容如下:

# ASU-imx6ull-test/drivers/asu_test/Makefile

obj-y$(CONFIG_TEST) += asu_test.o
Obj - $(CONFIG_选项名) += xxx.o 
# 当CONFIG_选项名=n时,表示对应目录下的xxx.c不参与编译
# 当CONFIG_选项名=y时,表示对应目录下的xxx.c将被编译进内核
# 当CONFIG_选项名=m时,表示对应目录下的xxx.c将被编译成一个.ko模块
2.1.3. 配置上层 Makefile 和 Kconfig

在 ASU-imx6ull-test/drivers/Kconfig 中添加内容如下:

// ASU-imx6ull-test/drivers/Kconfig
menu "Device Drivers"
source "drivers/asu_test/Kconfig"	// 前面添加的内容地址

在 ASU-imx6ull-test/drivers/Makefile 中添加内容如下:

obj-y 		+= asu_test/		# 加入编译队列

检验结果,如下图:

在这里插入图片描述

2.2. 添加 mach-xxx 平台配置选项

配置过程和 2.1 节大同小异,基本都是对Makefile和Kconfig进行修改

2.2.1. 配置SOC Kconfig
  • 添加配置菜单
// ASU-imx6ull-test/arch/armmach-asu/Kconfig

menuconfig ARCH_MXC
	bool "ASU i.MX TEST" if ARCH_MULTI_V6_V7	// 菜单名,if 判断芯片架构
	select ......							  // 默认自动选择
	....
     help									  // 帮助信息
     	ASU i.MX TEST!!

添加SOC平台驱动,因为修改后只支持 imx6ull 开发板,所以代码只保留支持该开发板的驱动,所以全部不显示

// ASU-imx6ull-test/arch/armmach-asu/Kconfig

config MXC_TZIC
	bool				// 为空表示在终端中不显示选项
config HAVE_IMX_ANATOP
	bool
......
  • 添加具体 SOC
// ASU-imx6ull-test/arch/armmach-asu/Kconfig

config SOC_IMX6				// 同系列通用驱动,下面需要直接 select SOC_IMX6
	bool
	select ARM_GIC
	select HAVE_IMX_ANATOP
	select HAVE_IMX_GPC
	select HAVE_IMX_MMDC
	select HAVE_IMX_SRC
	select MFD_SYSCON

config SOC_IMX6UL
	bool 
	help
	  This enables support for ASU TEST i.MX6 UltraLite processor.

config SOC_IMX6ULL			// 目标配置SOC
	bool "i.MX6ULL support"
	select SOC_IMX6UL
	select SOC_IMX6
	select KEYBOARD_SNVS_PWRKEY
	select PINCTRL_IMX6UL
	select ARM_ERRATA_814220

	help
	  This enables support for ASU TEST i.MX6 ULL processor.
  • 包含 devices 目录

    source "arch/arm/mach-asu/device/Kconfig"	// device用于存放设备驱动
    
2.2.2. 配置SOC Makefile

根据驱动添加依赖关系,在 “Linux内核移植mach-asu” 中第 4 节有详细描述。

2.2.3.添加驱动设备

在 mach-asu 目录下还有一个 devices 子目录,devices目录下用于存放设备,添加方式与前面添加驱动编译选项相同,这里就不展开说明了。

3. Kconfig 基本语法

3.1. menuconfig 语句

menuconfig 表示菜单(本身属于一个菜单中的项目,但是他又有子菜单项目)、config表示菜单中的一个配置项(本身并没有子菜单下的项目)。一个menuconfig后面跟着的所有config项就是这个menuconfig的子菜单。这就是Kconfig中表示的目录关系。

menuconfig ARCH_MXC
	bool "ASU Kconfig test" if ARCH_MULTI_V4_V5 || ARCH_MULTI_V6_V7
	select ARCH_REQUIRE_GPIOLIB
	select ARM_CPU_SUSPEND if PM
	select CLKSRC_MMIO
	select GENERIC_IRQ_CHIP
	select PINCTRL
	select PM_OPP if PM
	select SOC_BUS
	select SRAM
	helpc
	  Support for Freescale MXC/iMX-based family of processors

上述代码对应终端界面如下:

在这里插入图片描述

3.2. config 语句

每一个 config 就表示一个配置选项的开始,后面紧跟着的 ARCH_AIROHA 是配置选项的名称,config 下面几行定义了该配置选项的属性:如选项名是什么,依赖什么,选中这个后同时会选择什么等等。

config ARCH_AIROHA 
	bool "选项名" 
    depends on ARCH_MULTI_V7 
    select ARM_AMBA 
    default n 
    help 
      Support for ASU i.MX6 SoCs
config选项
ARCH_AIROHA句柄,可用于控制Makefile,选择编译方式
bool选择可能:TRUE选中、FALSE不选;选中则编译,不选中则不编译。如果后面选项名字串为空,则表示其不会出现在选择软件列表中
depends依赖,后面的选择被选择后,这个选项才能被选
select当前选项选中后,则select后指定的选项自动被选择
default缺省配置项
help帮助信息

补充:bool,表示配置选项的类型,每个config菜单项都有类型定义(共5种)

bool 布尔类型、 tristate 三态类型、 string 字符串、hex 十六进制 、int 整型

3.3. 变量类型

3.3.1 bool 类型

取值范围是 [y/n],使用示例如下:

config SOC_IMX6ULL
	bool "i.MX6 ULL support"
	select SOC_IMX6UL

上述代码对应终端界面如下:

在这里插入图片描述

3.3.2 int 类型

取值为整型数,使用示例如下:

config HZ
	int "Timer Frequency"c
	default 100
3.3.3. string 类型

字符串变量的默认值是一个字符串,其使用示例如下:

config RT_CONSOLE_DEVICE_NAME
    string "the device name for console"
	default "uart1"
3.3.4. hex 类型

十六进制类型变量的取值范围是一个十六进制的数,其使用方法和整型变量用法一致,整型变量生成的是十进制的数,而十六进制生成的是十六进制的数。

3.3.5. tristate 类型

三态类型变量的取值范围是 y、n 和 m。tristate 代表在内核中有三种状态,一种是不选中,一种是选中直接编译进内核,还有一种是 m 手动添加驱动,而布尔类型变量只有两种状态,即选中和不选中。其使用方法和布尔类型变量类似。

3.4. choice/endchoice 语句

choice条目将多个类似的配置选项组合在一起,供用户选择一组配置项

config MACH_EUKREA_CPUIMX35SD
	bool "Support Eukrea CPUIMX35 Platform"
	select IMX_HAVE_PLATFORM_FLEXCAN
	select IMX_HAVE_PLATFORM_FSL_USB2_UDC
	select IMX_HAVE_PLATFORM_IMX2_WDT
	select IMX_HAVE_PLATFORM_IMX_I2C
	select IMX_HAVE_PLATFORM_IMX_UART
	select IMX_HAVE_PLATFORM_MXC_EHCI
	select IMX_HAVE_PLATFORM_MXC_NAND
	select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX
	select USB_ULPI_VIEWPORT if USB_ULPI
	select SOC_IMX35
	help
	  Include support for Eukrea CPUIMX35 platform. This includes
	  specific configurations for the board and its peripherals.

choice
	prompt "Baseboard"
	depends on MACH_EUKREA_CPUIMX35SD
	default MACH_EUKREA_MBIMXSD35_BASEBOARD
          
config MACH_EUKREA_MBIMXSD35_BASEBOARD
	bool "Eukrea MBIMXSD development board"
	select IMX_HAVE_PLATFORM_GPIO_KEYS
	select IMX_HAVE_PLATFORM_IMX_SSI
	select IMX_HAVE_PLATFORM_IPU_CORE
	select IMX_HAVE_PLATFORM_SPI_IMX
	select LEDS_GPIO_REGISTER
	help
	  This adds board specific devices that can be found on Eukrea's
	  MBIMXSD evaluation board.

endchoice

当 choice 的父级选择 [y] 时,才可以进入到 choice 选项**(choice/endchoice之间的config语句)**,如下图所示:

在这里插入图片描述

在这里插入图片描述

choice语句中定义的变量只有bool和tristate。
choice 选项是多选一。

3.5. comment 语句

comment 语句用来在内核配置界面显示提示信息,代码示例如下:

comment "MX35 platforms:"
    
config MACH_IMX35_DT
	bool "Support i.MX35 platforms from device tree"
    ......
    
config MACH_PCM043
	bool "Support Phytec pcm043 (i.MX35) platforms"
    ......

config MACH_MX35_3DS
	bool "Support MX35PDK platform"
	......
    
config MACH_EUKREA_CPUIMX35SD
	bool "Support Eukrea CPUIMX35 Platform"
    ......
    
config MACH_VPR200
	bool "Support VPR200 platform"
    ......
    
if ARCH_MULTI_V7

comment "Device tree only"

config SOC_IMX5
	bool
	......

config	SOC_IMX50
	bool "i.MX50 support"
	......
    
config SOC_IMX51
	bool "i.MX51 support"
    ......
........

以上代码对应的终端界面如下:

在这里插入图片描述

3.6. source 语句

source 语句用于读取另一个文件中的 Kconfig 文件,如:

source "arch/arm/mach-asu/devices/Kconfig"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值