关键词:android camera CMM 模组 camera参数 GT2005 摄像头常见问题

平台信息:

内核:linux
系统:android

平台:S5PV310(samsung exynos 4210)

作者:xubin341719(欢迎转载,请注明作者)

android camera(一):camera模组CMM介绍

android camera(二):摄像头工作原理、s5PV310 摄像头接口(CAMIF)

android camera(三):camera V4L2 FIMC

android camera(四):camera 驱动 GT2005


摄像头主要参数:

1、MCLK 24MHz;

2、PCLK 48~52MHz~;

3、电压 1.8V(1.5V)、2.8V;

4、scl(IIC时钟)100KHz或者400KHz。

下载:常用摄像头规格书(个别有android驱动程序) :bf3703 30W、gc0308 30W、ov7670、gt2005 200W、gt2015 200W、NT99250 200W、s5k5ba 200W、s5k4ba

一、摄像头驱动

我们以GT2005为例,来讲述一个摄像头驱动的调试过程:

摄像头和主控的关系图,如下:


摄像头驱动比较简单,完成一面三大步就可以:

摄像头的上电、时钟这些基本条件;

IIC保证摄像头的初始化;

摄像头工作后传回数据到主控。

完成这三个步骤就完成了摄像头基本工作的调试。

1、 摄像头的上电、时钟这些基本条件的实现

电源部分,上电时对应规格书,确认上电时序;MCLK摄像头的主时钟是否提供,看下面是和电和规格书中的

(1)、主意摄像头工作要两组电压:1.8V(1.5V)、2.8V还有MCLK


程序中对电源控制:我们在arch\arm\mach-smdkv310.c中,完成上面两个步骤的代码,(这一点不同平台也许有所不同,这里这是一个实例,这部分代码只是针对三星平台的)

#ifdef CONFIG_VIDEO_GT2005static void set_cam2005_main_power(int onoff){unsigned int gpio;int err;if(onoff){err = gpio_request(S5PV210_GPB(2), "GPB");if (err)printk(KERN_ERR "#### failed to request GPB2 for CAM\n");s3c_gpio_cfgpin(S5PV210_GPB(2),S3C_GPIO_OUTPUT);s3c_gpio_setpull(S5PV210_GPB(2), S3C_GPIO_PULL_UP);gpio_direction_output(S5PV210_GPB(2), 1);gpio_free(S5PV210_GPB(2));//RESETerr = gpio_request(S5PV210_GPE1(4), "GPE1");if (err)printk(KERN_ERR "#### failed to request GPE1_4 for CAM\n");s3c_gpio_setpull(S5PV210_GPE1(4), S3C_GPIO_PULL_NONE);gpio_direction_output(S5PV210_GPE1(4),0);mdelay(100);gpio_direction_output(S5PV210_GPE1(4), 1);gpio_free(S5PV210_GPE1(4));//PWDN CAM_backerr = gpio_request(S5PV210_GPB(4), "GPB");if (err)printk(KERN_ERR "#### failed to request GPB4 for CAM\n");s3c_gpio_cfgpin(S5PV210_GPB(4),S3C_GPIO_OUTPUT);s3c_gpio_setpull(S5PV210_GPB(4), S3C_GPIO_PULL_UP);gpio_direction_output(S5PV210_GPB(4), 0);mdelay(100);gpio_direction_output(S5PV210_GPB(4), 1);gpio_free(S5PV210_GPB(4));}else{………………}return;}#endif

提供MCLK代码如下:

static int smdkv210_cam_clk_init(void){unsigned int tempvalue=0;      tempvalue = readl(S5P_CLK_DIV1);tempvalue = (tempvalue &0xffff0fff);writel(tempvalue,S5P_CLK_DIV1);tempvalue = readl(S5P_CLK_SRC1);tempvalue = (tempvalue &0xffff0fff)|0x00001000;writel(tempvalue,S5P_CLK_SRC1);return 0;}

这时拿示波器抓到上电时的波形和MCLK24MHZ的时钟,信号就说明我们完成了这一步,其实在实际工作中,我们一般出问题的时候才会测这些数据,确认问题点。

上电时序:

(1)、上电时序;

(2)、MCLK如下所示。


2、 IIC和一些参数的配置

#ifdef CONFIG_VIDEO_GT2005static struct GT2005_platform_data GT2005_plat = {.default_width = 640,.default_height = 480,.pixelformat = V4L2_PIX_FMT_UYVY,   //.freq = 24000000,.is_mipi = 0,};static struct i2c_board_info GT2005_i2c_info = {I2C_BOARD_INFO("GT2005", 0x78 >> 1), //1、IIC地址.platform_data = >2005_plat,};static struct s3c_platform_camera GT2005 = {#ifdef CAM_ITU_CH_A.id= CAMERA_PAR_A,   #else.id= CAMERA_PAR_B,#endif.type= CAM_TYPE_ITU,   //2、数据接口选择(ITU\MIPI等).fmt= ITU_601_YCBCR422_8BIT,.order422= CAM_ORDER422_8BIT_CBYCRY, //3、图像数据格式 .i2c_busnum= 1,.info= >2005_i2c_info,.pixelformat= V4L2_PIX_FMT_UYVY,.srclk_name= "mout_mpll",              //4、这部分关系到时钟.clk_name= "sclk_cam1",.clk_rate= 24000000,             /* 24MHz */ .line_length= 640,              /* 640*480 *//* default resol for preview kind of thing */.width= 640,.height= 480,.window= {.left   = 16,.top    = 0,.width  = (640 - 16),.height = 480,},/* Polarity */                            //5、信号的极性,.inv_pclk= 0,.inv_vsync= 1,.inv_href= 0,.inv_hsync= 1,.initialized= 0,.cam_power=set_cam2005_main_power};#endif

