移植环境:
MT8788 Android11 imx214_mipi_raw
移植条件:
1显示触摸正常
移植资料:
1硬件原理图 2调试原始资料
一 : camera 硬件分析
后摄
1.使用CAM_RST0,对应GPIO-101,用来复位摄像头,低电平有效,初始化配置为输出高电平,复位时序时序通常是: 高 –> 低 –> 高,根据硬件需要加一定的延时
2.使用I2C-2,SCL2对应GPIO-103,SDA2对应GPIO-104,用于内核与camera-ic的通信。
3.使用CAM_PDN0(省电模式),对应GPIO-97,PDN的作用是camera工作模式的切换,高电平有效,高电平是进入省电模式,一切对camera的操作都是无效的,包括复位。所以在复位前一定要将PDN引脚设为正常工作模式(低电平),否则复位无效。
4.使用CMMCLK0,对应GPIO0-99,MCLK(MasterClock)时钟用于分频给其他的CLK使用。
5.RCN/RCP、RDN/RDP为mipi接口,一对mipi差分时钟引脚RCN/RCP,四对mipi差分数据引脚RDNx/RDPx,这里有四个数据通道
6.VCAMA——AVDD,为模拟电源,主要给感光区和ADC供电。
7.VCAMD——DVDD,数字电源,主要给ISP供电。
8.VCAM_IO——VDDIO,数字IO电源,给I2C和DVP供电
9.VCAM_AF——对camera自动对焦马达的供电
前摄
1.复位脚使用CAM_RST1,对应GPIO-102,低电平有效,初始化配置为输出高电平。
2.I2C1/I2c2选择,此处使用I2C2,与后摄一样,在使用时只会有一个摄像头进行工作通信,所以可以共用一个I2C,SCL2对应GPIO-103,SDA2对应GPIO-104。
3.使用CAM_PDN1——对应GPIO-98。
4.CMMCLK0/CMMCLK1,使用CMMCLK-1。
5.一组mipi差分时钟引脚,RCN_A/RCP_A、四组差分数据引脚RDNx_A/RDPx_A。
6.电源与主摄一致
二 : 配置pin信息
1.配置DWS文件
DrvGen工具位置:vendor\mediatek\proprietary\tools\dct\DrvGen.exe
lk的DWS文件位置:
vendor\mediatek\proprietary\bootable\bootloader\lk\target\tb8788p1_64_bsp\dct\dct\codegen.dws
kernel的dws文件位置
kernel-4.14\drivers\misc\mediatek\dws\mt6771\tb8788p1_64_bsp.dws<b style="background-color: rgba(0, 0, 0, 0); color: rgb(0, 0, 0); font-family: "Microsoft YaHei", STXihei;"><font size="2"> </font></b>
camera power :
GPIO:
I2C:
(注意)前摄和后摄挂载在同一个I2C上,但是其device address不能一样,address为七位,所以大小不能超过0x7f,此处因为该i2c地址在代码中并未使用,故只需配置一个合法的地址即可。
2.配置camera dts
位置 : \kernel-4.14\arch\arm64\boot\dts\mediatek\tb8788p1_64_bsp.dts
内容 : 本次无需修改
三 : 驱动移植
1.移植驱动文件
将camera驱动文件夹imx214_mipi_raw添加到以下目录中 :
kernel-4.14\drivers\misc\mediatek\imgsensor\src\common\v1_1\
2.效果文件可以同目录选择复制已有的、型号类似的camera效果文件,使用Linux命令批量更改得来
按上述方法分别配置以下三个效果文件 如: “imx386_mipi_raw”并重新命名为“imx214_mipi_raw” 和“imx214sub_mipi_raw”;
vendor\mediatek\proprietary\custom\mt6771\hal\imgsensor_metadata\
vendor\mediatek\proprietary\custom\mt6771\hal\imgsensor\ver1\
vendor\mediatek\proprietary\custom\mt6771\hal\sendepfeature\
3.配置文件的修改
1.sensorlist.cpp 添加
目录:\vendor\mediatek\proprietary\custom\tb8788p1_64_bsp\hal\imgsensor_src\sensorlist.cpp
内容:
#if defined(IMX214_MIPI_RAW)
RAW_INFO_M(IMX214_SENSOR_ID, DEFAULT_MODULE_INDEX, DEFAULT_MODULE_ID, SENSOR_DRVNAME_IMX214_MIPI_RAW, CAM_CALGetCalData),
#endif
#if defined(IMX214SUB_MIPI_RAW)
RAW_INFO_M(IMX214SUB_SENSOR_ID, DEFAULT_MODULE_INDEX, DEFAULT_MODULE_ID, SENSOR_DRVNAME_IMX214SUB_MIPI_RAW, CAM_CALGetCalData),
#endif
2.lenslist.cpp文件添加 自动对焦文件
目录:\vendor\mediatek\proprietary\custom\mt6771\hal\lens\src\lenslist.cpp
内容:
extern PFUNC_GETLENSDEFAULT pDW9714AF_getDefaultData;
MSDK_LENS_INIT_FUNCTION_STRUCT LensList_main[MAX_NUM_OF_SUPPORT_LENS] =
{ {DUMMY_SENSOR_ID, DUMMY_MODULE_ID, DUMMY_LENS_ID, "Dummy", pDummy_getDefaultData},
添加:
{IMX214_SENSOR_ID, DUMMY_MODULE_ID, DW9714AF_LENS_ID, "DW9714AF", pDW9714AF_getDefaultData},
{IMX214SUB_SENSOR_ID, DUMMY_MODULE_ID, DW9714AF_LENS_ID, "DW9714AF", pDW9714AF_getDefaultData},
}
MSDK_LENS_INIT_FUNCTION_STRUCT LensList_sub[MAX_NUM_OF_SUPPORT_LENS] =
{ {DUMMY_SENSOR_ID, DUMMY_MODULE_ID, DUMMY_LENS_ID, "Dummy",pDummy_getDefaultData},
添加:
{IMX214_SENSOR_ID, DUMMY_MODULE_ID, DW9714AF_LENS_ID, "DW9714AF", pDW9714AF_getDefaultData},
{IMX214SUB_SENSOR_ID, DUMMY_MODULE_ID, DW9714AF_LENS_ID, "DW9714AF", pDW9714AF_getDefaultData},
};
3.配置MTK_SENSOR_INFO_SENSITIVITY_RANGE,复制一份其它的文件修改名字(注意:这个文件不能漏。不然不生成摄像头app)
目录:
\vendor\mediatek\proprietary\custom\common\hal\imgsensor_metadata\sensor\imx214sub_mipi_raw\config_static_metadata.sensor.imx214submipiraw.h
内容:
CONFIG_METADATA_BEGIN(MTK_SENSOR_INFO_SENSITIVITY_RANGE)
CONFIG_ENTRY_VALUE(100, MINT32)
CONFIG_ENTRY_VALUE(1600, MINT32)
CONFIG_METADATA_END()
4.修改device层kd_imgsensor.h文件
目录:\device\mediatek\common\kernel-headers\kd_imgsensor.h
内容:
#define IMX214_SENSOR_ID 0x0214
#define IMX214SUB_SENSOR_ID 0x0216
5.修改ProjectConfig.mk文件
目录:\device\mediateksample\tb8788p1_64_bsp\ProjectConfig.mk
内容: " 注意HAL层 与 kernel层 " LENS: 自动调焦镜头 imgsensor:摄像头
HAL:
CUSTOM_HAL_IMGSENSOR = imx214_mipi_raw imx214sub_mipi_raw
CUSTOM_HAL_LENS = dw9714af dw9714af
CUSTOM_HAL_MAIN_BACKUP_LENS = dw9714af
CUSTOM_HAL_MAIN_IMGSENSOR = imx214_mipi_raw
CUSTOM_HAL_MAIN_LENS = dw9714af
CUSTOM_HAL_SUB_BACKUP_LENS = dw9714af
CUSTOM_HAL_SUB_IMGSENSOR =imx214sub_mipi_raw
CUSTOM_HAL_SUB_LENS = dw9714af
Kernel:
CUSTOM_KERNEL_IMGSENSOR = imx214_mipi_raw imx214sub_mipi_raw
CUSTOM_KERNEL_LENS = dw9714af dw9714af
CUSTOM_KERNEL_MAIN_BACKUP_LENS = dw9714af
CUSTOM_KERNEL_MAIN_IMGSENSOR =imx214_mipi_raw
CUSTOM_KERNEL_MAIN_LENS = dw9714af
CUSTOM_KERNEL_SUB_BACKUP_LENS = dw9714af
CUSTOM_KERNEL_SUB_IMGSENSOR = imx214sub_mipi_raw
CUSTOM_KERNEL_SUB_LENS = dw9714af
kernel配置修改
6.tb8788p1_64_bsp_defconfig 文件修改
目录: 两个都修改
\kernel-4.14\arch\arm64\configs\tb8788p1_64_bsp_deconfig
\kernel-4.14\arch\arm64\configs\tb8788p1_64_bsp_debug_defconfig
内容:
在kernel中添加的文件夹名,注意要与ProjectConfig.mk的CUSTOM_HAL_IMGSENSOR,CUSTOM_KERNEL_IMGSENSOR 一致,否则编译会报错,主副前摄都要添加。
CONFIG_CUSTOM_KERNEL_IMGSENSOR="imx214_mipi_raw imx214sub_mipi_raw"
7.修改kernel层kd_imgsensor.h文件
目录:\kernel-4.14\drivers\misc\mediatek\imgsensor\inc\kd_imgsensor.h
内容:
#define IMX214_SENSOR_ID 0x0214
#define IMX214SUB_SENSOR_ID 0x0216
#define SENSOR_DRVNAME_IMX214_MIPI_RAW "imx214_mipi_raw"
#define SENSOR_DRVNAME_IMX214SUB_MIPI_RAW "imx214sub_mipi_raw"
8.imgsensor_cfg_table.c 配置上电时序
目录:\kernel-4.14\drivers\misc\mediatek\imgsensor\src\mt6771\camera_project\tb8788p1_64_bsp\camera_hw\imgsensor_cfg_table.c
内容:
//在sensor_power_sequence[]添加上电电压和时序设置
#if defined(IMX214_MIPI_RAW)
{
SENSOR_DRVNAME_IMX214_MIPI_RAW,
{
{SensorMCLK, Vol_High, 0},
{AVDD, Vol_2800, 0},
{DOVDD, Vol_1800, 0},
{DVDD, Vol_1000, 0},
{AFVDD, Vol_2800, 1},
{PDN, Vol_Low, 0},
{PDN, Vol_High, 0},
{RST, Vol_Low, 0},
{RST, Vol_High, 1}
},
},
#endif
#if defined(IMX214SUB_MIPI_RAW)
{
SENSOR_DRVNAME_IMX214SUB_MIPI_RAW,
{
{SensorMCLK, Vol_High, 0},
{AVDD, Vol_2800, 0},
{DOVDD, Vol_1800, 0},
{DVDD, Vol_1000, 0},
{AFVDD, Vol_2800, 1},
{PDN, Vol_Low, 1},
{PDN, Vol_High, 5},
{RST, Vol_Low, 1},
{RST, Vol_High, 10}
},
},
#endif
9.imgsensor_sensor_list.c 加入列表
目录:\kernel-4.14\drivers\misc\mediatek\imgsensor\src\common\v1_1\imgsensor_sensor_list.c
内容:
#if defined(IMX214_MIPI_RAW)
{IMX214_SENSOR_ID,SENSOR_DRVNAME_IMX214_MIPI_RAW, IMX214_MIPI_RAW_SensorInit},
#endif
#if defined(IMX214SUB_MIPI_RAW)
{IMX214SUB_SENSOR_ID,SENSOR_DRVNAME_IMX214SUB_MIPI_RAW, IMX214SUB_MIPI_RAW_SensorInit},
#endif
10.imgsensor_sensor_list.h 新的传感器驱动程序声明
目录:\kernel-4.14\drivers\misc\mediatek\imgsensor\src\common\v1_1\imgsensor_sensor_list.h
内容:
UINT32 IMX214_MIPI_RAW_SensorInit(struct SENSOR_FUNCTION_STRUCT **pfFunc);
UINT32 IMX214SUB_MIPI_RAW_SensorInit(struct SENSOR_FUNCTION_STRUCT **pfFunc);