DSP

camera

2019-07-13 20:58发布

一、camera成像原理:景物通过镜头(LENS)生成的光学图像投射到图像传感器(Sensor)表面上,然后转为模 拟的电信号,经过 A/D(模数转换)转换后变为数字图像信号,再送到数字信号处理芯片 (DSP)中加工处理,再通过 IO 接口传输到 CPU 中处理,通过 LCD 就可以看到图像了。图像传感器(SENSOR)是一种半导体芯片,其表面包含有几十万到几百万的光电二极 管。光电二极管受到光照射时,就会产生电荷。目前的 SENSOR 类型有两种: 1)CCD(Charge Couple Device), 电荷耦合器件,它是目前高像素类 sensor 中比较成熟 的成像器件,是以一行为单位的电流信号。 2)CMOS(Complementary Metal Oxide Semiconductor),互补金属氧化物半导体。CMOS 的信号是以点为单位的电荷信号,更为敏感,速度也更快,更为省电。ISP 的性能是决定影像流畅的关键,JPEG encoder 的性能也是关键指标之一。而 JPEG encoder 又分为硬件 JPEG 压缩方式,和软件 RGB 压缩方式。 DSP 控制芯片的作用是:将感光芯片获取的数据及时快速地传到 baseband 中并刷新感 光芯片,因此控制芯片的好坏,直接决定画面品质(比如 {MOD}彩饱和度、清晰度)与流畅度。
二、常见camera得数据输出格式:Rawdata 格式、YUV 格式、RGB 格式 RGB 格式:采用这种编码方法,每种颜 {MOD}都可用三个变量来表示红 {MOD}、绿 {MOD}以及蓝 {MOD} 的强度。每一个像素有三原 {MOD} R 红 {MOD}、G 绿 {MOD}、B 蓝 {MOD}组成。 YUV 格式:其中“Y”表示明亮度(Luminance 或 Luma),就是灰阶值;而“U”和“V”表示 {MOD}度 (Chrominance 或 Chroma),是描述影像 {MOD}彩及饱和度,用于指定像素的颜 {MOD}。 RAW DA
三、mtk平台下camera相关代码文件:(以MTK6797为例)1、camerasensor驱动相关文件路径:alps/kernel-3.18/drivers/misc/mediatek/imgsensor/src/mt6797/2、 Sensor ID 和一些枚举类型的定义路径:alps/kernel-3.18/drivers/misc/mediatek/imgsensor/inc3、sensor上电路径:alps/kernel-3.18/drivers/misc/mediatek/imgsensor/src/mt6797/camera_hw/4、 Kernel Space 的 SensorList,imgsensor 模块注册路径:alps/kernel-3.18/drivers/misc/mediatek/imgsensor/src/mt6797/kd_sensorlist.c5、 User Space 的 SensorList,向用户空间提供支持的 SensorList路径:alps/vendor/mediatek/proprietary/hardware/mtkcam/drv/src/sensor/mt6797/imgsensor_drv.cpp6、 Sensor 效果调整的接口路径:alps/vendor/mediatek/proprietary/custom/mt6797/hal/imgsensor其中,camera_AE_PLineTable_xxxx.h调整自动曝光参数,camera_isp_xxxx.h,camera_turning_para_xxxx.cpp:调整isp参数
四、添加camera 1.kernel层1)在kd_imgsensor.h中添加sensor name路径:alps/kernel-3.18/drivers/misc/mediatek/imgsensor/inc2)在以下目录下添加相应驱动代码路径:alps/kernel-3.18/drivers/misc/mediatek/imgsensor/src/mt6797/3)在kd_sensorlist.h中添加新ic路径:alps/kernel-3.18/drivers/misc/mediatek/imgsensor/src/mt6797/2.hal层1)在以下目录下添加相应效果代码路径:alps/vendor/mediatek/proprietary/custom/mt6797/hal/imgsensor2)在sensorlist.cpp中添加新ic路径:alps/vendor/mediatek/proprietary/custom/mt6797/hal/imgsensor_src五:lens问题1.如何配置 lens首先需要向sensor的vendor了解,使用的sensor是否内嵌lens的driver IC.如OV5640和MT9P017就是内嵌lens driver ic的。内嵌lens driver ic,即直接操作sensor的寄存器去推lens.若sensor没有内嵌lens的driver IC,则需要向模组厂了解,模组是否外挂了lens的driver IC,driver IC的型号是什么.我们codebase里的FM50AF下的代码,对应了AD5820的driver ic。如果您的模组包的也是这颗lens driver IC,则直接配置为fm50af即可;如果是其他型号的driver IC,您也可以尝试使用AD5820的驱动(注意把device address改过来)有些sensor自带AF算法。如ov3640是一颗含AF core的sensor,即它自己能够做AF算法。因为YUV+AF要求sensor本身是能自己做AF算法的,所以不是每颗YUV sensor都是支持自动对焦的。如果您使用的sensor含有AF CORE,且您希望使用sensor自己的AF算法来对焦,即可配置为sensordrive,但需要您参照文档ALPS_YUV+AF_customization_and_application_note(请在DMS上搜这篇文档看)对sensor driver做针对AF功能的修改。
2.使用 FM50AF 之外的 Lens Driver的修改由于root process & global writeable file已经在非PRC(中华人民共和国)地区被强制要求,因此ALPS.ICS2.MP 版本及之后版本对root权限方面做了要求,这个要求对于Camera的影响就是,如果使用 FM50AF 之外的lens driver,需要在 init.rc 文件中增加对新Lens driver权限和用户方面的修改 例如增加了 XXXAF 这个lens driver 需要修改文件 mediatekconfigmt65XXinit.rc
添加下面二行chmod 0660 /dev/XXXAFchown system camera /dev/XXXAF添加后如下#Camerachmod 0666 /dev/camera-sysramchmod 0666 /dev/camera-ispchmod 0660 /dev/camera-eischmod 0660 /dev/camera-fdvtchmod 0666 /dev/camera-resmgrchmod 0660 /dev/kd_camera_hwchmod 0660 /dev/kd_camera_flashlightchmod 0660 /dev/FM50AFchmod 0660 /dev/XXXAFchown system camera /dev/camera-sysramchown system camera /dev/camera-ispchown system camera /dev/camera-eischown system camera /dev/camera-fdvtchown system camera /dev/camera-resmgrchown system camera /dev/kd_camera_hwchown system camera /dev/kd_camera_flashlightchown system camera /dev/FM50AFchown system camera /dev/XXXAF
六:常见camera问题的处理1.如何控制mclk的开关由于mclk在sensor上电之前就已经开了,如果不满足sensor spec中上电时序要求,可在开sensor power之前将mclk先关闭,然后再需要时再打开,如何控制mclk的开关呢? 可调用void mt_isp_mclk_ctrl(int en) API去控制, (mediateplatformmt6575kernelcoremt6575_isp.c)
2、摄像头只编译一个库,命令./am 项目名 -d make libcameracustom lk -j32 2>&1 | tee log.txtadb remountadb push D:libcameracustom.so /system/lib 将库通过adb推送到手机adb reboot 重启手机
4、关掉TSF在vendor下的camera_tuning_para_ov13850mipiraw.cpp文件里光标所在处,改为0即可
5、摄像头颜 {MOD}颠倒:SENSOR_OUTPUT_FORMAT_RAW_B 修改这个“B”
6、如果摄像头同ID可以在kernel下的驱动文件里加上这个:区分extern u32 pinSetIdx;static kal_uint32 return_sensor_id(){Return((read_cmos_sensor(0xf0)<<8)|read_cmos_sensor(0xf1)+pinSetIdx);}同时,这个上电.c中也要将pinSetIdx变成全局变量;
7、后摄不对焦,在vendor下的lenslist.cpp下加上,如果还不行,再在sendepfeature下开关打开;
8、添加摄像头注意事项:摄像头文件的hal和kernel下的文件顺序和变量名要一一对应,这样用户层才能调用内核层,kernel下的kd_imgsensor.h 中的#define BF3905MIPI_SENSOR_ID 0x3905#define SENSOR_DRVNAME_BF3905_MIPI_YUV "bf3905mipiyuv"
要和vendor下的kd_imgsensor.h中的一样;#define BF3905MIPI_SENSOR_ID 0x3905#define SENSOR_DRVNAME_BF3905_MIPI_YUV "bf3905mipiyuv"在vendor下的sensorlist.cpp(80平台6.0是在device目录下)中的UINT32 BF3905_MIPI_YUV_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc);
#if defined(BF3905_MIPI_YUV){BF3905MIPI_SENSOR_ID, SENSOR_DRVNAME_BF3905_MIPI_YUV, BF3905_MIPI_YUV_SensorInit},#endif1)SENSOR_DRVNAME_BF3905_MIPI_YUV 为上电文件中的名字;2)BF3905MIPI_SENSOR_ID为驱动文件里的ID;3)BF3905_MIPI_YUV为kernel下驱动文件夹名字的大写字母,同时也是配置文件里配上的摄像头的名字的大写字母;4)BF3905_MIPI_YUV_SensorInit 是3905驱动中的入口函数)
9.camera_3a里面的TRUE或者FALSE这个是调整闪关灯的
10.相机开启闪关灯在明亮的地方也会闪:camera_AE文件修改u4Strobe值20为0
11.关于Sensor预览时有条纹问题分析:1)电源不稳定,CMOS sensor对电源的稳定度蛮高的。2)同步信号受干扰,彩 {MOD}条纹显然是每行数据中有信号丢失造成。3)检查mclk和pclk以及他们的ratio,软件设置是否相符。4)随机条纹干扰,查电源5)行场同步随机干扰,一般不大会出现,除非HSYNC与VSYNC中间串入电阻或者走线过长6)50HZ/60HZ刷新非同步条纹,改刷新频率,行不同步/干扰出现摩尔纹(移动斜条纹),场不同步/干扰出现百叶窗效应,这个问题从软件上很难解决, 最好的办法是从滤除电源干扰入手。SENSOR的数字电源没有问题,关键是模拟电源,它给内部的A/D及光电转换电路供电,所以比较敏感。建议:用 PSSR值较高(80db以上)的LDO给其模拟电路供电,同时,在靠近连结器附近用磁珠和去偶电容进一步消除干扰。
12.找不到CAMERA设备,装置未就绪,电源,RESET,I2C有没有信号,RESET的高低电平是否正确,某些sensor高电平复位,power down电平是不是正确,读sensor ID是否能读出以上都正常,基本就是初始化代码的问题了如果POWER、RESET信号没问题的话,一般情况下是sensor ID错误,可以尝试I2C读取后sensor ID打印出来看看,这样可以验证I2C能否正常读取,以及你配置的sensor ID是否正确!如果I2C无法正常读取的话就是硬件问题了,查硬件
TA格式: 是 CCD 或 CMOS 在将光信号转换为电信号时的电平高低的原始记 录,单纯地将没有进行任何处理的图像数据,即摄像元件直接得到的电信号进行数字 化处理 而得到的。 支持 YUV/RGB 格式的模组,一般会在模组上集成 ISP(Image Single Processor),经 过 A/D 转换过的原始数据经过 ISP 处理生成 YUV 标准格式传到 BB。一般来说,这种设计适 用于低像素 Camera 的要求,会 在主板上省去一个 DSP,可降低成本。在调试过程中, YUV/RGB 格式的摄像头,其所有参数都可在 kernel 层通过寄存器来控制。调试 一般由 sensor 的原厂支持。 支持 RawData 格式的模组,由于感光区域的需求,不会再模组内集成 ISP 以最大程度 的增大 感光区域的面积,提高照片质量。模组把原始的数字信号传给 BB 上的 DSP 进行处 理,MTK 自带的 DSP 一般包含 ISP、 JPEG encoder、和 DSP 控制芯片。在调试的时候图像 的效果需要 MTK 在 HAL 层的参数进行支持。
13.如何修改I2C speedMediatekcustomcommonkernelimgsensorsrckd_sensorlist.ciWriteReg()中最前面加上g_pstI2Cclient->timing,表示设置I2C的速度如果不设置,为默认值100K ,比如想将I2C的speed设置为400K,可将g_pstI2Cclient->timing设置为400K
14.如何打开或者关闭闪光灯打开/关闭闪光灯可以通过如下配置(两种方法) :1)在alps/mediatek/config/pjt/ProjectConfig.mk 文件中,按照如下配置CUSTOM_HAL_FLASHLIGHT = constant_flashlight #dummy_flashlightCUSTOM_KERNEL_FLASHLIGHT = constant_flashlight #dummy_flashlight
2)在feature table中把flash相关的feature 打开/关闭RAW sensor 涉及的文件:alpsmediatekcustomproject namehalcameracamera 目录下cfg_ftbl_custom_raw_main.halpsmediatekcustomcommonhalcameracamera 目录下cfg_ftbl_custom_raw_main.halpsmediateksourceexternalmhalsrccoredrv6575isp目录下cfg_ftbl_raw_sceneindep.hYUV sensor 涉及的文件:alpsmediatekcustomproject namehalcameracamera 目录下cfg_ftbl_custom_yuv_main.halpsmediatekcustomcommonhalcameracamera 目录下cfg_ftbl_custom_yuv_main.halpsmediatekcustomcommonhalimgsensorxxx_yuv目录下cfg_ftbl_xxx_yuv.h规则:优先级,1) > 2) > 3),即如果project name下相应的的文件,则只需要在相应的文件中打开flash相关的 feature,如果没有,则在2)中的文件打开/关闭:#if 1//0// Flash LightCONFIG_FEATURE(FID_AE_STROBE,BY_DEFAULT(FLASHLIGHT_FORCE_OFF),FLASHLIGHT_AUTO, FLASHLIGHT_FORCE_ON, FLASHLIGHT_FORCE_OFF)#endif