注意下面几个参数:

(1)、IIC地址

(2)、数据接口选择(ITU\MIPI等),这几个数据接口我们在前面提到过;

(3)、图像数据格式 ,这就是我们前面提到的YVU\UVY之类不同的数据顺序;

(4)、这部分关系到时钟;

(5)、输出信号的极性,就是我们PCLK、VSYNC、HSVNC这些信号的极性,不正确时会没有图像之类现象,这个也要注意了。

完成这一步确认IIC通信是否正常,如下图所抓到波形:


3、 完成上面两步,摄像头基本配置完成,我们确认下输出端PCLK、VHSN、SVSN、D1-D7



二、摄像头调试过程中常遇到的问题

1、录相在预览时正常,播放录像时花屏(程序解释为三星s5pv210/s5pv310是的,其它的可以参考,找相应代码)


原因分析:
(1)录相用fimc2,

在android/device/samsung/proprietary/libcamera/SecCamera.cpp中
int SecCamera::startRecord(void)

m_cam_fd_rec = open(CAMERA_DEV_NAME2, O_RDWR);vendor\sec\sec_proprietary\smdkc110\libcamera\SecCamera.h#define CAMERA_DEV_NAME2      "/dev/video2"
(2)所用的视频格式,在

android/device/samsung/proprietary/libcamera/SecCameraHWInterface.cpp中

void CameraHardwareSec::m_initDefaultParameters(int camera_id)

 int default_preview_pixel_format = mSecCamera->getPreviewDefaultPixelFormat();    switch (default_preview_pixel_format) {    default:    case V4L2_PIX_FMT_NV21:        p.setPreviewFormat(CameraParameters::PIXEL_FORMAT_YUV420SP);        break;    case V4L2_PIX_FMT_NV12T:        p.setPreviewFormat("yuv420sp_tiled");        break;    }其中mSecCamera->getPreviewDefaultPixelFormat()在vendor\sec\sec_proprietary\smdkc110\libcamera\SecCamera.cpp中实现,int SecCamera::getPreviewDefaultPixelFormat(void){    return DEFAULT_PREVIEW_PIXEL_FORMAT;}在android/device/samsung/proprietary/libcamera/SecCamera.h中设定初始值。我们这里设的是#ifdef DUAL_PORT_RECORDING    #define DEFAULT_PREVIEW_PIXEL_FORMAT  (V4L2_PIX_FMT_NV21)#else    #define DEFAULT_PREVIEW_PIXEL_FORMAT  (V4L2_PIX_FMT_NV12T)#endif

以上得出视频格式为V4L2_PIX_FMT_NV21

2、图像干扰问题,如下图所示

原因可能是:

(1)、摄像头模组有问题,换一个摄像头试一下;

(2)、数据线驱动能力不足,这个可以在摄像头寄存器里面改,问下摄像头模组FAE,看改那些地方;

3)、两个摄像头共用数据线时,不工作的摄像头会把工作的数据信号减弱;

(4)、PCB 走线太长,也会有干扰,不过我觉得这个可能性小,调试好就一款这样的的,模组厂FAE说的,不过他们模组本身也有问题,两方面因素都有吧:PCB(线过长)、模组打样也有问题。

3、YUV顺序不对:

yuv顺序不对时,出现如下现象。


看下摄像头规格书,把相应寄存器的值改一下就可以了。如下以红框里是不同yuv顺序,找到改为相应的。


4、 预览方向不对(摄像头寄存器只能改以180度为基数的,90度的就要在FIMC中改)

想知道和比较明确说明翻转角度,最常用的就是写一个“F”,然后看预览里的是怎么转的。


上面有90度的翻转,因为这是FIMC中的寄存器,一般不会改这一部分的值。要不就在模组寄存器中改,要不就在上层。上面只是说明如何去确认图像翻转。

看下GT2005关于翻转的寄存器吧:


5、 杂光,鬼影:

其行业的专业术语统称为Flare,是指在拍摄光源或者强光物体时,边缘出现光影或出现一个完整物体的影子,而且这种现象只能减轻不能完全消失,原因是由于镜片的材质导致光线不但存在折射还存在反射,整机由于镜头面到保护镜片距离很大会更明显!


6、 常见问题相关

摄像头效果评测都有哪些?


以上以gt2005为例,说了一下摄像头驱动,和驱动中常见到的问题,如果上面的问题解决,摄像头点亮,说明在平台是运行是没问题的,小的问题和细节,要找模组厂的FAE过来协助解决,不过你想多研究一下的话,也可以,如果项目允许,就多看看,做到调试一个驱动,所有问题都了解,这样对工作经验、积累很重要的,希望对大家有用。


n

更多相关文章

  1. Android黑盒自动化测试框架Robotium
  2. 关于android的listview的数据解析和性能优化问题
  3. ScrollView 嵌套 RecyclerView 显示不完全问题
  4. android摄像头调用资料收集
  5. 布局使用selector不变色问题
  6. Android(安卓)错误集锦(ing...)
  7. Android(安卓)mediaserver占用CPU过高的问题
  8. [Android] 一键修改从网上厨房制作的Android百分比电量过大的问
  9. android studio使用错误排查记录

随机推荐

  1. Android:ImageView
  2. Android Styles and Themes
  3. Android UI设计
  4. Android布局中margin,padding,align的区
  5. Android中ListView下拉刷新、上拉载入更
  6. Dagger 2 在 Android 上的使用(二)
  7. Android实训_2020/6/16
  8. android 样式选择器
  9. Android 获取手机号
  10. IONIC actionsheet 的cancel menu在andro