Android MTK CAMERA DRIVER 摄像头驱动

Android MTK CAMERA DRIVER 摄像头驱动Android MTK CAMERA 摄像头驱动 ——— 摄像头驱动小结
摄像头驱动因为参数较多、修改的文件较多,其实是比较复杂的。单大部分参调试参数有供应商提供支持,效果就不用担心了,我

Android MTK CAMERA 摄像头驱动

——— 摄像头驱动小结
摄像头驱动因为参数较多、修改的文件较多,其实是比较复杂的。单大部分参调试参数有供应商提供支持,效果就不用担心了,我们先将驱动部分点亮,后面就交给FAE和测试人员了。此篇简单介绍了在MTK 6765(Android9.0 / kernel-4.9)环境下的调试驱动的小结。


一、修改文件和内容简述

我以表格的形式描述出来,请见下表:

文件路径 控制内容
device/mediatek/common/kernel-headers/kd_imgsensor.h 定义设备的SENSOR_ID和SENSOR_DRVNAME
device/mediateksample/k65v1_64_bsp/ProjectConfig.mk 配置系统前后摄的名称和镜头,修改要全编译。
kernel-4.9/arch/arm64/configs/k65v1_64_bsp_defconfig 配置用户CONFIG_CUSTOM_KERNEL_IMGSENSOR的名称
kernel-4.9/arch/arm64/configs/k65v1_64_bsp_debug_defconfig 为debug配置用户CONFIG_CUSTOM_KERNEL_IMGSENSOR的名称
kernel-4.9/drivers/misc/mediatek/imgsensor/inc/kd_imgsensor.h 内核定义设备的SENSOR_ID和SENSOR_DRVNAME
kernel-4.9/drivers/misc/mediatek/imgsensor/src/common/v1/imgsensor_hw.c 内核定义设备识别方法和顺序
kernel-4.9/drivers/misc/mediatek/imgsensor/src/common/v1/imgsensor_sensor_list.c 内核定义驱动文件夹的宏对应驱动接口,注意大小写
kernel-4.9/drivers/misc/mediatek/imgsensor/src/common/v1/imgsensor_sensor_list.h 内核引用驱动函数声明
kernel-4.9/drivers/misc/mediatek/imgsensor/src/common/v1/ov5648sub_mipi_raw/ov5648submipi_Sensor.c 添加驱动文件夹以及驱动文件
kernel-4.9/drivers/misc/mediatek/imgsensor/src/common/v1/ov5648sub_mipi_raw/ov5648submipi_Sensor.h 添加驱动文件夹以及驱动文件
kernel-4.9/drivers/misc/mediatek/imgsensor/src/common/v1/ov5648sub_mipi_raw/Makefile 内核驱动编译文件添加obj-y +=XXX.o
kernel-4.9/drivers/misc/mediatek/lens/main/common/dw9718af/DW9718AF.c 添加可能的主镜头文件
kernel-4.9/drivers/misc/mediatek/lens/sub/common/dw9718af/DW9718AF.c 添加可能的前摄镜头文件
vendor/mediatek/proprietary/custom/mt6765/hal/imgsensor_src/cfg_setting_imgsensor.cpp 调整镜头旋转方向角度0、90、180、270
vendor/mediatek/proprietary/custom/mt6765/hal/imgsensor_src/sensorlist.cpp HaL定义设备的SENSOR_ID和SENSOR_DRVNAME
vendor/mediatek/proprietary/custom/mt6765/hal/lens/src/lenslist.cpp 镜头类型对应
vendor/mediatek/proprietary/custom/mt6765/hal/imgsensor_metadata/ov5648sub_mipi_raw 镜头参数文件
vendor/mediatek/proprietary/custom/mt6765/hal/sendepfeature/ov5648sub_mipi_raw/config.ftbl.ov5648_mipi_raw.h 镜头参数文件
vendor/mediatek/proprietary/custom/mt6765/hal/imgsensor/ver1/ov5648sub_mipi_raw/ 镜头参数文件夹
vendor/mediatek/proprietary/custom/mt6765/hal/camera_3a/ver1/isp_tuning_custom.cpp 镜头参数文件
vendor/mediatek/proprietary/custom/mt6765/hal/camera_3a/ver1/isp_tuning_custom.cpp 镜头参数文件

