摄像头移植简述(mtk)
这里以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)相关推荐
- 虚拟摄像头之 十二 v4l2loopback虚拟机摄像头移植实战(完结篇)
前言 本篇记录在 android8 的 IMX8QM 平台移植 v4l2loopback 虚拟摄像头实战过程记录;其中主旨是记录整个过程.已经期间出现的踩坑过程,后期虚拟摄像驱动还有移植到多核ARM平 ...
- OV2640摄像头移植总结
环境:stm32f429+OV2640移植到RT1052+OV2640 stm32f429 DCMI相机接口 RT1052 CSI接口 移植步骤: (1) 确定SCCB(IIC)配置或者初始化正确,以 ...
- 宗教信仰和推荐系统解决同一问题
人工智能 ,哲学, 舆论 (Artificial Intelligence, Philosophy, Opinion) On the surface, religions and recommende ...
- MTK 驱动(63)---MTK TP驱动移植
MTK TP驱动移植 对于MTK TP驱动移植一般分为六部分: 1.硬件IO口配置: 2.TP驱动移植: 3.I2C通信: 4.中断触发: 5.数据上报: 6.虚拟按键: 硬件电路: 1.GPIO配置 ...
- arm开发板6410/2440上mjpg-streamer网络视频服务器移植
摄像头移植 一.环境 主机环境 :ubuntu 10.10 目标板 :FS-S5PC100 主机工具链 :gcc-4.4.5 交叉工具链 :arm-unknown-li ...
- ---WebCam网络摄像头6 编译WebCam
直接使用天嵌提供的交叉编译器编译WebCam而生成的input_uvc.so output_http.souvc_stream放在micro2440下面可以直接使用--两个开发板几乎没什么不同... ...
- 将linux内核烧进arm板,ARM开发板上uClinux内核移植
<ARM开发板上uClinux内核移植>由会员分享,可在线阅读,更多相关<ARM开发板上uClinux内核移植(19页珍藏版)>请在人人文库网上搜索. 1.纷傲掌秀悸篷益哑檀扬 ...
- 虚拟摄像头之十: Camera3 DeviceSession 和 CaptureRequest 流程机制
前言 前面九篇系列文章.把 Android Camera 框架逻辑基本描述清晰.从使用API2的角度看.还有 Session 和 CaptureRequest 未详细梳理.导致虚拟摄像头移植过程.出现 ...
- stm32使用自定义打点函数方式移植stemwin
stm32使用自定义打点函数方式移植stemwin 背景 显示过程 移植简述 打点函数 stemwin移植要点 实物效果 背景 oled屏移植stemwin,有两种方式,通过自定义打点方式进行移植,或 ...
最新文章
- argparse subparsers()
- EAST算法超详细源码解析:数据预处理与标签生成
- What is Dark Net
- the import XXXX cannot be resolved 解决方法
- oracle显示一个月的所有天数
- 怎么用python扫描主机_python 扫描内网存活主机
- dixon matlab,磁共振Dixon技术原理及初代算法解析
- 福昕软件发布福昕高级PDF编辑器 for Linux
- 如何快速将MKV格式转换成MP4高清电影格式?
- 计算机十年歌曲,抖音还有多少个十年原唱是谁 歌词一览
- Pytorch教程[03]transforms
- 嵌入式编程语言挑选的原则
- 【生活】驾照C1-科一手册
- [阅读记录]《数据分析师求职面试指南》-2
- 攻防世界 [简单] 凯撒大帝在培根里藏了什么
- data.frame中的NA值怎么替换成0 把na变为0 把na变为想要的数 改变na 是否为na is.na()是否为null is.null() is.null() 删除去掉NA的行
- 辽宁工业大学计算机专业分数线,2019辽宁工业大学录取分数线及历年专业分数线统计表【文科 理科】...
- 2021沭阳中学高考成绩查询,2021年沐阳县高考状元名单资料,今年沐阳县高考状元多少分...
- Web后台管理系统框架模板
- 树莓派使用Openvino库进行车牌检测
热门文章
- MathType MTEF v.5学习文档
- 龙芯1b(LS1B200)使用LVGL7.0.1组件 按钮矩阵 实现简易计算器
- 文化产业新兴产物:游戏音乐外包
- mplab哪个版本编译c语言,mplab c18编译器下载-mplab c18软件下载(正版MPLAB C18 C编译器) 3.0 完整版 - 河东下载站...
- 科达教育视频会议系统服务四川彭州教育系统
- 7-41 小字辈 (25 分)
- java校园医院门诊管理系统ssm
- 协方差矩阵和相关系数矩阵(R语言)
- 最新UPX3.91-支持win64/PE-加/脱壳
- el-button自定义图片显示