【转】android camera(四):camera 驱动 GT2005
关键词: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。
一、摄像头驱动
我们以GT2005为例,来讲述一个摄像头驱动的调试过程:
摄像头和主控的关系图,如下:

摄像头驱动比较简单,完成一面三大步就可以:
摄像头的上电、时钟这些基本条件;
IIC保证摄像头的初始化;
摄像头工作后传回数据到主控。
完成这三个步骤就完成了摄像头基本工作的调试。
1、 摄像头的上电、时钟这些基本条件的实现
电源部分,上电时对应规格书,确认上电时序;MCLK摄像头的主时钟是否提供,看下面是和电和规格书中的
(1)、主意摄像头工作要两组电压:1.8V(1.5V)、2.8V还有MCLK
程序中对电源控制:我们在arch\arm\mach-smdkv310.c中,完成上面两个步骤的代码,(这一点不同平台也许有所不同,这里这是一个实例,这部分代码只是针对三星平台的)
#ifdef CONFIG_VIDEO_GT2005
static void set_cam2005_main_power(int onoff) { unsigned int gpio;
int err; if(onoff)
{
err = gpio_request(S5PV210_GPB(), "GPB");
if (err)
printk(KERN_ERR "#### failed to request GPB2 for CAM\n");
s3c_gpio_cfgpin(S5PV210_GPB(),S3C_GPIO_OUTPUT);
s3c_gpio_setpull(S5PV210_GPB(), S3C_GPIO_PULL_UP);
gpio_direction_output(S5PV210_GPB(), );
gpio_free(S5PV210_GPB()); //RESET
err = gpio_request(S5PV210_GPE1(), "GPE1");
if (err)
printk(KERN_ERR "#### failed to request GPE1_4 for CAM\n");
s3c_gpio_setpull(S5PV210_GPE1(), S3C_GPIO_PULL_NONE);
gpio_direction_output(S5PV210_GPE1(),);
mdelay();
gpio_direction_output(S5PV210_GPE1(), );
gpio_free(S5PV210_GPE1()); //PWDN CAM_back
err = gpio_request(S5PV210_GPB(), "GPB");
if (err)
printk(KERN_ERR "#### failed to request GPB4 for CAM\n");
s3c_gpio_cfgpin(S5PV210_GPB(),S3C_GPIO_OUTPUT);
s3c_gpio_setpull(S5PV210_GPB(), S3C_GPIO_PULL_UP);
gpio_direction_output(S5PV210_GPB(), );
mdelay();
gpio_direction_output(S5PV210_GPB(), );
gpio_free(S5PV210_GPB()); }
else
{
………………
}
return;
}
#endif
提供MCLK代码如下:
static int smdkv210_cam_clk_init(void)
{
unsigned int tempvalue=;
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 ;
}
这时拿示波器抓到上电时的波形和MCLK24MHZ的时钟,信号就说明我们完成了这一步,其实在实际工作中,我们一般出问题的时候才会测这些数据,确认问题点。
上电时序:
(1)、上电时序;
(2)、MCLK如下所示。