二、device配置

1、修改ID和驱动名称

文件位置:

device/mediatek/common/kernel-headers/kd_imgsensor.h

代码示例:

#define OV5648SUBMIPI_SENSOR_ID 0x5648
......
#define SENSOR_DRVNAME_OV5648SUB_MIPI_RAW "ov5648sub_mipi_raw"

2、修改系统配置

文件位置:

device/mediateksample/k65v1_64_bsp/ProjectConfig.mk
注意:该文件修改后全编译才可以生效,文件夹名称随平台变换。

修改配置:

CUSTOM_HAL_IMGSENSOR = imx214_mipi_raw ov5648sub_mipi_raw
CUSTOM_HAL_LENS = dw9714af dummy_lens 
......
CUSTOM_HAL_SUB_IMGSENSOR = ov5648sub_mipi_raw
CUSTOM_HAL_SUB_LENS = dummy_lens
......
CUSTOM_KERNEL_IMGSENSOR = imx214_mipi_raw ov5648sub_mipi_raw
CUSTOM_KERNEL_LENS = dw9714af dummy_lens
......
CUSTOM_KERNEL_MAIN_IMGSENSOR = imx214_mipi_raw
CUSTOM_KERNEL_MAIN_LENS = dw9714af 
......
CUSTOM_KERNEL_SUB_IMGSENSOR = ov5648sub_mipi_raw
CUSTOM_KERNEL_SUB_LENS = dummy_lens

3、修改用户配置

文件位置:

kernel-4.9/arch/arm64/configs/k65v1_64_bsp_defconfig
kernel-4.9/arch/arm64/configs/k65v1_64_bsp_debug_defconfig
注意:该文件修改后不需要全编译,文件夹名称随平台变换。带debug的是编译debug版本时候使用,不嫌麻烦就将两个文件都修改了吧。

修改配置:

CONFIG_CUSTOM_KERNEL_IMGSENSOR="imx214_mipi_raw ov5648sub_mipi_raw"
#CONFIG_SPECIFY_IMGSENSOR=y
#CONFIG_IMGSENSOR_MAIN="imx214_mipi_raw"
#CONFIG_IMGSENSOR_SUB="ov5648sub_mipi_raw"

注释的配置是前后摄相同时使用


三、修改内核配置

1、配置ID和名称

文件位置:

kernel-4.9/drivers/misc/mediatek/imgsensor/inc/kd_imgsensor.h

修改配置:

#define OV5648SUBMIPI_SENSOR_ID 0x5648
......
#define SENSOR_DRVNAME_OV5648SUB_MIPI_RAW "ov5648sub_mipi_raw"

此文件和device中的文件内容一样此处为内核使用,请不要遗漏。

2、配置前后相同的摄像头

如果前后摄像头不同,则直接跳过。

mtk android 9.0 camera kernel4.9和以前做了较大改动 特别是上电这一块做了高度集成, 在我们使用前后摄像头相同的情况话有可能会出现前摄像头识别成了后摄像头的情况,导致前摄的lens也误判为后摄的。但是在代码中有集成这块代码,通过宏来做区分,文件路径:

kernel-4.9/drivers/misc/mediatek/imgsensor/inc/kd_imgsensor.h

具体上电修改代码如下:


......
#if defined(CONFIG_IMGSENSOR_MAIN) || \ defined(CONFIG_IMGSENSOR_SUB) || \ defined(CONFIG_IMGSENSOR_MAIN2) || \ defined(CONFIG_IMGSENSOR_SUB2) || \ defined(CONFIG_IMGSENSOR_MAIN3)


        char *pcustomize_sensor = NULL;
#endif


