这里以mt6737t为例

1、编译摄像头驱动
    device/lentek/xxxxxx/ProjectConfig.mk
    kernel-3.18/arch/arm64/configs/xxxxx_defconfig
    kernel-3.18/drivers/misc/mediatek/imgsensor/src/mt6735/
    kernel-3.18/drivers/misc/mediatek/imgsensor/inc/kd_imgsensor.h
2、上电
    kernel-3.18/drivers/misc/mediatek/imgsensor/src/mt6735/camera_hw/kd_camera_hw.c
3、hal修改
    device/mediatek/common/kernel-headers/kd_imgsensor.h
    vendor/mediatek/proprietary/custom/mt6735/hal/D1/imgsensor_src/sensorlist.cpp
    vendor/mediatek/proprietary/custom/mt6735/hal/D1/imgsensor/

上电过程小析

vendor/mediatek/proprietary/hardware/mtkcam/legacy/platform/mt6735/hal/sensor/imgsensor_drv.c

MINT32 ImgSensorDrv::impSearchSensor(pfExIdChk pExIdChkCbf)
for (SensorEnum = 0; SensorEnum <= 2; SensorEnum <<= 1)  {for (i = 0; i < MAX_NUM_OF_SUPPORT_SENSOR; i++) {if (m_pstSensorInitFunc[i].getCameraDefault == NULL) {LOG_MSG("m_pstSensorInitFunc[i].getCameraDefault is NULL: %d \n", i);break;}ioctl(m_fdSensor, KDIMGSENSORIOC_X_SET_DRIVER,&id[KDIMGSENSOR_INVOKE_DRIVER_0] );ioctl(m_fdSensor, KDIMGSENSORIOC_T_CHECK_IS_ALIVE);}
}

先找后摄,再找前摄(遍历所有摄像头  上电  匹配id)
对于后摄,上电时上的是后摄的电源,所以前摄的id匹配不上。(前摄同理于后摄)

这里,后摄兼容3颗sensor,分别是ov5695,ov8856,gc5025,前摄为sp2509,打印如下

2565:01-12 23:25:57.130   454   454 D ImgSensorDrv: [impSearchSensor]SENSOR search start
2566:01-12 23:25:57.130   454   454 D ImgSensorDrv: [impSearchSensor]impSearchSensor search to sub
2567:01-12 23:25:57.130   454   454 D ImgSensorDrv: [impSearchSensor]set sensor driver id =10000
2706:01-12 23:25:57.317   454   454 D ImgSensorDrv: [impSearchSensor][impSearchSensor] Err-ctrlCode (I/O error)
2710:01-12 23:25:57.317   454   454 D ImgSensorDrv: [impSearchSensor]sensor ID mismatch
2711:01-12 23:25:57.317   454   454 D ImgSensorDrv: [impSearchSensor]set sensor driver id =10001
2876:01-12 23:25:57.473   454   454 D ImgSensorDrv: [impSearchSensor][impSearchSensor] Err-ctrlCode (I/O error)
2880:01-12 23:25:57.482   454   454 D ImgSensorDrv: [impSearchSensor]sensor ID mismatch
2881:01-12 23:25:57.482   454   454 D ImgSensorDrv: [impSearchSensor]set sensor driver id =10002
3294:01-12 23:25:57.810   454   454 D ImgSensorDrv: [impSearchSensor]found <0x5025/gc5025mipiraw/SENSOR_DRVNAME_GC5025_MIPI_RAW>
3295:01-12 23:25:57.810   454   454 D ImgSensorDrv: [impSearchSensor]MAIN sensor found:[2]/[0x10002]/[0]/[1]
3296:01-12 23:25:57.810   454   454 D ImgSensorDrv: [impSearchSensor]set sensor driver id =10003
3521:01-12 23:25:58.118   454   454 D ImgSensorDrv: [impSearchSensor][impSearchSensor] Err-ctrlCode (I/O error)
3525:01-12 23:25:58.118   454   454 D ImgSensorDrv: [impSearchSensor]sensor ID mismatch
3526:01-12 23:25:58.118   454   454 D ImgSensorDrv: [impSearchSensor]m_pstSensorInitFunc[i].getCameraDefault is NULL: 4
3527:01-12 23:25:58.118   454   454 D ImgSensorDrv: [impSearchSensor]impSearchSensor search to sub
3528:01-12 23:25:58.119   454   454 D ImgSensorDrv: [impSearchSensor]set sensor driver id =20000
3529:01-12 23:25:58.119   454   454 D ImgSensorDrv: [impSearchSensor][impSearchSensor] Err-ctrlCode (I/O error)
3537:01-12 23:25:58.121   454   454 D ImgSensorDrv: [impSearchSensor]sensor ID mismatch
3538:01-12 23:25:58.121   454   454 D ImgSensorDrv: [impSearchSensor]set sensor driver id =20001
3539:01-12 23:25:58.121   454   454 D ImgSensorDrv: [impSearchSensor][impSearchSensor] Err-ctrlCode (I/O error)
3543:01-12 23:25:58.122   454   454 D ImgSensorDrv: [impSearchSensor]sensor ID mismatch
3544:01-12 23:25:58.122   454   454 D ImgSensorDrv: [impSearchSensor]set sensor driver id =20002
3875:01-12 23:25:58.547   454   454 D ImgSensorDrv: [impSearchSensor][impSearchSensor] Err-ctrlCode (I/O error)
3879:01-12 23:25:58.550   454   454 D ImgSensorDrv: [impSearchSensor]sensor ID mismatch
3880:01-12 23:25:58.550   454   454 D ImgSensorDrv: [impSearchSensor]set sensor driver id =20003
3937:01-12 23:25:58.782   454   454 D ImgSensorDrv: [impSearchSensor]found <0x2509/sp2509mipiraw/SENSOR_DRVNAME_SP2509_MIPI_RAW>
3938:01-12 23:25:58.782   454   454 D ImgSensorDrv: [impSearchSensor]SUB sensor found:[3]/[0x20003]/[0]/[-1]
3939:01-12 23:25:58.782   454   454 D ImgSensorDrv: [impSearchSensor]m_pstSensorInitFunc[i].getCameraDefault is NULL: 4
3940:01-12 23:25:58.782   454   454 D ImgSensorDrv: [impSearchSensor]SENSOR search end: 0x3 /[0x5025][2]/[0xffffff][255]/[0x2509][3]

