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中,完成上面两个步骤的代码,(这一点不同平台也许有所不同,这里这是一个实例,这部分代码只是针对三星平台的)

[cpp] view plaincopy
  1. #ifdef CONFIG_VIDEO_GT2005
  2. static void set_cam2005_main_power(int onoff)
  3. {
  4. unsigned int gpio;
  5. int err;
  6. if(onoff)
  7. {
  8. err = gpio_request(S5PV210_GPB(2), "GPB");
  9. if (err)
  10. printk(KERN_ERR "#### failed to request GPB2 for CAM\n");
  11. s3c_gpio_cfgpin(S5PV210_GPB(2),S3C_GPIO_OUTPUT);
  12. s3c_gpio_setpull(S5PV210_GPB(2), S3C_GPIO_PULL_UP);
  13. gpio_direction_output(S5PV210_GPB(2), 1);
  14. gpio_free(S5PV210_GPB(2));
  15. //RESET
  16. err = gpio_request(S5PV210_GPE1(4), "GPE1");
  17. if (err)
  18. printk(KERN_ERR "#### failed to request GPE1_4 for CAM\n");
  19. s3c_gpio_setpull(S5PV210_GPE1(4), S3C_GPIO_PULL_NONE);
  20. gpio_direction_output(S5PV210_GPE1(4),0);
  21. mdelay(100);
  22. gpio_direction_output(S5PV210_GPE1(4), 1);
  23. gpio_free(S5PV210_GPE1(4));
  24. //PWDN CAM_back
  25. err = gpio_request(S5PV210_GPB(4), "GPB");
  26. if (err)
  27. printk(KERN_ERR "#### failed to request GPB4 for CAM\n");
  28. s3c_gpio_cfgpin(S5PV210_GPB(4),S3C_GPIO_OUTPUT);
  29. s3c_gpio_setpull(S5PV210_GPB(4), S3C_GPIO_PULL_UP);
  30. gpio_direction_output(S5PV210_GPB(4), 0);
  31. mdelay(100);
  32. gpio_direction_output(S5PV210_GPB(4), 1);
  33. gpio_free(S5PV210_GPB(4));
  34. }
  35. else
  36. {
  37. ………………
  38. }
  39. return;
  40. }
  41. #endif

提供MCLK代码如下:

[cpp] view plaincopy
  1. static int smdkv210_cam_clk_init(void)
  2. {
  3. unsigned int tempvalue=0;
  4. tempvalue = readl(S5P_CLK_DIV1);
  5. tempvalue = (tempvalue &0xffff0fff);
  6. writel(tempvalue,S5P_CLK_DIV1);
  7. tempvalue = readl(S5P_CLK_SRC1);
  8. tempvalue = (tempvalue &0xffff0fff)|0x00001000;
  9. writel(tempvalue,S5P_CLK_SRC1);
  10. return 0;
  11. }

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

上电时序:

(1)、上电时序;

(2)、MCLK如下所示。

2、 IIC和一些参数的配置

[cpp] view plaincopy
  1. #ifdef CONFIG_VIDEO_GT2005
  2. static struct GT2005_platform_data GT2005_plat = {
  3. .default_width = 640,
  4. .default_height = 480,
  5. .pixelformat = V4L2_PIX_FMT_UYVY,   //  .freq = 24000000,
  6. .is_mipi = 0,
  7. };
  8. static struct i2c_board_info GT2005_i2c_info = {
  9. I2C_BOARD_INFO("GT2005", 0x78 >> 1), //1、IIC地址
  10. .platform_data = >2005_plat,
  11. };
  12. static struct s3c_platform_camera GT2005 = {
  13. #ifdef CAM_ITU_CH_A
  14. .id     = CAMERA_PAR_A,
  15. #else
  16. .id     = CAMERA_PAR_B,
  17. #endif
  18. .type       = CAM_TYPE_ITU,   //2、数据接口选择(ITU\MIPI等)
  19. .fmt        = ITU_601_YCBCR422_8BIT,
  20. .order422   = CAM_ORDER422_8BIT_CBYCRY, //3、图像数据格式
  21. .i2c_busnum = 1,
  22. .info       = >2005_i2c_info,
  23. .pixelformat    = V4L2_PIX_FMT_UYVY,
  24. .srclk_name = "mout_mpll",              //4、这部分关系到时钟
  25. .clk_name   = "sclk_cam1",
  26. .clk_rate   = 24000000,             /* 24MHz */
  27. .line_length    = 640,              /* 640*480 */
  28. /* default resol for preview kind of thing */
  29. .width      = 640,
  30. .height     = 480,
  31. .window     = {
  32. .left   = 16,
  33. .top    = 0,
  34. .width  = (640 - 16),
  35. .height = 480,
  36. },
  37. /* Polarity */                            //5、信号的极性,    .inv_pclk   = 0,
  38. .inv_vsync  = 1,
  39. .inv_href   = 0,
  40. .inv_hsync  = 1,
  41. .initialized    = 0,
  42. .cam_power=set_cam2005_main_power
  43. };
  44. #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)

[cpp] view plaincopy
  1. m_cam_fd_rec = open(CAMERA_DEV_NAME2, O_RDWR);
  2. vendor\sec\sec_proprietary\smdkc110\libcamera\SecCamera.h
  3. #define CAMERA_DEV_NAME2      "/dev/video2"

(2)所用的视频格式,在

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

void CameraHardwareSec::m_initDefaultParameters(int camera_id)