#if defined(CONFIG_IMGSENSOR_MAIN) || \ defined(CONFIG_IMGSENSOR_SUB) || \ defined(CONFIG_IMGSENSOR_MAIN2) || \ defined(CONFIG_IMGSENSOR_SUB2) || \ defined(CONFIG_IMGSENSOR_MAIN3)

        if (curr_sensor_name == NULL)
                return IMGSENSOR_RETURN_ERROR;

        switch (sensor_idx) { 
   
#ifdef CONFIG_IMGSENSOR_MAIN
        case IMGSENSOR_SENSOR_IDX_MAIN:
                pcustomize_sensor = IMGSENSOR_STRINGIZE(CONFIG_IMGSENSOR_MAIN);
                
                printk("CONFIG_IMGSENSOR_MAIN pcustomize_sensor=%s\n",pcustomize_sensor);
                break;
#endif
#ifdef CONFIG_IMGSENSOR_SUB
        case IMGSENSOR_SENSOR_IDX_SUB:
                pcustomize_sensor = IMGSENSOR_STRINGIZE(CONFIG_IMGSENSOR_SUB);
                printk("CONFIG_IMGSENSOR_SUB pcustomize_sensor=%s\n",pcustomize_sensor);
                break;
#endif
#ifdef CONFIG_IMGSENSOR_MAIN2
        case IMGSENSOR_SENSOR_IDX_MAIN2:
                pcustomize_sensor = IMGSENSOR_STRINGIZE(CONFIG_IMGSENSOR_MAIN2);
                break;
#endif
#ifdef CONFIG_IMGSENSOR_SUB2
        case IMGSENSOR_SENSOR_IDX_SUB2:
                pcustomize_sensor = IMGSENSOR_STRINGIZE(CONFIG_IMGSENSOR_SUB2);
                break;
#endif
#ifdef CONFIG_IMGSENSOR_MAIN3
        case IMGSENSOR_SENSOR_IDX_MAIN3:
                pcustomize_sensor = IMGSENSOR_STRINGIZE(CONFIG_IMGSENSOR_MAIN3);
                break;
#endif
        default:
                break;
        }


        if (pcustomize_sensor != NULL &&
                strlen(pcustomize_sensor) > 2 &&
                !strstr(pcustomize_sensor, curr_sensor_name))
                return IMGSENSOR_RETURN_ERROR;
#else
        if (curr_sensor_name == NULL)
                return IMGSENSOR_RETURN_ERROR;
#endif

3、配置内核驱动接口列表和声明

文件位置:

kernel-4.9/drivers/misc/mediatek/imgsensor/src/common/v1/imgsensor_sensor_list.c //内核定义驱动文件夹的宏对应驱动接口,注意大小写
kernel-4.9/drivers/misc/mediatek/imgsensor/src/common/v1/imgsensor_sensor_list.h //内核引用驱动函数声明

imgsensor_sensor_list.c清单修改或添加配置:

#if defined(OV5648SUB_MIPI_RAW)//大写,对应驱动文件夹名称,文件夹名称为小写
	{ 
   OV5648SUBMIPI_SENSOR_ID,//ID名称
	SENSOR_DRVNAME_OV5648SUB_MIPI_RAW,//驱动名称
	OV5648SUBMIPISensorInit},//初始化函数接口名称
#endif

imgsensor_sensor_list.h内核声明:

UINT32 OV5648SUBMIPISensorInit(struct SENSOR_FUNCTION_STRUCT **pfFunc);

4、配置添加内核驱动程序

添加驱动文件夹以及驱动文件路径:

kernel-4.9/drivers/misc/mediatek/imgsensor/src/common/v1/ov5648sub_mipi_raw/ov5648submipi_Sensor.c
kernel-4.9/drivers/misc/mediatek/imgsensor/src/common/v1/ov5648sub_mipi_raw/ov5648submipi_Sensor.h

此文件是驱动核心文件,首先,文件夹的名称要和对应配置的名称。前面已经提及,驱动文件供应商一般都会有提供,但索要程序前请告知的当前平台。其次,我添加进去后看编译是否有.h文件有没有找到,修改对应ID名称、初始化函数名称等。最后,还要怀疑是够有编译到该驱动文件。这里就要说到.make文件了,路径和驱动文件一样:

kernel-4.9/drivers/misc/mediatek/imgsensor/src/common/v1/ov5648sub_mipi_raw/Makefile

文件中添加如下内容:

obj-y += ov5648submipi_Sensor.o

5、添加内核镜头驱动程序