kernel-3.18/drivers/misc/mediatek/imgsensor/src/mt6735/kd_sensorlist.c

    case KDIMGSENSORIOC_X_SET_DRIVER:i4RetValue = kdSetDriver((unsigned int *)pBuff);break;case KDIMGSENSORIOC_T_CHECK_IS_ALIVE:i4RetValue = adopt_CAMERA_HW_CheckIsAlive();break;int kdSetDriver(unsigned int *pDrvIndex){pSensorList[drvIdx[i]].SensorInit(&g_pInvokeSensorFunc[i]);memcpy((char *)g_invokeSensorNameStr[i], (char *)pSensorList[drvIdx[i]].drvname, sizeof(pSensorList[drvIdx[i]].drvname));//获取摄像头的名字}

kernel-3.18/drivers/misc/mediatek/imgsensor/src/mt6735/camera_hw/kd_camera_hw.c

adopt_CAMERA_HW_CheckIsAlive(void){if(0!=kdModulePowerOn((CAMERA_DUAL_CAMERA_SENSOR_ENUM *)g_invokeSocketIdx, g_invokeSensorNameStr, true, CAMERA_HW_DRVNAME1)){return -EIO;}err = g_pSensorFunc->SensorFeatureControl(g_invokeSocketIdx[i], SENSOR_FEATURE_CHECK_SENSOR_ID, (MUINT8 *)&sensorID, &retLen);//读sensor id
}

kdModulePowerOn调用kdCISModulePowerOn

int kdCISModulePowerOn(CAMERA_DUAL_CAMERA_SENSOR_ENUM SensorIdx, char *currSensorName, bool On, char *mode_name)
{............if(currSensorName && (0 == strcmp(SENSOR_DRVNAME_GC5025_MIPI_RAW, currSensorName))) {if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMPDN])mtkcam_gpio_set(pinSetIdx, CAMPDN, pinSet[pinSetIdx][IDX_PS_CMPDN + IDX_PS_OFF]);if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST])mtkcam_gpio_set(pinSetIdx, CAMRST, pinSet[pinSetIdx][IDX_PS_CMRST + IDX_PS_OFF]);mdelay(50);/* VCAM_IO */if (TRUE != _hwPowerOn(VCAMIO, VOL_1800)) {PK_DBG("[CAMERA SENSOR] Fail to enable IO power (VCAM_IO),power id = %d\n", VCAMIO);goto _kdCISModulePowerOn_exit_;}mdelay(10);if (TRUE != _hwPowerOn(VCAMD, VOL_1500)) {PK_DBG("[CAMERA SENSOR] Fail to enable digital power (VCAM_D),power id = %d\n", VCAMD);goto _kdCISModulePowerOn_exit_;}mdelay(10);/* VCAM_A */if (TRUE != _hwPowerOn(VCAMA, VOL_2800)) {PK_DBG("[CAMERA SENSOR] Fail to enable analog power (VCAM_A),power id = %d\n", VCAMA);goto _kdCISModulePowerOn_exit_;}mdelay(10);/* AF_VCC */if (TRUE != _hwPowerOn(VCAMAF, VOL_2800)) {PK_DBG("[CAMERA SENSOR] Fail to enable analog power (VCAM_AF),power id = %d\n", VCAMAF);goto _kdCISModulePowerOn_exit_;}mdelay(10);/* enable active sensor */if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMPDN]) {mtkcam_gpio_set(pinSetIdx, CAMPDN, pinSet[pinSetIdx][IDX_PS_CMPDN + IDX_PS_ON]);mdelay(5);}if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) {mtkcam_gpio_set(pinSetIdx, CAMRST, pinSet[pinSetIdx][IDX_PS_CMRST + IDX_PS_ON]);mdelay(5);}}............
}

