mt6853 android11 imx214 main sub main2 camera移植
开发环境:
mt6853 android11
原理图
原理图解析:
根据原理图可知,前摄、后摄、副后摄包含了一组差分信号时钟线和四组差分信号数据线
前摄、后摄、副后摄的供电这块CAMA、CAMD是由外部供电,需要控制对应的EN pin脚,CAMIO、CAMAF由pmu供电
移植:
一、配置dws
kernel-4.14\drivers\misc\mediatek\dws\mt6853\k6853v1_64_6360.dws
vendor/mediatek/proprietary/bootable/bootloader/lk/target/k6853v1_64_6360/dct/dct/codegen.dws
gpio部分:
分别配置前摄、后摄、副后摄的 RST、PDN、MCLK、SCL、SDA、CAMA_EN、CAMD_EN
IIC部分:
注意:配置好IIC 通道,IIC地址由驱动里面配置、此处使用默认地址即可
pmic部分:
Select PMIC 对应的是PMIC_MT6359PMUMP,由于有三个摄像头,所以需要配置对应的三个AppName
GPIO、IIC、PMIC的配置在cust.dtsi中有对应生成
out\target\product\k6853v1_64_6360\obj\KERNEL_OBJ\arch\arm64\boot\dts\k6853v1_64_6360\cust.dtsi
&i2c2 {
#address-cells = <1>;
#size-cells = <0>;
clock-frequency = <400000>;
mediatek,use-open-drain;
camera_main_mtk:camera_main@1a {
compatible = "mediatek,camera_main";
reg = <0x1a>;
status = "okay";
};
camera_main_af_mtk:camera_main_af@0c {
compatible = "mediatek,camera_main_af";
reg = <0x0c>;
status = "okay";
};
};
.......
&mt_pmic_vcamio_ldo_reg {
regulator-name = "vcamio";
regulator-default-on = <1>; /* 0:skip, 1: off, 2:on */
status = "okay";
};
&kd_camera_hw1 {
vcamaf_main2-supply = <&mt_pmic_vcamio_ldo_reg>;
vcamaf-supply = <&mt_pmic_vcamio_ldo_reg>;
vcamaf_sub-supply = <&mt_pmic_vcamio_ldo_reg>;
status = "okay";
};
kernel-4.14\arch\arm64\boot\dts\mediatek\cust_mt6853_camera.dtsi
&kd_camera_hw1 {
pinctrl-names = "default",
"cam0_rst0", "cam0_rst1",
"cam0_pnd0", "cam0_pnd1",
"cam0_ldo_vcamd_0", "cam0_ldo_vcamd_1",
"cam0_ldo_vcama_0", "cam0_ldo_vcama_1",
"cam0_mclk_off",
"cam0_mclk_2mA", "cam0_mclk_4mA",
"cam0_mclk_6mA", "cam0_mclk_8mA",
"cam1_rst0", "cam1_rst1",
"cam1_pnd0", "cam1_pnd1",
"cam1_ldo_vcamd_0", "cam1_ldo_vcamd_1",
"cam1_ldo_vcama_0", "cam1_ldo_vcama_1",
"cam1_mclk_off",
"cam1_mclk_2mA", "cam1_mclk_4mA",
"cam1_mclk_6mA", "cam1_mclk_8mA",
"cam2_rst0", "cam2_rst1",
"cam2_pnd0", "cam2_pnd1",
"cam2_ldo_vcamd_0", "cam2_ldo_vcamd_1",
"cam2_ldo_vcama_0", "cam2_ldo_vcama_1",
"cam2_mclk_off",
"cam2_mclk_2mA", "cam2_mclk_4mA",
"cam2_mclk_6mA", "cam2_mclk_8mA";
pinctrl-0 = <&camera_pins_default>;
pinctrl-1 = <&camera_pins_cam0_rst_0>;
pinctrl-2 = <&camera_pins_cam0_rst_1>;
pinctrl-3 = <&camera_pins_cam0_pnd_0>;
pinctrl-4 = <&camera_pins_cam0_pnd_1>;
pinctrl-5 = <&camera_pins_cam0_vcamd_0>;
pinctrl-6 = <&camera_pins_cam0_vcamd_1>;
pinctrl-7 = <&camera_pins_cam0_vcama_0>;
pinctrl-8 = <&camera_pins_cam0_vcama_1>;
pinctrl-9 = <&camera_pins_cam0_mclk_off>;
pinctrl-10 = <&camera_pins_cam0_mclk_2ma>;
pinctrl-11 = <&camera_pins_cam0_mclk_4ma>;
pinctrl-12 = <&camera_pins_cam0_mclk_6ma>;
pinctrl-13 = <&camera_pins_cam0_mclk_8ma>;
pinctrl-14 = <&camera_pins_cam1_rst_0>;
pinctrl-15 = <&camera_pins_cam1_rst_1>;
pinctrl-16 = <&camera_pins_cam1_pnd_0>;
pinctrl-17 = <&camera_pins_cam1_pnd_1>;
pinctrl-18 = <&camera_pins_cam1_vcamd_0>;
pinctrl-19 = <&camera_pins_cam1_vcamd_1>;
pinctrl-20 = <&camera_pins_cam1_vcama_0>;
pinctrl-21 = <&camera_pins_cam1_vcama_1>;
pinctrl-22 = <&camera_pins_cam1_mclk_off>;
pinctrl-23 = <&camera_pins_cam1_mclk_2ma>;
pinctrl-24 = <&camera_pins_cam1_mclk_4ma>;
pinctrl-25 = <&camera_pins_cam1_mclk_6ma>;
pinctrl-26 = <&camera_pins_cam1_mclk_8ma>;
pinctrl-27 = <&camera_pins_cam2_rst_0>;
pinctrl-28 = <&camera_pins_cam2_rst_1>;
pinctrl-29 = <&camera_pins_cam2_pnd_0>;
pinctrl-30 = <&camera_pins_cam2_pnd_1>;
pinctrl-31 = <&camera_pins_cam2_vcamd_0>;
pinctrl-32 = <&camera_pins_cam2_vcamd_1>;
pinctrl-33 = <&camera_pins_cam2_vcama_0>;
pinctrl-34 = <&camera_pins_cam2_vcama_1>;
pinctrl-35 = <&camera_pins_cam2_mclk_off>;
pinctrl-36 = <&camera_pins_cam2_mclk_2ma>;
pinctrl-37 = <&camera_pins_cam2_mclk_4ma>;
pinctrl-38 = <&camera_pins_cam2_mclk_6ma>;
pinctrl-39 = <&camera_pins_cam2_mclk_8ma>;
cam0_vcamio-supply = <&mt_pmic_vcamio_ldo_reg>;
cam1_vcamio-supply = <&mt_pmic_vcamio_ldo_reg>;
cam2_vcamio-supply = <&mt_pmic_vcamio_ldo_reg>;
cam0_enable_sensor = "imx214_mipi_raw";
cam1_enable_sensor = "imx214sub_mipi_raw";
cam2_enable_sensor = "imx214main2_mipi_raw";
status = "okay";
};
/* CAMERA GPIO end */
三、工程配置中定义imgsensor
device\mediateksample\k6853v1_64_6360\ProjectConfig.mkCUSTOM_HAL_IMGSENSOR = imx214_mipi_raw imx214sub_mipi_raw imx214main2_mipi_raw
CUSTOM_HAL_MAIN2_IMGSENSOR = imx214main2_mipi_raw
CUSTOM_HAL_MAIN_IMGSENSOR = imx214_mipi_raw
CUSTOM_HAL_SUB_IMGSENSOR = imx214sub_mipi_raw
CUSTOM_KERNEL_IMGSENSOR = imx214_mipi_raw imx214sub_mipi_raw imx214main2_mipi_raw
CUSTOM_KERNEL_MAIN2_IMGSENSOR = imx214main2_mipi_raw
CUSTOM_KERNEL_MAIN_IMGSENSOR = imx214_mipi_raw
CUSTOM_KERNEL_SUB_IMGSENSOR = imx214sub_mipi_rawkernel-4.14\arch\arm64\configs\k6853v1_64_6360_defconfigkernel-4.14\arch\arm64\configs\k6853v1_64_6360_debug_defconfig四、kernel中的配置CONFIG_CUSTOM_KERNEL_IMGSENSOR="imx214_mipi_raw imx214sub_mipi_raw imx214main2_mipi_raw"添加驱动kernel-4.14\drivers\misc\mediatek\imgsensor\src\common\v1_1\imx214_mipi_rawkernel-4.14\drivers\misc\mediatek\imgsensor\src\common\v1_1\imx214sub_mipi_raw
kernel-4.14\drivers\misc\mediatek\imgsensor\src\common\v1_1\imx214main2_mipi_raw
static struct imgsensor_info_struct imgsensor_info = {
.sensor_id = IMX214_SENSOR_ID, //sensor_id 名字不能一样 定义的ID可以分别+1配置sensor_listkernel-4.14\drivers\misc\mediatek\imgsensor\src\common\v1_1\imgsensor_sensor_list.h
UINT32 IMX214_MIPI_RAW_SensorInit(struct SENSOR_FUNCTION_STRUCT **pfFunc);//声明SensorInit
UINT32 IMX214SUB_MIPI_RAW_SensorInit(struct SENSOR_FUNCTION_STRUCT **pfFunc);
UINT32 IMX214MAIN2_MIPI_RAW_SensorInit(struct SENSOR_FUNCTION_STRUCT **pfFunc);
kernel-4.14\drivers\misc\mediatek\imgsensor\src\common\v1_1\imgsensor_sensor_list.c
#if defined(IMX219_MIPI_RAW)
{IMX219_SENSOR_ID, SENSOR_DRVNAME_IMX219_MIPI_RAW, IMX219_MIPI_RAW_SensorInit},
#endif
#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
#if defined(IMX214MAIN2_MIPI_RAW)
{IMX214MAIN2_SENSOR_ID, SENSOR_DRVNAME_IMX214MAIN2_MIPI_RAW, IMX214MAIN2_MIPI_RAW_SensorInit},
#endif定义SENSOR_ID和SENSOR_DRVNAMEkernel-4.14\drivers\misc\mediatek\imgsensor\inc\kd_imgsensor.h
添加上电时序#define IMX214_SENSOR_ID 0x0214
#define IMX214SUB_SENSOR_ID 0x0216
#define IMX214MAIN2_SENSOR_ID 0x0218
kernel-4.14\drivers\misc\mediatek\imgsensor\src\common\v1_1\imgsensor_pwr_seq.c
五、vendor中的配置struct IMGSENSOR_HW_POWER_SEQ 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
.....
}
配置MCLK
vendor\mediatek\proprietary\custom\mt6853\hal\imgsensor_src\cfg_setting_imgsensor.cpp
static CUSTOM_CFG gCustomCfg[] = {
{
.sensorIdx = IMGSENSOR_SENSOR_IDX_MAIN,
.mclk = CUSTOM_CFG_MCLK_1, //MCLK0 与原理图对应
.port = CUSTOM_CFG_CSI_PORT_1,
.dir = CUSTOM_CFG_DIR_REAR,
.bitOrder = CUSTOM_CFG_BITORDER_9_2,
.orientation = 90,
.horizontalFov = 67,
.verticalFov = 49
},
{
.sensorIdx = IMGSENSOR_SENSOR_IDX_SUB,
.mclk = CUSTOM_CFG_MCLK_4, //MCLK3
.port = CUSTOM_CFG_CSI_PORT_3,
.dir = CUSTOM_CFG_DIR_FRONT,
.bitOrder = CUSTOM_CFG_BITORDER_9_2,
.orientation = 270,
.horizontalFov = 63,
.verticalFov = 40,
.secure = CUSTOM_CFG_SECURE_M0
},
{
.sensorIdx = IMGSENSOR_SENSOR_IDX_MAIN2,
.mclk = CUSTOM_CFG_MCLK_2, //MCLK1
.port = CUSTOM_CFG_CSI_PORT_2,
.dir = CUSTOM_CFG_DIR_REAR,
.bitOrder = CUSTOM_CFG_BITORDER_9_2,
.orientation = 90,
.horizontalFov = 75,
.verticalFov = 60
},配置自动对焦vendor\mediatek\proprietary\custom\mt6853\hal\lens\src\lenslist.cpp
//由于摄像头都是214,所以使用同一个LENS配置sensorlistvendor\mediatek\proprietary\custom\mt6853\hal\imgsensor_src\sensorlist.cpp /*sensorlist中的放置位置必须与kernel 中的 sensorlist中保持一致*/
配置效果
六、device中的配置vendor\mediatek\proprietary\custom\common\hal\imgsensor_metadata\sensor\imx214_mipi_raw\ /*这个路径下的效果必须要有配置,不然摄像头不亮*/
vendor\mediatek\proprietary\custom\common\hal\imgsensor_metadata\sensor\imx214main2_mipi_raw\
vendor\mediatek\proprietary\custom\common\hal\imgsensor_metadata\sensor\imx214sub_mipi_raw\
vendor\mediatek\proprietary\custom\mt6853\hal\sendepfeature\imx214_mipi_raw\config.ftbl.imx214_mipi_raw.h
vendor\mediatek\proprietary\custom\mt6853\hal\sendepfeature\imx214main2_mipi_raw\config.ftbl.imx214main2_mipi_raw.h
vendor\mediatek\proprietary\custom\mt6853\hal\sendepfeature\imx214sub_mipi_raw\config.ftbl.imx214sub_mipi_raw.h
vendor\mediatek\proprietary\custom\mt6853\hal\imgsensor_metadata\imx214_mipi_raw\
vendor\mediatek\proprietary\custom\mt6853\hal\imgsensor_metadata\imx214main2_mipi_raw\
vendor\mediatek\proprietary\custom\mt6853\hal\imgsensor_metadata\imx214sub_mipi_raw\
vendor\mediatek\proprietary\custom\mt6853\hal\imgsensor\ver1\imx214sub_mipi_raw\
vendor\mediatek\proprietary\custom\mt6853\hal\imgsensor\ver1\imx214main2_mipi_raw\
vendor\mediatek\proprietary\custom\mt6853\hal\imgsensor\ver1\imx214_mipi_raw\
device\mediatek\common\kernel-headers\kd_imgsensor.h /*与kernel中kd_imgsensor.h里面的放置保持一致*/