一、概述
Linux
内核编译流程如下:
1、配置 Linux
内核。
2、编译 Linux
内核。
说明:进入 Linux
内核源码,使用 make help
参看相关配置。
二、make menuconfig 工作原理
1、menuconfig
它本身是一个软件,只提供图形界面配置的一些逻辑,并不负责提供内容。
2、menuconfig
是内核源码树的各目录下的 kconfig
提供的。
3、menuconfig
中所有选中配置项的相关值会保存到配置文件中(默认配置文件为 .config
)。
4、在编译内核时,Makefile
根据相关配置项选择需要编译的源码。
三、Kconfig 语法
参考文档:Documentation/kbuild/kconfig-language.txt
。
Linux 驱动开发 六十五:《kconfig-language.txt》翻译_lqonlylove的博客-CSDN博客
四、Linux 内核中 Kconfig 分析
1、顶层 Kconfig 内容
#
# For a description of the syntax of this configuration file,
# see Documentation/kbuild/kconfig-language.txt.
#
mainmenu "Linux/$ARCH $KERNELVERSION Kernel Configuration"
config SRCARCH
string
option env="SRCARCH"
source "arch/$SRCARCH/Kconfig"
mainmenu
:标题栏;config
:定义配置项;string
:数据类型;env
:导入Kconfig
的环境变量;
source
:读取的配置文件位置。
2、arch/arm/Kconfig 内容
……
source "init/Kconfig" # 包含配置文件
source "kernel/Kconfig.freezer"
menu "System Type" # 定义配置菜单栏
config MMU # 在 System Type 下定义配置项
bool "MMU-based Paged Memory Management Support"
default y
help
Select if you want MMU-based virtualised addressing space
support by paged memory management. If unsure, say 'Y'.
#
# The "ARM system type" choice list is ordered alphabetically by option
# text. Please add new entries in the option alphabetic order.
#
choice
prompt "ARM system type"
default ARCH_VERSATILE if !MMU
default ARCH_MULTIPLATFORM if MMU
config ARCH_MULTIPLATFORM
bool "Allow multiple platforms to be selected"
depends on MMU
select ARCH_WANT_OPTIONAL_GPIOLIB
select ARM_HAS_SG_CHAIN
select ARM_PATCH_PHYS_VIRT
select AUTO_ZRELADDR
select CLKSRC_OF
select COMMON_CLK
select GENERIC_CLOCKEVENTS
select MIGHT_HAVE_PCI
select MULTI_IRQ_HANDLER
select SPARSE_IRQ
select USE_OF
……
config ARCH_VERSATILE
bool "ARM Ltd. Versatile family"
select ARCH_WANT_OPTIONAL_GPIOLIB
select ARM_AMBA
select ARM_TIMER_SP804
select ARM_VIC
select CLKDEV_LOOKUP
select GENERIC_CLOCKEVENTS
select HAVE_MACH_CLKDEV
select ICST
select PLAT_VERSATILE
select PLAT_VERSATILE_CLOCK
select PLAT_VERSATILE_SCHED_CLOCK
select VERSATILE_FPGA_IRQ
help
This enables support for ARM Ltd Versatile board.
……
menu "Multiple platform selection"
depends on ARCH_MULTIPLATFORM # Multiple platform selection 依赖 ARCH_MULTIPLATFORM 配置项
comment "CPU Core family selection"
……
#
# This is sorted alphabetically by mach-* pathname. However, plat-*
# Kconfigs may be included either alphabetically (according to the
# plat- suffix) or along side the corresponding mach-* source.
#
source "arch/arm/mach-mvebu/Kconfig"
……
menu "Bus support"
……
menu "Kernel Features"
menu "CPU Power Management"
source "drivers/cpufreq/Kconfig"
source "drivers/cpuidle/Kconfig"
endmenu
menu "Floating point emulation"
comment "At least one emulation must be selected"
endmenu
……
menu "Userspace binary formats"
source "fs/Kconfig.binfmt"
endmenu
menu "Power management options"
source "kernel/power/Kconfig"
endmenu
source "net/Kconfig"
source "drivers/Kconfig"
source "drivers/firmware/Kconfig"
source "fs/Kconfig"
source "arch/arm/Kconfig.debug"
source "security/Kconfig"
source "crypto/Kconfig"
if CRYPTO
source "arch/arm/crypto/Kconfig"
endif
source "lib/Kconfig"
source "arch/arm/kvm/Kconfig"
source
:包含一个配置文件;menu
:定义一个菜单项;choice
:定义一个选项组;config
:定义一个配置项;comment
:定义一个注释;
3、其他配置文件
五、测试
1、添加菜单
为了方便测试,在顶层 Kconfig
下添加一个 bool
配置项,配置项内容如下:
menu "onlylove test"
endmenu
2、添加 bool 类型配置
menu "onlylove test"
config ONLYLOVE_TEST
bool "onlylove test Management Support"
endmenu
3、添加 tristate 类型配置
menu "onlylove test"
config ONLYLOVE_TEST
tristate "onlylove test Management Support"
endmenu
4、添加 string 类型配置
menu "onlylove test"
config ONLYLOVE_TEST
string "onlylove test Management Support"
endmenu
5、添加 hex 类型配置
menu "onlylove test"
config ONLYLOVE_TEST
hex "onlylove test Management Support"
endmenu
6、添加 int 类型值
menu "onlylove test"
config ONLYLOVE_TEST
int "onlylove test Management Support"
endmenu
7、查看配置是否生效
1、添加菜单和配置项
menu "onlylove test"
config ONLYLOVE_TEST
tristate "onlylove test Management Support"
endmenu
2、查看旧配置文件
onlylove@ubuntu:~/my/linux/linux-imx-4.1.15$ cat .config | grep ONLYLOVE_TEST
# CONFIG_ONLYLOVE_TEST is not set
onlylove@ubuntu:~/my/linux/linux-imx-4.1.15$
3、选中 onlylove test Management Support
配置项
4、查看新配置文件
onlylove@ubuntu:~/my/linux/linux-imx-4.1.15$ cat .config | grep ONLYLOVE_TEST
CONFIG_ONLYLOVE_TEST=m
onlylove@ubuntu:~/my/linux/linux-imx-4.1.15$
六、向 Linux 内核中添加自己编写驱动
1、确定驱动所属类型
ICM-20608
属于SPI
设备。
2、找到对应Kconfig文件
onlylove@ubuntu:~/my/linux/linux-imx-4.1.15/drivers/spi$ pwd
/home/onlylove/my/linux/linux-imx-4.1.15/drivers/spi
onlylove@ubuntu:~/my/linux/linux-imx-4.1.15/drivers/spi$ ls -l Kconfig
-rw-rw-r-- 1 onlylove onlylove 20563 May 24 2019 Kconfig
onlylove@ubuntu:~/my/linux/linux-imx-4.1.15/drivers/spi$
3、添加驱动文件
onlylove@ubuntu:~/my/linux/linux-imx-4.1.15/drivers/spi$ pwd
/home/onlylove/my/linux/linux-imx-4.1.15/drivers/spi
onlylove@ubuntu:~/my/linux/linux-imx-4.1.15/drivers/spi$ ls -l spi-icm2068.c
ls: cannot access 'spi-icm2068.c': No such file or directory
onlylove@ubuntu:~/my/linux/linux-imx-4.1.15/drivers/spi$ cp -f ~/my/imx6ull_drive/13_icm20608_spi/spi-icm2068.c ./
onlylove@ubuntu:~/my/linux/linux-imx-4.1.15/drivers/spi$ ls -l spi-icm2068.c
-rw-rw-r-- 1 onlylove onlylove 12758 Nov 13 00:25 spi-icm2068.c
onlylove@ubuntu:~/my/linux/linux-imx-4.1.15/drivers/spi$
4、添加配置项
config ONLYLOVE_ICM20608
tristate "Icm20608 Device Support"
help
This supports user icm20608 device.
onlylove@ubuntu:~/my/linux/linux-imx-4.1.15$ cat .config | grep ONLYLOVE_ICM20608
CONFIG_ONLYLOVE_ICM20608=y
onlylove@ubuntu:~/my/linux/linux-imx-4.1.15$
5、添加Makefile编译项
obj-$(CONFIG_ONLYLOVE_ICM20608) += spi-icm2068.o
6、编译内核
onlylove@ubuntu:~/my/linux/linux-imx-4.1.15$ make -j4
scripts/kconfig/conf --silentoldconfig Kconfig
CHK include/config/kernel.release
CHK include/generated/uapi/linux/version.h
CHK include/generated/utsrelease.h
make[1]: 'include/generated/mach-types.h' is up to date.
CHK include/generated/bounds.h
CHK include/generated/asm-offsets.h
CALL scripts/checksyscalls.sh
CHK include/generated/compile.h
CC drivers/spi/spi-icm2068.o
LD drivers/spi/built-in.o
LD drivers/built-in.o
LINK vmlinux
LD vmlinux.o
MODPOST vmlinux.o
GEN .version
CHK include/generated/compile.h
UPD include/generated/compile.h
CC init/version.o
LD init/built-in.o
KSYM .tmp_kallsyms1.o
KSYM .tmp_kallsyms2.o
LD vmlinux
SORTEX vmlinux
SYSMAP System.map
OBJCOPY arch/arm/boot/Image
Building modules, stage 2.
MODPOST 27 modules
Kernel: arch/arm/boot/Image is ready
LZO arch/arm/boot/compressed/piggy.lzo
AS arch/arm/boot/compressed/piggy.lzo.o
LD arch/arm/boot/compressed/vmlinux
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
onlylove@ubuntu:~/my/linux/linux-imx-4.1.15$
日志 CC drivers/spi/spi-icm2068.o
表示 spi-icm2068
驱动编译成功。
7、驱动测试
1、Linux 启动日志
以上日志可以确定 icm20608
驱动加载成功。icm20608
设备 ID
读取成功。
2、app程序调用icm20608驱动
# ls
icm20608_app
# ls -l /dev/icm20608
crw-rw---- 1 root root 10, 62 Jan 1 00:00 /dev/icm20608
#
# ./icm20608_app /dev/icm20608
data[0] = 6 data[1] = 13 data[2] = 0 data[3] = 43 data[4] = 6 data[5] = 2067
原始值:
gx = 6, gy = 13, gz = 0
ax = 43, ay = 6, az = 2067
temp = 1715
实际值:act gx = 0.37°/S, act gy = 0.79°/S, act gz = 0.00°/S
act ax = 0.02g, act ay = 0.00g, act az = 1.01g
act temp = 30.17°C
data[0] = 7 data[1] = 13 data[2] = 0 data[3] = 39 data[4] = 8 data[5] = 2063
原始值:
gx = 7, gy = 13, gz = 0
ax = 39, ay = 8, az = 2063
temp = 1708
实际值:act gx = 0.43°/S, act gy = 0.79°/S, act gz = 0.00°/S
act ax = 0.02g, act ay = 0.00g, act az = 1.01g
act temp = 30.15°C
data[0] = 8 data[1] = 12 data[2] = -1 data[3] = 43 data[4] = 11 data[5] = 2067
原始值:
gx = 8, gy = 12, gz = -1
ax = 43, ay = 11, az = 2067
temp = 1711
实际值:act gx = 0.49°/S, act gy = 0.73°/S, act gz = -0.06°/S
act ax = 0.02g, act ay = 0.01g, act az = 1.01g
act temp = 30.16°C
^C
#
数据读取成功。