高版本的内核,摄像头部分稍微有点改动,移植摄像头涉及到这些文件,以mt6761平台移植sp5508为例。

kernel-4.19/arch/arm/boot/dts/cust_mt6761_project_camera.dtsi
kernel-4.19/arch/arm/configs/k61v1_hdp_ref_debug_defconfig
kernel-4.19/arch/arm/configs/k61v1_hdp_ref_defconfig
kernel-4.19/drivers/misc/mediatek/imgsensor/inc/kd_imgsensor.h
kernel-4.19/drivers/misc/mediatek/imgsensor/src/common/v1/imgsensor_sensor_list.c
kernel-4.19/drivers/misc/mediatek/imgsensor/src/common/v1/imgsensor_sensor_list.h
kernel-4.19/drivers/misc/mediatek/imgsensor/src/common/v1/sp5508_mipi_raw/Makefile
kernel-4.19/drivers/misc/mediatek/imgsensor/src/common/v1/sp5508_mipi_raw/sp5508mipi_Sensor.c
kernel-4.19/drivers/misc/mediatek/imgsensor/src/common/v1/sp5508_mipi_raw/sp5508mipi_Sensor.h
kernel-4.19/drivers/misc/mediatek/imgsensor/src/mt6761/camera_project/k61v1_hdp_ref/camera_hw/imgsensor_cfg_table.c
device/mediatek/common/kernel-headers/kd_imgsensor.h
device/mediateksample/k61v1_hdp_ref/ProjectConfig.mk
vendor/mediatek/proprietary/custom/mt6761/hal/imgsensor_src/sensorlist.cpp
vendor/mediatek/proprietary/custom/mt6761/hal/imgsensor_src/cfg_setting_imgsensor.cpp
vendor/mediatek/proprietary/custom/mt6761/hal/imgsensor/sp5508_mipi_raw
vendor/mediatek/proprietary/custom/common/hal/imgsensor_metadata/sensor/sp5508_mipi_raw
vendor/mediatek/proprietary/custom/mt6761/hal/imgsensor_metadata/sp5508_mipi_raw
vendor/mediatek/proprietary/custom/mt6761/hal/sendepfeature/sp5508_mipi_raw

一般来说,摄像头的驱动源码能拿到(平台的耦合性不强),但摄像头的效果文件在不同的平台上是不通用的,或者同平台在不同的Android版本上也不一定能编译通过,这时需要复制平台的效果文件了,先编译通过,然后让fae去调试效果。具体参考方法参考FAQ22441 或者mtk平台调试总结_Android开发-CSDN博客

metadata

mtk在Android metadata的基础上增加了mtk meatadata,其转换方式可参考

vendor/mediatek/proprietary/hardware/mtkcam/include/mktcam/utils/metadata/client/TagMap.h

。可以通过dumpsys media.camera查看metadata是否生效。注意目前有两种架构的metadata,文档上写着是兼容的,实际调试中也遇到一下问题,最好拿新架构的metadata,遇到不生效的情况,要看下logcat,有没有crash。medata的准确性对过cts比较重要,遇到问题可参考FAQ21242。

对于前后摄像头使用同一款ic的情况,要注意id作假(原始id+/-),也就是id必须是唯一的。

