Android MTK CAMERA 摄像头驱动

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

目录

  • Android MTK CAMERA 摄像头驱动
    • 一、修改文件和内容简述
    • 二、device配置
      • 1、修改ID和驱动名称
      • 2、修改系统配置
      • 3、修改用户配置
    • 三、修改内核配置
      • 1、配置ID和名称
      • 2、配置前后相同的摄像头
      • 3、配置内核驱动接口列表和声明
      • 4、配置添加内核驱动程序
      • 5、添加内核镜头驱动程序
    • 四、修改摄像头参数
      • 1、修改镜头方向
      • 2、修改HAL层名称定义
      • 3、修改镜头类型
      • 4、修改摄像头主参数
    • 五、小结

一、修改文件和内容简述

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

文件路径 控制内容
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_MAINcase 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_SUBcase 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_MAIN2case IMGSENSOR_SENSOR_IDX_MAIN2:pcustomize_sensor = IMGSENSOR_STRINGIZE(CONFIG_IMGSENSOR_MAIN2);break;
#endif
#ifdef CONFIG_IMGSENSOR_SUB2case IMGSENSOR_SENSOR_IDX_SUB2:pcustomize_sensor = IMGSENSOR_STRINGIZE(CONFIG_IMGSENSOR_SUB2);break;
#endif
#ifdef CONFIG_IMGSENSOR_MAIN3case IMGSENSOR_SENSOR_IDX_MAIN3:pcustomize_sensor = IMGSENSOR_STRINGIZE(CONFIG_IMGSENSOR_MAIN3);break;
#endifdefault:break;}if (pcustomize_sensor != NULL &&strlen(pcustomize_sensor) > 2 &&!strstr(pcustomize_sensor, curr_sensor_name))return IMGSENSOR_RETURN_ERROR;
#elseif (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个,很容易写错对应名称和遗漏修改的文件。因此,修改时要求非常仔细。

Android MTK CAMERA DRIVER 摄像头驱动相关推荐

  1. Android MTK LCM Driver 屏驱动

    Android MTK LCM Driver 屏驱动 ---- 屏驱动小结 手机驱动调试第一就是LCM,也就是我们说的LCD屏,因此要求驱动第一时间将确认和点亮.此篇就简单描述了在MTK 6765(A ...

  2. 【Mtk Camera Hal到驱动的流程(1)】

    Mtk Camera Hal到驱动的流程(1) (1)架构介绍 (A)Camera 的框架分为 Kernel 部分和 Hal 部分 Kernel部分: image sensor driver -- 负 ...

  3. Android MTK Camera驱动代码分析

    一.Camera调用过程:      imgsensor起到承上启下的作用,在系统起来时会创建整个camera驱动运行的环境,其中主要的文件和函数如下框图所示,先设备挂载时会调用注册platform设 ...

  4. Android MTK Camera博客分享

    MTK Camera博客分享 MTK Camera OTP调用过程 MTK Camera Flashlight调用过程 MTK Camera 应用层到底层过程 MTK Camera HAL层分析 深入 ...

  5. Mtk camera driver

    引用: http://blog.chinaunix.net/uid-26009923-id-3999723.html 1 kd_imgsensor.h 这个文件定义了camera节点的名字 /* CA ...

  6. android mtk camera startpreview,android8.1 mtk camera hal各种操作流程

    最近一年,一直在做android上的视频编解码和录相.以及camera hal和系统框架这一块.随着做的慢慢的深入,越发觉得mtk的camera hal这一块,有其独到之处.偏偏网上相关的资料却是极少 ...

  7. Mtk Camera Hal到驱动的流程(一)

    (1)架构介绍 (A)Camera的框架分为Kernel部分和Hal部分 Kernel部分: image sensor driver--负责具体型号的sensor的id检测,上电,以及在preview ...

  8. android打开系统前置摄像头驱动,android 调用系统前置摄像头

    第一种方式是采用MediaStore,调用系统原生的相机. Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.pu ...

  9. MTK camera 闪光灯Flashlight驱动调试流程

    Camera Flash 驱动分析 一.Flash驱动涉及到的文件包含: mediatek /custom/common/kernel/flashlight/src/kd_flashlightlist ...

  10. Android下的摄像头驱动开发

    Android下的摄像头驱动开发 由 King 发表于:2012/02/14 10:00 星期二 这几天拿到一个MINI210开发板,于是尝试着把ov7670移植到开发板上.仔细的观察了一下友善给的驱 ...

最新文章

  1. 母婴品牌与AI的碰撞:第四范式为美素佳儿提供智能推送服务
  2. VMware Esxi-5.1 简介与安装
  3. 已收藏!民生银行2021春招笔试后多久面试
  4. cdn搭建原理_直播平台搭建并不难,最难的是这两点
  5. oracle 空间详解,Oracle Spatial空间分析详解 | 学步园
  6. html缩放背景不缩放_缩放并不可怕。
  7. emacs命令/edwin参考
  8. vim光速开发,你值得拥有
  9. 正方形数组的数目(DAY 81)
  10. android颜色对应的xml配置值,颜色表
  11. Qt事件耦合器实现(类似C#的Prism中的事件耦合器)
  12. 循环冗余校验(CRC)之verilog实现
  13. python爬虫实现音乐下载
  14. 强化学习在文本生成nlg上的作用
  15. ASP实现自动发邮件
  16. ycy支付宝和余额宝 DeBug
  17. VMware vSphere Replication 8.5部署及使用教程
  18. 云专网和云专线的区别_云专线,为企业提供高质量专网互联,提升云应用服务性能...
  19. 学理发的入门基础知识 哪些内容要了解
  20. P2V 使用VMware vCenter Converter 6.2进行物理机虚拟化

热门文章

  1. pca图解读_主成分分析pca图解读,主成分分析散点图解读
  2. C盘100G不够,如何用D盘(或者E、F)空间给C盘扩容?
  3. 华普天健会计师事务所管理合伙人朱宗瑞:期待数据资产价值在财务报表里充分体现...
  4. 申请亚马逊AWS一年免费服务器
  5. springboot中@SpringBootApplication的扫描范围,以及多模块的扫描问题
  6. RuoYi-Vue 若依 新增子module模块,子模块的接口报404,以及自定义包名后如何确保正确扫描?
  7. 2022-2028全球智能门锁系统行业调研及趋势分析报告
  8. bada打地鼠应用程序简介
  9. 【2022年玄武云科技AI算法岗秋招面试记录】
  10. CRACK小试牛刀:关于GALGAME银色遥远爆破记录