[cpp] view plaincopy
  1. int default_preview_pixel_format = mSecCamera->getPreviewDefaultPixelFormat();
  2. switch (default_preview_pixel_format) {
  3. default:
  4. case V4L2_PIX_FMT_NV21:
  5. p.setPreviewFormat(CameraParameters::PIXEL_FORMAT_YUV420SP);
  6. break;
  7. case V4L2_PIX_FMT_NV12T:
  8. p.setPreviewFormat("yuv420sp_tiled");
  9. break;
  10. }
  11. 其中mSecCamera->getPreviewDefaultPixelFormat()在
  12. vendor\sec\sec_proprietary\smdkc110\libcamera\SecCamera.cpp中实现,
  13. int SecCamera::getPreviewDefaultPixelFormat(void)
  14. {
  15. return DEFAULT_PREVIEW_PIXEL_FORMAT;
  16. }
  17. 在android/device/samsung/proprietary/libcamera/SecCamera.h中设定初始值。我们这里设的是
  18. #ifdef DUAL_PORT_RECORDING
  19. #define DEFAULT_PREVIEW_PIXEL_FORMAT  (V4L2_PIX_FMT_NV21)
  20. #else
  21. #define DEFAULT_PREVIEW_PIXEL_FORMAT  (V4L2_PIX_FMT_NV12T)
  22. #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过来协助解决,不过你想多研究一下的话,也可以,如果项目允许,就多看看,做到调试一个驱动,所有问题都了解,这样对工作经验、积累很重要的,希望对大家有用。

camera 模组(四)相关推荐

  1. Android开发之十四: camera(一):camera模组CMM介绍

    https://blog.csdn.net/gabbzang/article/details/9457459 android camera(一):camera模组CMM介绍 android camer ...

  2. Android Camera(一):camera模组CMM介绍

    关键词:android camera CMM 模组 camera参数 平台信息: 内核:linux 系统:android 平台:S5PV310(samsung exynos 4210) 新项目开案,代 ...

  3. camera模组 ------- super Good

    come from :https://blog.csdn.net/xubin341719/article/details/7723725 关键词:android  camera CMM 模组 came ...

  4. Camera模组详解

    一 Camera模组 大家都知道,手机背面的那个小小的孔,就叫摄像头.这个小孔幽幽的泛着光泽,深邃又迷人,如同一个含苞待放的小萝莉一样,这个小萝莉还是个傲娇娘,像零之使魔的614一样惹人怜爱,而且在小 ...

  5. S5PV210开发板 camera模组CMM介绍

    关键词:android camera CMM 模组 camera参数 平台信息: 内核:linux 系统:android 平台:S5PV310(samsung exynos 4210) 作者:xubi ...

  6. 手机摄像头的心得体会---camera模组的结构和选择

    今天我们可以来聊一聊关于camera的结构. 一个手机,我们从app中打开camera,然后就看到camera的拍摄的景色,然后按下开关就会形成一个静态的照片,那么这张照片是怎样形成的呢?他的整个过程 ...

  7. 手机摄像头的心得体会---camera模组生产流程

    首先开始做一款手机,要提前做好一个时间表,这个时间表从讨论做什么样的手机一直到最后的手机量产.一般过程PE-----PDR----PCL----PEL-----POR-----EVT-----DVT- ...

  8. opencv实现camera模组的暗电流和lenshading补偿

    简介 在接触过的qcom和mtk平台中,camera调试软件和流程基本都是大同小异.所以查了点资料,然后模仿这些软件,自己练习写了下最开始的 两步:暗电流和len shading补偿. 基本原理 产生 ...

  9. camera基础知识——1、camera模组简介

    1. 前言 博主作为一个camera驱动码农,在刚接触camera知识的时候难免有点转变不过来,难以接受,博主也深有体会.看着厚厚的camera datasheet,不知道如何下手编写驱动代码.但是在 ...

最新文章

  1. Window 消息大全使用详解(无聊没事做)
  2. cant find module express
  3. Maven的pom.xml文件结构之Build配置build
  4. PHP 在服务端的应用概述
  5. 移动端的注册登录设计灵感!
  6. netmon中解析非1433端口的TDS协议
  7. 【论文笔记】激光里程计网络 LO-Net:Deep Real-time Lidar Odometry2019
  8. 李宏毅:1天搞懂深度学习,我总结了 300 页 PPT(附思维导图PPT)
  9. 如何自定义MATLAB神经网络激活函数
  10. 查看windows产品密钥
  11. HNU 12814 SIRO Challenge(最短路+状态压缩+dp)
  12. 渗透测试-Kali虚拟机技术
  13. BBS(仿博客园系统)项目03(主页搭建、个人站点搭建(侧边栏分类展示、标签展示、日期归档)、文章详情页相关功能实现)...
  14. 利穗IT网络工程师面试试题
  15. 第一章AI图形设计与形象设计
  16. 我业余时间如何学习多门技术以及开发业余项目的一些心得
  17. 崇阳职校计算机基础知识试题及答案,崇阳职校2014年春期末考试.doc
  18. android 动画开源框架,21款炫酷动画开源框架,照亮你的APP
  19. java版溺尸掉三叉戟吗_我的世界:得不到溺尸的三叉戟怎么办?概率太低,版本要求不同!...
  20. 如何设置文件 为 受保护的操作系统文件

热门文章

  1. Java实现经纬度查询附近门店
  2. 力软快速开发框架建设与介绍
  3. 在批处理中提升权限 (UAC开启状态下)
  4. LaTeX数学公式的矩阵、多行公式
  5. Zynq7000硬件开发之芯片供电电源功耗(电流)评估
  6. html清除js缓存
  7. JavaFX战旗类游戏开发 第三课 创建游戏角色
  8. 数据库多表连接的方法
  9. java 渐变圆_巧妙实现带圆角的渐变边框
  10. 在项目开发中统计代码行数的6种方式