对makefile一知半解,就通过camera kernel大概学习下,至少能读懂大部分意思
1.Kconfig
kernel-4.19/drivers/misc/mediatek/imgsensor/Kconfig
参考:https://blog.csdn.net/u011425939/article/details/80472324
config MTK_IMGSENSOR
bool "Camera Imgsensor Driver Support"
help
Kernel space image sensor driver. Define project used all image
sensors .The value is combination of CUSTOM_KERNEL_MAIN_IMGSENSOR,
CUSTOM_KERNEL_MAIN_BACKUP_IMGSENSOR, CUSTOM_KERNEL_SUB_IMGSENSOR,
and CUSTOM_KERNEL_SUB_BACKUP_IMGSENSOR
source "drivers/misc/mediatek/imgsensor/src/Kconfig"
主要就是bool类型的Camera Imgsensor Driver Support,用来配置内核
source条目用于读取另一个Kconfig文件
继续看src下的Kconfig
config SPECIFY_IMGSENSOR
bool SPECIFY_IMGSENSOR
depends on MTK_IMGSENSOR
help
Specify name of each sensor to
prevent obtaining wrong sensor driver with same sensor ID.
For example, imx258_mipi_raw and imx258_mipi_mono
are of same sensor ID. If not specifying
sensor, imx258_mipi_mono may be recognized as imx258_mipi_raw.
config IMGSENSOR_MAIN
string "Custom main image sensor"
depends on SPECIFY_IMGSENSOR
help
Specify main sensor.
This config is mainly mapping to userspace.
Consider the numbers of sensors and usage on the phone.
Compare the custom usage defined in user-custom folder.
config IMGSENSOR_MAIN2
string "Custom main2 image sensor"
depends on SPECIFY_IMGSENSOR
help
Specify main2 sensor.
This config is mainly mapping to userspace.
Consider the numbers of sensors and usage on the phone.
Compare the custom usage defined in user-custom folder.
SPECIFY_IMGSENSOR依赖与上层的MTK_IMGSENSOR,而IMGSENSOR_MAIN等依赖SPECIFY_IMGSENSOR
2.Makefile
kernel-4.19/drivers/misc/mediatek/imgsensor/src/Makefile
subdir-ccflags-y += -I$(srctree)/drivers/i2c/busses/ \
-I$(srctree)/drivers/misc/mediatek/mmdvfs/ \
-I$(srctree)/drivers/misc/mediatek/ccu/inc
#kbuild就会将以上三个目录添加到编译时的头文件搜索目录中,对其subdir也有效。
MTK_PLATFORM := $(subst ",,$(CONFIG_MTK_PLATFORM))
ARCH_MTK_PROJECT := $(subst ",,$(CONFIG_ARCH_MTK_PROJECT))
#将“替换成无,或者理解为去掉"
MTK_PLATFORM_PATH_ROOT := $(srctree)/drivers/misc/mediatek/mach/$(MTK_PLATFORM)
MTK_PROJECT_PATH_ROOT := $(srctree)/drivers/misc/mediatek/mach/$(MTK_PLATFORM)/$(ARCH_MTK_PROJECT)
CONFIG_MTK_PLATFORM_SENSOR := $(CONFIG_MTK_PLATFORM)
subdir-ccflags-y += -I$(MTK_PROJECT_PATH_ROOT)/camera/camera
MTK_DRIVER_PATH := $(srctree)/drivers/misc/mediatek
subdir-ccflags-y += -I$(MTK_DRIVER_PATH)/camera/$(MTK_PLATFORM) \
-I$(MTK_DRIVER_PATH)/imgsensor/inc \
-I$(MTK_DRIVER_PATH)/imgsensor/src/$(CONFIG_MTK_PLATFORM_SENSOR)/camera_project/$(ARCH_MTK_PROJECT)/camera_hw \
-I$(MTK_DRIVER_PATH)/imgsensor/src/$(CONFIG_MTK_PLATFORM_SENSOR)/camera_hw \
-I$(MTK_DRIVER_PATH)/cam_cal/inc \
-I$(MTK_DRIVER_PATH)/smi \
-I$(MTK_DRIVER_PATH)/include/mt-plat/$(MTK_PLATFORM)/include/mach \
-I$(MTK_DRIVER_PATH)/imgsensor/src/$(CONFIG_MTK_PLATFORM_SENSOR)
subdir-ccflags-$(CONFIG_TINNO_PRODUCT_INFO) += -I$(srctree)/drivers/misc/dev_info
CUSTOM_KERNEL_FLAGS := $(addprefix -D, $(shell echo \
$(CONFIG_CUSTOM_KERNEL_IMGSENSOR) | tr a-z A-Z))
#添加添加-D前缀,小写转大写 -D为添加宏定义
subdir-ccflags-y += $(CUSTOM_KERNEL_FLAGS)
obj-y += $(subst ",,$(CONFIG_MTK_PLATFORM_SENSOR))/
再继续看下层makefile,如MTK_PLATFORM所对应的mt6765
MTK_PLATFORM := $(subst ",,$(CONFIG_MTK_PLATFORM))
ARCH_MTK_PROJECT := $(subst ",,$(CONFIG_ARCH_MTK_PROJECT))
IMGSENSOR_DRIVER_PATH := $(srctree)/drivers/misc/mediatek/imgsensor/src
COMMON_VERSION := v1
subdir-ccflags-y += -I$(IMGSENSOR_DRIVER_PATH)/common/$(COMMON_VERSION)
obj-y += ../common/$(COMMON_VERSION)/imgsensor.o
obj-y += ../common/$(COMMON_VERSION)/imgsensor.o
obj-y += ../common/$(COMMON_VERSION)/imgsensor_hw.o
obj-y += ../common/$(COMMON_VERSION)/imgsensor_i2c.o
obj-y += ../common/$(COMMON_VERSION)/imgsensor_legacy.o
obj-y += ../common/$(COMMON_VERSION)/imgsensor_proc.o
ifeq (,$(wildcard $(IMGSENSOR_DRIVER_PATH)/$(MTK_PLATFORM)/camera_project/$(ARCH_MTK_PROJECT)/$(COMMON_VERSION)))
#wildcard展开为已经存在的、使用空格分开的、匹配此模式的所有文件列表。如果不存在任何符合此模式的文件,函数会忽略模式字符并返回空
obj-y += ../common/$(COMMON_VERSION)/imgsensor_sensor_list.o
else
obj-y += camera_project/$(ARCH_MTK_PROJECT)/$(COMMON_VERSION)/imgsensor_sensor_list.o
endif
#此处可理解为匹配imgsensor_sensor_list.c文件,camera_project/$(ARCH_MTK_PROJECT)/$(COMMON_VERSION)/imgsensor_sensor_list.o优先级高于common目录下的
这里 $ (1)可理解为具体的每个camera驱动目录名称
两层判断,第一层:
如果在$ (IMGSENSOR_DRIVER_PATH)/ $ (MTK_PLATFORM)/camera_project/ $ (ARCH_MTK_PROJECT)/ $ (COMMON_VERSION)/ $ (1)如果没找到,进入第二层循环,找到了,就将platform_drv赋值。
第二层:
继续在 $ (IMGSENSOR_DRIVER_PATH)/ $ (MTK_PLATFORM)/下找,没找到,就最后在common/$(COMMON_VERSION)/下找
综上:查找具体sensor驱动目录优先级为
1.mediatek/imgsensor/src/mt6765/camera_project/$(ARCH_MTK_PROJECT)/v1
2.mediatek/imgsensor/src/mt6765
3.mediatek/imgsensor/src/common/v1
继续看剩下部分:
ifneq ($(common_drv),)
$(info imgsensor drv by common $(common_drv))
endif
obj-y += $(common_drv)
ifneq ($(platform_drv),)
$(info imgsensor drv by platform $(platform_drv))
#此处会打印出匹配出的驱动目录
endif
obj-y += $(platform_drv)
obj-y += imgsensor_clk.o
ifneq ($(project_drv),)
$(info imgsensor drv by platform $(project_drv))
endif
obj-y += $(project_drv)
ifeq (,$(wildcard $(IMGSENSOR_DRIVER_PATH)/$(MTK_PLATFORM)/camera_project/$(ARCH_MTK_PROJECT)/camera_hw))
subdir-ccflags-y += -I$(IMGSENSOR_DRIVER_PATH)/$(MTK_PLATFORM)/camera_hw
obj-y += camera_hw/
ifneq ($(project_drv),)
obj-y += camera_project/$(ARCH_MTK_PROJECT)/
endif
else
obj-y += camera_project/$(ARCH_MTK_PROJECT)/camera_hw/
subdir-ccflags-y += -I$(IMGSENSOR_DRIVER_PATH)/$(MTK_PLATFORM)/camera_project/$(ARCH_MTK_PROJECT)/camera_hw
endif
#选择camera_hw/,原理同上