如果程序中已经有对应的镜头驱动,那就跳过此步骤。
添加镜头文件路径:
kernel-4.9/drivers/misc/mediatek/lens/main/common/dw9718af/DW9718AF.c //添加可能的主镜头文件
kernel-4.9/drivers/misc/mediatek/lens/sub/common/dw9718af/DW9718AF.c //添加可能的前摄镜头文件

getSensorOrientation()
{ 
   
    static SensorOrientation_T const inst = { 
   
        .u4Degree_0 = 270,   // main sensor in degree (0, 90, 180, 270)
        .u4Degree_1 = 90,    // sub sensor in degree (0, 90, 180, 270)
        .u4Degree_2 = 90,   // main2 sensor in degree (0, 90, 180, 270)
        .u4Degree_3 = 270,   // sub2 sensor in degree (0, 90, 180, 270)
        .u4Degree_4 = 90,   // main3 sensor in degree (0, 90, 180, 270)
    };
    return inst;

}

四、修改摄像头参数

1、修改镜头方向

镜头方向文件路径:

vendor/mediatek/proprietary/custom/mt6765/hal/imgsensor_src/cfg_setting_imgsensor.cpp

根据硬件结构设计实际方向的调整镜头旋转方向角度,可以选择0、90、180、270度。如果有加速度传感器,就会有自动预览转向的功能。

2、修改HAL层名称定义

HaL定义设备的SENSOR_ID和SENSOR_DRVNAME路径:

vendor/mediatek/proprietary/custom/mt6765/hal/imgsensor_src/sensorlist.cpp

增加内容:

......
#if defined(OV5648SUB_MIPI_RAW)
    RAW_INFO(OV5648SUBMIPI_SENSOR_ID, SENSOR_DRVNAME_OV5648SUB_MIPI_RAW, NULL),
#endif

3、修改镜头类型

修改路径:

vendor/mediatek/proprietary/custom/mt6765/hal/lens/src/lenslist.cpp
vendor/mediatek/proprietary/custom/mt6765/hal/lens/dummy_lens

镜头类型对应的清单加入:如果是定焦镜头就选择Dummy,务必保证Hal/lens文件目录下有对应的镜头驱动。
添加的代码如下示例:

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, DW9718AF_LENS_ID,    "DW9718AF", pDW9718AF_getDefaultData},  
	{IMX214SUB_SENSOR_ID,  DUMMY_MODULE_ID, DW9718AF_LENS_ID, "DW9718AF", pDW9718AF_getDefaultData},
    {IMX230SUB_SENSOR_ID,  DUMMY_MODULE_ID, DW9714AF_LENS_ID, "DW9714AF", pDW9714AF_getDefaultData}, 
	+{OV5648SUBMIPI_SENSOR_ID,  DUMMY_MODULE_ID, DUMMY_LENS_ID, "Dummy", pDummy_getDefaultData},   
};

4、修改摄像头主参数

主要的参数可以先使用以前同平台同品牌同型号或类似型号的参数,后面约FAE现场调试,重点要注意修改文件名称和文件中对应的ID和宏名称,其主要有以下几个文件路径:

vendor/mediatek/proprietary/custom/mt6765/hal/imgsensor_metadata/ov5648sub_mipi_raw
vendor/mediatek/proprietary/custom/mt6765/hal/sendepfeature/ov5648sub_mipi_raw/config.ftbl.ov5648_mipi_raw.h
vendor/mediatek/proprietary/custom/mt6765/hal/imgsensor/ver1/ov5648sub_mipi_raw/
vendor/mediatek/proprietary/custom/mt6765/hal/camera_3a/ver1/isp_tuning_custom.cpp
vendor/mediatek/proprietary/custom/mt6765/hal/camera_3a/ver1/isp_tuning_custom.cpp

vendor/mediatek/proprietary/custom/mt6765/hal/imgsensor/ver1/ov5648sub_mipi_raw/的文件夹下的 文件较多,容易编译出问题,除了找供应商索取,也可以使用之前该品牌在像素接近的驱动参数验证。

五、小结

由于摄像头调试的文件较多,少说也有60-70个,很容易写错对应名称和遗漏修改的文件。因此,修改时要求非常仔细。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/37979.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注