2、 IIC和一些参数的配置
#ifdef CONFIG_VIDEO_GT2005
static struct GT2005_platform_data GT2005_plat = {
.default_width = ,
.default_height = ,
.pixelformat = V4L2_PIX_FMT_UYVY, // .freq = 24000000,
.is_mipi = ,
}; static struct i2c_board_info GT2005_i2c_info = {
I2C_BOARD_INFO("GT2005", 0x78 >> ), //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 = ,
.info = >2005_i2c_info,
.pixelformat = V4L2_PIX_FMT_UYVY,
.srclk_name = "mout_mpll", //4、这部分关系到时钟
.clk_name = "sclk_cam1",
.clk_rate = , /* 24MHz */
.line_length = , /* 640*480 */
/* default resol for preview kind of thing */
.width = ,
.height = ,
.window = {
.left = ,
.top = ,
.width = ( - ),
.height = ,
}, /* Polarity */ //5、信号的极性, .inv_pclk = 0,
.inv_vsync = ,
.inv_href = ,
.inv_hsync = , .initialized = ,
.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过来协助解决,不过你想多研究一下的话,也可以,如果项目允许,就多看看,做到调试一个驱动,所有问题都了解,这样对工作经验、积累很重要的,希望对大家有用。
【转】android camera(四):camera 驱动 GT2005的更多相关文章
- android从应用到驱动之—camera(2)---cameraHAL的实现
本文是camera系列博客,上一篇是: android从应用到驱动之-camera(1)---程序调用流程 本来想用这一篇博客把cameraHAL的实现和流程都给写完的.搞了半天,东西实在是太多了.这 ...
- android从应用到驱动之—camera(1)---程序调用流程
一.开篇 写博客还得写开篇介绍,可惜,这个不是我所擅长的.就按我自己的想法写吧. 话说camera模块,从上层到底层一共包含着这么几个部分: 1.apk------java语言 2.camera的ja ...
- android从应用到驱动之—camera(1)---程序调用流程[转]
一.开篇 写博客还得写开篇介绍,可惜,这个不是我所擅长的.就按我自己的想法写吧. 话说camera模块,从上层到底层一共包含着这么几个部分: 1.apk------java语言 2.camera的ja ...
- (转)android从应用到驱动之—camera(1)---程序调用流程
一.开篇 写博客还得写开篇介绍,可惜,这个不是我所擅长的.就按我自己的想法写吧. 话说camera模块,从上层到底层一共包含着这么几个部分: 1.apk------java语言 2.camera的ja ...
- android从应用到驱动之—camera(2)---cameraHAL的实现
本来想用这一篇博客把cameraHAL的实现和流程都给写完的.搞了半天,东西实在是太多了.这篇先写cameraHAL的基本实现框架,下一篇在具体写camerahal的流程吧. cameraHAL的实现 ...
- sc7731 Android 5.1 Camera 学习之一Camera 两个对象
众所周知,在Android中Camera采用了C/S架构,其中Camera server 与 Camera client之间通过Android Binder IPC机制进行通信.在Camera实现的框 ...
- Android 5.1 Camera 架构学习之Camera初始化
Android Camera 采用C/S架构,client 与server两个独立的线程之间(CameraService)使用Binder通信. 一 CameraService的注册. 1.手机开机后 ...
- Android中利用Camera与Matrix实现3D效果详解
本文行文目录: 一.Camera与Matrix初步认识 二.Camera与Matrix旋转效果拆分介绍 三.Camera与Matrix实现立体3D切换效果 [csdn地址:http://blog.cs ...
- MTK Android Driver :Camera
MTK Android Driver :camera 1.相关代码位置:mediatek\config\XXXX(红色字为具体的项目名) 文件:ProjectConfig.mk CUSTOM_KERN ...
随机推荐
- Android应用开发学习之启动另外一个Activity
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 一个Activity可以启动另外一个Activity,以实现比较复杂的功能,我们来看一个例子,其运行效果如下图所示: ...
- 表单验证插件jquery.validate的使用方法演示
jQueryValidate表单验证效果 jquery.validate验证错误信息的样式控制 <!--validate验证插件的基础样式--> input.error{border: 1 ...
- GCD 延时操作
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)), dispatch_ ...
- 【Android】实现动态显示隐藏密码输入框的内容
在设置输入密码框时,有些时候需要按钮控制输入的是“明文”或者“暗文”. 这里提供一种Android实现动态显示隐藏密码输入框的内容的方法: 主要是通过设置EditText的setTransformat ...
- 状态模式----C++实现
状态模式 定义: 允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类. 实用性: 1. 一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为. 2. 一个操作中含 ...
- Apache-rhel5.8环境下编译安装
Apache安装过程 Step 1:安装包gcc或gcc-c++# yum install gcc#yum install gcc-c++ Step 2:安装包APR和APR-Utilapr-1.4. ...
- (转载)js获取JqueryString方法小结
一.<script>urlinfo=window.location.href; //获取当前页面的urllen=urlinfo.length;//获取url的长度offset=urlinf ...
- .NET中反射机制的使用与分析
.NET中反射机制的使用与分析 [日期:2008-06-30] 来源: 作者:志伟 .NET反射的定义:审查元数据并收集关于它的类型信息的能力. 元数据是一种二进制信息,用以对存储在公共语言 ...
- CSS - 关于li中图文混排不能垂直居中的问题
图片和文字一起放在li标签下不能同时垂直居中 解决办法: 1.设置图片的position:absolute; 2.把文字加上span标签: span{ height:30px;line-heigh ...
- pca图像识别
代码下载:基于PCA(主成分分析)的人脸识别 人脸识别是一个有监督学习过程,首先利用训练集构造一个人脸模型,然后将测试集与训练集进行匹配,找到与之对应的训练集头像.最容易的方式是直接利用欧式距离计算测 ...