(1)驱动文件夹创建
在 kernel-4.19/drivers/misc/mediatek/imgsensor/src/mtxxxx/中创建驱动文件夹,文件夹命名规则:IC名_接口类型_数据类型(如 s5k3l8_mipi_raw)。
把Camera驱动代码放入到该文件夹内,接着创建Makefile,在Makefile中添加 obj-y += s5k3l8mipiraw_Sensor.o。
(2)在kd_imgsensor.h添加信息
//在kernel-4.19/drivers/misc/mediatek/imgsensor/inc/kd_imgsensor.h 中添加Sensor ID 和 设备名
#define S5K3L8_SENSOR_ID 0x30C8 // 查看datasheet
#define SENSOR_DRVNAME_S5K3L8_MIPI_RAW "s5k3l8mipiraw"
(3)在imgsensor_sensor_list.c和imgsensor_sensor_list.h添加信息
//在/kernel-4.19/drivers/misc/mediatek/imgsensor/src/mtxxxx/中添加如下代码
UINT32 S5K3L8_MIPI_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc); // 声明Camera初始化函数,该函数是在该Camera驱动代码中
ACDK_KD_SENSOR_INIT_FUNCTION_STRUCT kdSensorList[MAX_NUM_OF_SUPPORT_SENSOR + 1] = {
#if defined(S5K3L8_MIPI_RAW) // kdSensorList 是有长度限制的,所以要用此方式添加
{S5K3L8_SENSOR_ID, SENSOR_DRVNAME_S5K3L8_MIPI_RAW, S5K3L8_MIPI_RAW_SensorInit},
#endif
};
(4)添加上电时序
在imgsensor_cfg_table.c文件中添加该Camera上电时序,上电时序需要参考该Camera模组的DateSheet。
// kernel-4.19/drivers/misc/mediatek/imgsensor/src/mtxxxx/camera_hw/imgsensor_cfg_table.c
PowerUp PowerOnList = {
#if defined(S5K3L8_MIPI_RAW)
{SENSOR_DRVNAME_S5K3L8_MIPI_RAW,
{
{SensorMCLK, Vol_High, 0},
{DOVDD, Vol_1800, 0},
{AVDD, Vol_2800, 0},
{DVDD, Vol_1200, 0},
{AFVDD, Vol_2800, 5},
{PDN, Vol_Low, 4},
{PDN, Vol_High, 0},
{RST, Vol_Low, 1},
{RST, Vol_High, 0},
},
},
#endif
(5)device目录下的配置
device/mediatek/common/kernel-headers/kd_imgsensor.h和 kernel 的 kd_imgsensor.h 文件一致。
(6)Hal的sensorlist配置
//vendor/mediatek/proprietary/custom/mtxxxx/hal/imgsensor_src/sensorlist.cpp
MSDK_SENSOR_INIT_FUNCTION_STRUCT SensorList[] = {
#if defined(S5K3L8_MIPI_RAW) // SensorList 是有长度限制的,所以要用此方式添加
RAW_INFO(S5K3L8_SENSOR_ID, SENSOR_DRVNAME_S5K3L8_MIPI_RAW, NULL), //最后一个NULL表示没有配置OT
#endif
};
注意: sensorlist.cpp中写的Camera顺序要和imgsensor_sensor_list.c中的一致,否则效果代码有可能会跑错。
(7)效果文件添加
在 vendor/mediatek/proprietary/custom/mtxxxx/hal/imgsensor/ 创建该Camera的文件夹,名字必须与kernel代码文件夹一致,接着在文件夹内放入相机效果参数文件。
(8)metadata添加
在 vendor/mediatek/proprietary/custom/mtxxxx/hal/imgsensor_metadata/创建该Camera的文件夹,名字必须与kernel代码文件夹一致
(9)ProjectConfig.mk添加配置信息
在ProjectConfig.mk 文件中搜索 imgsensor 关键字,接着添加要点亮的Camera字符串,如下
CUSTOM_HAL_IMGSENSOR = s5k3l8_mipi_raw gc5025_mipi_raw gc0310_mipi_yuv
//填写顺序:后摄 后摄 前摄 前摄 副后摄(放最后)
CUSTOM_HAL_MAIN_IMGSENSOR = s5k3l8_mipi_raw gc0310_mipi_yuv
CUSTOM_HAL_SUB_IMGSENSOR = gc5025_mipi_raw
CUSTOM_KERNEL_IMGSENSOR = s5k3l8_mipi_raw gc5025_mipi_raw gc0310_mipi_yuv //顺序必须一致
CUSTOM_KERNEL_MAIN_IMGSENSOR = s5k3l8_mipi_raw gc0310_mipi_yuv
CUSTOM_KERNEL_SUB_IMGSENSOR = gc5025_mipi_raw
注意: 该字符串要与驱动代码文件夹名字一致。
(10)kernel中添加配置信息
在k62v1_64_bsp_debug_defconfig和k62v1_64_bsp_defconfig相关project中添加配置信息,在文件中搜索CONFIG_CUSTOM_KERNEL_IMGSENSOR关键字,添加要点亮的Camera字符串。
CONFIG_CUSTOM_KERNEL_IMGSENSOR="s5k3l8_mipi_raw gc5025_mipi_raw gc0310_mipi_yuv" //顺序必须与ProjectConfig.mk中的顺序一致
点亮后摄的一般都需要配置lens,分别也有已经添加过的 和 未添加过的,已添加过的只需要执行(1)~(3)步,未添加过的需全部执行以下步骤。
这里以配置dw9714af为例,具体是需配置哪个lens由该Camera的硬件决定。
(1)ProjectConfig.mk添加配置信息
在ProjectConfig.mk 文件中搜索 lens 关键字,接着添加需要配置的lens,如下:
CUSTOM_HAL_LENS = dw9714af dummy_lens
CUSTOM_HAL_MAIN_LENS = dw9714af
CUSTOM_KERNEL_LENS = dw9714af dummy_lens
CUSTOM_KERNEL_MAIN_LENS = dw9714af
注意: dw9714af 该字符串必须与/kernel-4.19/drivers/misc/mediatek/lens/mtk/main/common/文件夹中 dw9714af 的文件夹名字相同。
(2)kernel中添加配置信息
在k62v1_64_bsp_debug_defconfig和k62v1_64_bsp_defconfig相关project中添加配置信息。
CONFIG_MTK_LENS=y
(3)lenslist.cpp添加信息
//vendor/mediatek/proprietary/custom/mt6765/hal/lens/src/lenslist.cpp
extern PFUNC_GETLENSDEFAULT pDW9714AF_getDefaultData;
MSDK_LENS_INIT_FUNCTION_STRUCT LensList_main[MAX_NUM_OF_SUPPORT_LENS] = {
#if defined(DW9714AF) // 配置的lens型号下
#if defined(S5K3L8_MIPI_RAW) // 添加需要使能对焦功能的Camera型号
{S5K3L8_SENSOR_ID, DUMMY_MODULE_ID, DW9714AF_LENS_ID, "DW9714AF", pDW9714AF_getDefaultData},
#endif
#endif
};
以下的步骤是第一次添加新lens的步骤。
(4)添加Lens驱动
在kernel-4.19/drivers/misc/mediatek/lens/mtk/main/common/ 文件夹中创建 fm50af 文件夹。
在 dw9714af 文件夹内放入 DW9714AF.c 和 Makefile 文件,Makefile中 写入 obj-y += DW9714AF.o
添加如下代码:
//kernel-4.19/drivers/misc/mediatek/lens/Kconfig
config MTK_LENS_DW9714AF_SUPPORT
tristate "DW9714AF Lens Driver"
depends on MTK_LENS
help
DW9714AF Lens Driver
This config is used to enable the corresponding
lens driver for the camera sensor module
Set as y if the driver is used in this project
添加如下代码:
//kernel-4.19/drivers/misc/mediatek/lens/mtk/main/Makefile
mainaf-y += common/dw9714af/DW9714AF.o
添加如下代码:
//kernel-4.19/drivers/misc/mediatek/lens/mtk/main/main_lens.c
static struct stAF_DrvList g_stAF_DrvList[MAX_NUM_OF_LENS] = {
{1, AFDRV_DW9714AF, DW9714AF_SetI2Cclient, DW9714AF_Ioctl,
DW9714AF_Release, DW9714AF_GetFileName, NULL},
};
添加如下代码:
//kernel-4.19/drivers/misc/mediatek/lens/mtk/main/inc/lens_info.h
#define AFDRV_DW9714AF "DW9714AF"
添加如下代码:
//kernel-4.19/drivers/misc/mediatek/lens/mtk/main/inc/lens_list.h
#define DW9714AF_SetI2Cclient DW9714AF_SetI2Cclient_Main
#define DW9714AF_Ioctl DW9714AF_Ioctl_Main
#define DW9714AF_Release DW9714AF_Release_Main
#define DW9714AF_GetFileName DW9714AF_GetFileName_Main
extern int DW9714AF_SetI2Cclient(struct i2c_client *pstAF_I2Cclient,
spinlock_t *pAF_SpinLock, int *pAF_Opened);
extern long DW9714AF_Ioctl(struct file *a_pstFile, unsigned int a_u4Command,
unsigned long a_u4Param);
extern int DW9714AF_Release(struct inode *a_pstInode, struct file *a_pstFile);
extern int DW9714AF_GetFileName(unsigned char *pFileName);
(5)添加lens效果
添加如下代码:
//vendor/mediatek/proprietary/custom/mtxxxx/hal/inc
#define DW9714AF_LENS_ID 0x9714
在vendor/mediatek/proprietary/custom/mtxxxx/hal/lens/ 文件夹内放入该lens的效果代码。
文件夹名字必须与kernel中驱动代码文件夹名字一致,如果没有则复制其他lens的效果代码,并修改文件名字和效果文件内的名字。