android 驱动之 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。
下载:常用摄像头规格书(个别有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_GT2005
- static 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));
- //RESET
- err = 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_back
- err = 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_GT2005
- static 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过来协助解决,不过你想多研究一下的话,也可以,如果项目允许,就多看看,做到调试一个驱动,所有问题都了解,这样对工作经验、积累很重要的,希望对大家有用。
android 驱动之 camera 驱动 GT2005相关推荐
- android camera(四):camera 驱动 GT2005
关键词:android camera CMM 模组 camera参数 GT2005 摄像头常见问题 平台信息: 内核:linux 系统:android 平台:S5PV310(samsung exy ...
- android camera(四):camera 驱动 GT2005
摄像头主要参数: 1.MCLK 24MHz: 2.PCLK 48~52MHz~: 3.电压 1.8V(1.5V).2.8V: 4.scl(IIC时钟)100KHz或者400KHz. 下载:常用摄像 ...
- Android高通平台调试Camera驱动全纪录
项目比较紧,3周内把一个带有外置ISP,MIPI数据通信,800万像素的camera从无驱动到实现客户全部需求. 1日 搭平台,建环境,编译内核,烧写代码. 我是一直在Window下搭个虚拟机登服务器 ...
- Android Camera驱动开发入门必备知识
camera驱动开发所需要具备基础知识,如果你还没有了解过camera模块,那么这些基础必备的知识,将会对你比较有用,俗话说"磨刀不误砍柴工",基本功配置好了,相信你在做camer ...
- camera 驱动 GT2005
一.摄像头驱动 我们以GT2005为例,来讲述一个摄像头驱动的调试过程: 摄像头和主控的关系图,如下: 摄像头驱动比较简单,完成一面三大步就可以: 摄像头的上电.时钟这些基本条件: IIC保证摄像头的 ...
- android从应用到驱动之—camera(1)---程序调用流程
一.开篇 写博客还得写开篇介绍,可惜,这个不是我所擅长的.就按我自己的想法写吧. 话说camera模块,从上层到底层一共包含着这么几个部分: 1.apk------java语言 2.camera的ja ...
- MTK6735 Android之Camera驱动移植篇
MTK6735 Android之Camera驱动移植篇 首先我们需要向sensor原厂拿到我们对应平台型号的驱动hal层和kernel层的代码. 1.拷贝hal层代码到\vendor\mediatek ...
- 请把Camera hold住 - Android高通平台调试Camera驱动全纪录
项目比较紧,3周内把一个带有外置ISP,MIPI数据通信,800万像素的camera从无驱动到实现客户全部需求. 1日 搭平台,建环境,编译内核,烧写代码. 我是一直在Window下搭个虚拟机登服务器 ...
- android相机开发书籍,Android Camera 驱动开发入门必备知识有哪些?
1:硬件相关:简单的数字电路要懂,看的懂电路图(这个很简单),能根据电路找到相应Camera硬件连接的GPIO,并根据芯片手册配置GPIO为相应的模式:比如GPIO模式,输入IO或输出IO:或配置成P ...
最新文章
- 使用matlab进行mex编译时的路径问题mexopts
- python update用法_使用dnspython进行 update
- 解决Git Revert操作后再次Merge代码被冲掉的问题
- ContentProviderOperation批量操作提升性能
- Android的单位px,pt,dp,sp总结和获取屏幕分辨率
- easyui带表单的弹窗效果制作
- java的栈图形演示
- blob没权限 ie_vuerouter 源码和动态路由权限分配
- 新手如何制作专业的思维导图
- 基于js利用经纬度进行两地的距离计算(转)
- MSDN 查找 步骤
- 2017年西安邮电大学第十二届数学建模竞赛B题论文
- An Attention-based Graph Neural Network for Heterogeneous Structural Learning
- Thingworx自定义扩展开发(一)- 开发环境搭建、Extension Demo Coding
- 游戏直播视频太大了,怎么一键压缩视频?--QVE视频压缩
- 锁定计算机时共享打印机,打印机共享需要密码,小编告诉您解决win7打印机共享需要密码...
- 使用GUID分区表(GPT)的笔记本硬盘做移动硬盘,windowsXP系统不识别的问题
- 在Excel中将人民币金额小写转成大写(转)
- 视频编辑常用软件有哪些
- 600道计算机二级python选择题在线真题题库
热门文章
- ios13可以读取u盘吗
- JAVA语法三:继承和多态
- 巨控GRMOPC模块实现很多企业的组态软件(上位机),wincc,组态王,力控等互联,工业APP远程监控
- 【企业工程实践】云服务牛刀小试_DayThree
- 基于Java+SpringBoot+Vue在线培训考试系统设计与实现
- java版微信小程序多商家入驻前后端分离商城源码 Spring Cloud+Spring Boot+mybatis+security+uniapp+Redis+MQ+VR全景+b2b2c
- 计算机课件教程星空,合理运用多媒体课件进行教学
- 介绍几种js脱敏加密(手机号邮箱等)
- [Zybo u-boot Linux系统移植]-ZYBO Zync-7000 Development Board Work Booting Linux on the ZYBO
- 大一小伙子利用Python计算出大学本学期绩点,校长知道后直呼人才