一、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 中并刷新感 光芯片,因此控制芯片的好坏,直接决定画面品质(比如色彩饱和度、清晰度)与流畅度。
二、常见camera得数据输出格式:Rawdata 格式、YUV 格式、RGB 格式
RGB 格式:采用这种编码方法,每种颜色都可用三个变量来表示红色、绿色以及蓝色 的强度。每一个像素有三原色 R 红色、G 绿色、B 蓝色组成。
YUV 格式:其中“Y”表示明亮度(Luminance 或 Luma),就是灰阶值;而“U”和“V”表示色度 (Chrominance 或 Chroma),是描述影像色彩及饱和度,用于指定像素的颜色。
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/inc
3、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.c
5、 User Space 的 SensorList,向用户空间提供支持的 SensorList
路径:alps/vendor/mediatek/proprietary/hardware/mtkcam/drv/src/sensor/mt6797/imgsensor_drv.cpp
6、 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/inc
2)在以下目录下添加相应驱动代码
路径: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/imgsensor
2)在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 需要修改文件 mediatek\config\mt65XX\init.rc
添加下面二行
chmod 0660 /dev/XXXAF
chown system camera /dev/XXXAF
添加后如下
#Camera
chmod 0666 /dev/camera-sysram
chmod 0666 /dev/camera-isp
chmod 0660 /dev/camera-eis
chmod 0660 /dev/camera-fdvt
chmod 0666 /dev/camera-resmgr
chmod 0660 /dev/kd_camera_hw
chmod 0660 /dev/kd_camera_flashlight
chmod 0660 /dev/FM50AF
chmod 0660 /dev/XXXAF
chown system camera /dev/camera-sysram
chown system camera /dev/camera-isp
chown system camera /dev/camera-eis
chown system camera /dev/camera-fdvt
chown system camera /dev/camera-resmgr
chown system camera /dev/kd_camera_hw
chown system camera /dev/kd_camera_flashlight
chown system camera /dev/FM50AF
chown system camera /dev/XXXAF
六:常见camera问题的处理
1.如何控制mclk的开关
由于mclk在sensor上电之前就已经开了,如果不满足sensor spec中上电时序要求,可在开sensor power之前将mclk先关闭,然后再需要时再打开,如何控制mclk的开关呢?
可调用void mt_isp_mclk_ctrl(int en) API去控制, (mediate\platform\mt6575\kernel\core\mt6575_isp.c)
2、摄像头只编译一个库,命令
./am 项目名 -d make libcameracustom lk -j32 2>&1 | tee log.txt
adb remount
adb push D:\libcameracustom.so /system/lib 将库通过adb推送到手机
adb reboot 重启手机
4、关掉TSF
在vendor下的camera_tuning_para_ov13850mipiraw.cpp文件里光标所在处,改为0即可
5、摄像头颜色颠倒: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},
#endif
1)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)同步信号受干扰,彩色条纹显然是每行数据中有信号丢失造成。
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 speed
Mediatek\custom\common\kernel\imgsensor\src\kd_sensorlist.c
iWriteReg()中最前面加上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_flashlight
CUSTOM_KERNEL_FLASHLIGHT = constant_flashlight #dummy_flashlight
2)在feature table中把flash相关的feature 打开/关闭
RAW sensor 涉及的文件:
alps\mediatek\custom\project name\hal\camera\camera 目录下cfg_ftbl_custom_raw_main.h
alps\mediatek\custom\common\hal\camera\camera 目录下cfg_ftbl_custom_raw_main.h
alps\mediatek\source\external\mhal\src\core\drv\6575\isp目录下cfg_ftbl_raw_sceneindep.h
YUV sensor 涉及的文件:
alps\mediatek\custom\project name\hal\camera\camera 目录下cfg_ftbl_custom_yuv_main.h
alps\mediatek\custom\common\hal\camera\camera 目录下cfg_ftbl_custom_yuv_main.h
alps\mediatek\custom\common\hal\imgsensor\xxx_yuv目录下cfg_ftbl_xxx_yuv.h
规则:优先级,1) > 2) > 3),即如果project name下相应的的文件,则只需要在相应的文件中打开flash相关的 feature,如果没有,则在2)中的文件打开/关闭:
#if 1//0
// Flash Light
CONFIG_FEATURE(FID_AE_STROBE,
BY_DEFAULT(FLASHLIGHT_FORCE_OFF),
FLASHLIGHT_AUTO, FLASHLIGHT_FORCE_ON, FLASHLIGHT_FORCE_OFF
)
#endif
文章来源: camera