摄像头移植简述(mtk)相关推荐

  1. 虚拟摄像头之 十二 v4l2loopback虚拟机摄像头移植实战(完结篇)

    前言 本篇记录在 android8 的 IMX8QM 平台移植 v4l2loopback 虚拟摄像头实战过程记录;其中主旨是记录整个过程.已经期间出现的踩坑过程,后期虚拟摄像驱动还有移植到多核ARM平 ...

  2. OV2640摄像头移植总结

    环境:stm32f429+OV2640移植到RT1052+OV2640 stm32f429 DCMI相机接口 RT1052 CSI接口 移植步骤: (1) 确定SCCB(IIC)配置或者初始化正确,以 ...

  3. 宗教信仰和推荐系统解决同一问题

    人工智能 ,哲学, 舆论 (Artificial Intelligence, Philosophy, Opinion) On the surface, religions and recommende ...

  4. MTK 驱动(63)---MTK TP驱动移植

    MTK TP驱动移植 对于MTK TP驱动移植一般分为六部分: 1.硬件IO口配置: 2.TP驱动移植: 3.I2C通信: 4.中断触发: 5.数据上报: 6.虚拟按键: 硬件电路: 1.GPIO配置 ...

  5. arm开发板6410/2440上mjpg-streamer网络视频服务器移植

    摄像头移植 一.环境 主机环境 :ubuntu 10.10         目标板 :FS-S5PC100 主机工具链 :gcc-4.4.5         交叉工具链 :arm-unknown-li ...

  6. ---WebCam网络摄像头6 编译WebCam

    直接使用天嵌提供的交叉编译器编译WebCam而生成的input_uvc.so output_http.souvc_stream放在micro2440下面可以直接使用--两个开发板几乎没什么不同... ...

  7. 将linux内核烧进arm板,ARM开发板上uClinux内核移植

    <ARM开发板上uClinux内核移植>由会员分享,可在线阅读,更多相关<ARM开发板上uClinux内核移植(19页珍藏版)>请在人人文库网上搜索. 1.纷傲掌秀悸篷益哑檀扬 ...

  8. 虚拟摄像头之十: Camera3 DeviceSession 和 CaptureRequest 流程机制

    前言 前面九篇系列文章.把 Android Camera 框架逻辑基本描述清晰.从使用API2的角度看.还有 Session 和 CaptureRequest 未详细梳理.导致虚拟摄像头移植过程.出现 ...

  9. stm32使用自定义打点函数方式移植stemwin

    stm32使用自定义打点函数方式移植stemwin 背景 显示过程 移植简述 打点函数 stemwin移植要点 实物效果 背景 oled屏移植stemwin,有两种方式,通过自定义打点方式进行移植,或 ...

最新文章

  1. argparse subparsers()
  2. EAST算法超详细源码解析:数据预处理与标签生成
  3. What is Dark Net
  4. the import XXXX cannot be resolved 解决方法
  5. oracle显示一个月的所有天数
  6. 怎么用python扫描主机_python 扫描内网存活主机
  7. dixon matlab,磁共振Dixon技术原理及初代算法解析
  8. 福昕软件发布福昕高级PDF编辑器 for Linux
  9. 如何快速将MKV格式转换成MP4高清电影格式?
  10. 计算机十年歌曲,抖音还有多少个十年原唱是谁 歌词一览
  11. Pytorch教程[03]transforms
  12. 嵌入式编程语言挑选的原则
  13. 【生活】驾照C1-科一手册
  14. [阅读记录]《数据分析师求职面试指南》-2
  15. 攻防世界 [简单] 凯撒大帝在培根里藏了什么
  16. data.frame中的NA值怎么替换成0 把na变为0 把na变为想要的数 改变na 是否为na is.na()是否为null is.null() is.null() 删除去掉NA的行
  17. 辽宁工业大学计算机专业分数线,2019辽宁工业大学录取分数线及历年专业分数线统计表【文科 理科】...
  18. 2021沭阳中学高考成绩查询,2021年沐阳县高考状元名单资料,今年沐阳县高考状元多少分...
  19. Web后台管理系统框架模板
  20. 树莓派使用Openvino库进行车牌检测

热门文章

  1. MathType MTEF v.5学习文档
  2. 龙芯1b(LS1B200)使用LVGL7.0.1组件 按钮矩阵 实现简易计算器
  3. 文化产业新兴产物:游戏音乐外包
  4. mplab哪个版本编译c语言,mplab c18编译器下载-mplab c18软件下载(正版MPLAB C18 C编译器) 3.0 完整版 - 河东下载站...
  5. 科达教育视频会议系统服务四川彭州教育系统
  6. 7-41 小字辈 (25 分)
  7. java校园医院门诊管理系统ssm
  8. 协方差矩阵和相关系数矩阵(R语言)
  9. 最新UPX3.91-支持win64/PE-加/脱壳
  10. el-button自定义图片显示