MTK camera bring up
plaform: mt6739
camera_rear_front: sp0a09mipi_sensor
一DWS配置
根据硬件连接对照HW interface部分配置cam各pin
example
二config配置文件
Configure camera sensor hal driver in ProjectConfigmk
Add camera sensor kernel driver project config project_defconfig
三Kernel层添加驱动文件上电时序与头文件相关定义
添加驱动文件
1Add camera sensor kernel driver code to the corresponding pathkernel层路径
2添加Makefile
添加上下电时序
添加头文件相关定义
1kd_imgsensorh
2kd_sensorlisth
四Hal层添加效果驱动文件sensorlist文件中的定义与相关头文件定义
添加效果驱动文件
添加sensorlist文件中的定义
添加头文件相关定义
---------------------
参考https://blog.csdn.net/liaokesen168/article/details/78908876
一DWS配置
Z:\alps\vendor\mediatek\proprietary\scripts\dct\DrvGen.exe分别打开
Z:\alps\kernel-4.4\drivers\misc\mediatek\dws\mt6739\kaios31_256.dws
Z:\alps\vendor\mediatek\proprietary\bootable\bootloader\lk\target\kaios31_256\dct\dct\codegen.dws
Z:\alps\vendor\mediatek\proprietary\bootable\bootloader\preloader\custom\kaios31_256\dct\dct\codegen.dws
根据原理图和GPIO_Application_Spec 配置 CAM_PDN0 CMMCLK0 SCL2 SDA2
二config配置文件
Z:\alps\device\mediatek\kaios31_256\ProjectConfig.mk
CUSTOM_HAL_IMGSENSOR = sp0a09_mipi_raw sp0a09_mipi_raw_main
CUSTOM_HAL_LENS = dummy_lens
CUSTOM_HAL_MAIN_IMGSENSOR = sp0a09_mipi_raw_main
CUSTOM_HAL_SENSORS = sensor
CUSTOM_HAL_SUB_IMGSENSOR = sp0a09_mipi_raw
CUSTOM_KERNEL_IMGSENSOR = sp0a09_mipi_raw sp0a09_mipi_raw_main
CUSTOM_KERNEL_LENS = dummy_lens
CUSTOM_KERNEL_MAIN_IMGSENSOR = sp0a09_mipi_raw_main
CUSTOM_KERNEL_SUB_IMGSENSOR = sp0a09_mipi_raw
CUSTOM_KERNEL_SUB_LENS = dummy_lens
MTK_MTKLOGGER_SUPPORT = yes (打开log开关便于调试)
MTK_LOG_SUPPORT_MOBILE_LOG = yes
MTK_LOG_CUSTOMER_SUPPORT = yes
MTK_NETWORK_LOG_SUPPORT = yes
MTK_TELEPHONY_CONN_LOG_CTRL_SUPPORT = yes
Z:\alps\kernel-4.4\arch\arm\configs\kaios31_256_debug_defconfig
CONFIG_CUSTOM_KERNEL_IMGSENSOR="sp0a09_mipi_raw sp0a09_mipi_raw_main"
CONFIG_MTK_IMGSENSOR=y
Z:\alps\kernel-4.4\arch\arm\configs\kaios31_256_defconfig
CONFIG_CUSTOM_KERNEL_IMGSENSOR="sp0a09_mipi_raw sp0a09_mipi_raw_main"
CONFIG_MTK_IMGSENSOR=y
三Kernel层添加驱动文件上电时序与头文件相关定义
添加驱动文件
Z:\alps\kernel-4.4\drivers\misc\mediatek\imgsensor\src\common\v1\sp0a09_mipi_raw\
Z:\alps\kernel-4.4\drivers\misc\mediatek\imgsensor\src\common\v1\sp0a09_mipi_raw_main\
sp0a09_mipi_raw_main\sp0a09mipi_Sensor_main.c与sp0a09_mipi_raw\sp0a09mipi_Sensor.c不同之处如下:
#include "sp0a09mipi_Sensor_main.h" <=>#include "sp0a09mipi_Sensor.h"
#define MSENSOR_HV_MIRROR <=> #define SENSOR_NO_MIRROR
static imgsensor_info_struct imgsensor_info = {
.sensor_id = SP0A09MIPI_SENSOR_ID_MAIN, <=> .sensor_id = SP0A09MIPI_SENSOR_ID,
.sensor_output_dataformat = SENSOR_OUTPUT_FORMAT_RAW_R,//sensor output first pixel color <=>.sensor_output_dataformat = SENSOR_OUTPUT_FORMAT_RAW_B,
...
}
static imgsensor_struct imgsensor = {
.mirror =IMAGE_HV_MIRROR, <=> .mirror =IMAGE_NO_MIRROR,
}
static kal_uint32 return_sensor_id(void)
{
write_cmos_sensor(0xfd, 0x00);
return (((read_cmos_sensor(0xa0) << 8) | read_cmos_sensor(0xb0))+1); <=> return ((read_cmos_sensor(0xa0) << 8) | read_cmos_sensor(0xb0));
}
static void set_mirror_flip(kal_uint8 image_mirror)
{
switch (image_mirror) {
case IMAGE_HV_MIRROR: <=> case IMAGE_NO_MIRROR:
write_cmos_sensor(0x31,0x06); <=> write_cmos_sensor(0x31,0x00);
break;
}
}
extern int cam_idx;
注意这里给出cam_idx的出处,以及定义的意义,如下:
/*
Z:\alps\kernel-4.4\drivers\misc\mediatek\imgsensor\src\common\v1\imgsensor.c
int cam_idx; //add for main and sub same ic
static inline int imgsensor_check_is_alive(struct IMGSENSOR_SENSOR *psensor)
{
cam_idx = psensor_inst->sensor_idx; //add for main and sub same ic
}
*/
static kal_uint32 get_imgsensor_id(UINT32 *sensor_id)
{
kal_uint8 i = 0;
kal_uint8 retry = 20;//2;
printk("%s is come in\n",__func__);
#if 1
if ( cam_idx != 0) // 0:main 1 :sub <=> if ( cam_idx != 1) // 0:main 1 :sub
{
*sensor_id =0xffffffff;
return ERROR_SENSOR_CONNECT_FAIL;
}
#endif
}
UINT32 SP0A09MIPI_RAW_MAIN_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc) <=> UINT32 SP0A09MIPI_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc)
添加上电时序
Z:\alps\kernel-4.4\drivers\misc\mediatek\imgsensor\src\mt6739\camera_hw\imgsensor_cfg_table.c
#if defined(SP0A09_MIPI_RAW)
{
SENSOR_DRVNAME_SP0A09_MIPI_RAW_39,
{
{SensorMCLK, Vol_High, 0},
{PDN, Vol_High, 0, Vol_High},
{RST, Vol_Low, 0, Vol_Low},
{AVDD, Vol_2800, 1},
{DVDD, Vol_1800, 2},
{DOVDD, Vol_1800, 2},
{AFVDD, Vol_2800, 5},
{PDN, Vol_Low, 2},
{RST, Vol_High, 10}
},
},
#endif
#if defined(SP0A09_MIPI_RAW_MAIN)
{
SENSOR_DRVNAME_SP0A09_MIPI_RAW_39_MAIN,
{
{SensorMCLK, Vol_High, 0},
{PDN, Vol_High, 0, Vol_High},
{RST, Vol_Low, 0, Vol_Low},
{AVDD, Vol_2800, 1},
{DVDD, Vol_1800, 2},
{DOVDD, Vol_1800, 2},
{AFVDD, Vol_2800, 5},
{PDN, Vol_Low, 2},
{RST, Vol_High, 10}
},
},
#endif
添加头文件相关定义
Z:\alps\kernel-4.4\drivers\misc\mediatek\imgsensor\inc\kd_imgsensor.h
#define SP0A09MIPI_SENSOR_ID 0x0a09
#define SP0A09MIPI_SENSOR_ID_MAIN 0x0a0a
#define SENSOR_DRVNAME_SP0A09_MIPI_RAW_39_MAIN "sp0a09_mipi_raw_main"
#define SENSOR_DRVNAME_SP0A09_MIPI_RAW_39 "sp0a09_mipi_raw"
Z:\alps\kernel-4.4\drivers\misc\mediatek\imgsensor\src\common\v1\imgsensor_sensor_list.c
#if defined(SP0A09_MIPI_RAW)
{SP0A09MIPI_SENSOR_ID, SENSOR_DRVNAME_SP0A09_MIPI_RAW_39,SP0A09MIPI_RAW_SensorInit},
#endif
#if defined(SP0A09_MIPI_RAW_MAIN)
{SP0A09MIPI_SENSOR_ID_MAIN, SENSOR_DRVNAME_SP0A09_MIPI_RAW_39_MAIN,SP0A09MIPI_RAW_MAIN_SensorInit},
#endif
Z:\alps\kernel-4.4\drivers\misc\mediatek\imgsensor\src\common\v1\imgsensor_sensor_list.h
UINT32 SP0A09MIPI_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc);
UINT32 SP0A09MIPI_RAW_MAIN_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc);
四Hal层添加效果驱动文件sensorlist文件中的定义与相关头文件定义
添加效果驱动文件
Z:\alps\vendor\mediatek\proprietary\custom\mt6739\hal\imgsensor\sp0a09_mipi_raw\
Z:\alps\vendor\mediatek\proprietary\custom\mt6739\hal\imgsensor\sp0a09_mipi_raw_main\
sp0a09_mipi_raw\camera_info_sp0a09_mipi_raw_main.h与sp0a09_mipi_raw_main\camera_info_sp0a09_mipi_raw_main.h下文件的区别如下:
#define SENSOR_ID SP0A09MIPI_SENSOR_ID_MAIN <=> SP0A09MIPI_SENSOR_ID
#define SENSOR_DRVNAME SENSOR_DRVNAME_SP0A09_MIPI_RAW_39_MAIN <=> SENSOR_DRVNAME_SP0A09_MIPI_RAW_39
#define INCLUDE_FILENAME_ISP_REGS_PARAM "camera_isp_regs_sp0a09_mipi_raw_main.h" <=> "camera_isp_regs_sp0a09_mipi_raw.h"
#define INCLUDE_FILENAME_ISP_PCA_PARAM "camera_isp_pca_sp0a09_mipi_raw_main.h" <=> "camera_isp_pca_sp0a09_mipi_raw.h"
#define INCLUDE_FILENAME_ISP_LSC_PARAM "camera_isp_lsc_sp0a09_mipi_raw_main.h" <=> "camera_isp_lsc_sp0a09_mipi_raw.h"
#define INCLUDE_FILENAME_TSF_PARA "camera_tsf_para_sp0a09_mipi_raw_main.h" <=> "camera_tsf_para_sp0a09_mipi_raw.h"
#define INCLUDE_FILENAME_TSF_DATA "camera_tsf_data_sp0a09_mipi_raw_main.h" <=> "camera_tsf_data_sp0a09_mipi_raw.h"
#define INCLUDE_FILENAME_FLASH_AWB_PARA "camera_flash_awb_para_sp0a09_mipi_raw_main.h" <=> "camera_flash_awb_para_sp0a09_mipi_raw.h"
#define INCLUDE_FILENAME_FEATURE_PARA "camera_feature_para_sp0a09_mipi_raw_main.h" <=> "camera_feature_para_sp0a09_mipi_raw.h"
sp0a09_mipi_raw\camera_flicker_para_sp0a09_mipi_raw_main.cpp与sp0a09_mipi_raw_main\camera_flicker_para_sp0a09_mipi_raw_main.cpp下文件的区别如下:
#include "camera_AE_PLineTable_sp0a09_mipi_raw_main.h" <=> #include "camera_AE_PLineTable_sp0a09_mipi_raw.h"
#include "camera_info_sp0a09_mipi_raw_main.h" <=> #include "camera_info_sp0a09_mipi_raw.h"
sp0a09_mipi_raw\camera_tuning_para_sp0a09_mipi_raw_main.cpp与sp0a09_mipi_raw_main\camera_tuning_para_sp0a09_mipi_raw_main.cpp下文件的区别如下:
#include "camera_AE_PLineTable_sp0a09_mipi_raw_main.h" <=> #include "camera_AE_PLineTable_sp0a09_mipi_raw.h"
#include "camera_info_sp0a09_mipi_raw_main.h" <=> #include "camera_info_sp0a09_mipi_raw.h"
添加sensorlist文件中的定义
Z:\alps\vendor\mediatek\proprietary\custom\mt6739\hal\imgsensor_src\sensorlist.cpp
#if defined(SP0A09_MIPI_RAW)
RAW_INFO(SP0A09MIPI_SENSOR_ID, SENSOR_DRVNAME_SP0A09_MIPI_RAW_39,NULL),
#endif
#if defined(SP0A09_MIPI_RAW_MAIN)
RAW_INFO(SP0A09MIPI_SENSOR_ID_MAIN, SENSOR_DRVNAME_SP0A09_MIPI_RAW_39_MAIN,NULL),
#endif
添加头文件相关定义
Z:\alps\device\mediatek\common\kernel-headers\kd_imgsensor.h
#define SP0A09MIPI_SENSOR_ID 0x0a09
#define SP0A09MIPI_SENSOR_ID_MAIN 0x0a0a
#define SENSOR_DRVNAME_SP0A09_MIPI_RAW_39 "sp0a09_mipi_raw"
#define SENSOR_DRVNAME_SP0A09_MIPI_RAW_39_MAIN "sp0a09_mipi_raw_main"