camera常用知识及流程分析_第1页
camera常用知识及流程分析_第2页
camera常用知识及流程分析_第3页
camera常用知识及流程分析_第4页
camera常用知识及流程分析_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Camera常用知识及流程分析,-让凌鹏,www.rock-,内容提要,四、camerahal代码分析,三、kernel相关代码分析,二、上电识别camera流程,一、基本概念,五、3288和3188及以前的代码差异,六、出错时log打印,www.rock-,一、基本概念,1.1 常用camera分类 SOC Sensor:自带ISP,输出yuv数据,使用cif接口, 因为cif接口不带isp,不对camera效果做处理。 RAW Sensor:不带isp,输出sensor采集原始灰度数据。 目前发布的mid_sdk中仅3288支持这种sensor,这种就需要我们调试效果,使用mipi接口。,

2、1.3 MIPI接口 DOVDD,DVDD,AVDD PWDN,MIPI_RST MCLK:24MHz MIPI Data,CLK,一、基本概念,1.3 CIF接口(soc sensor,yuv) XCLK(MCLK),PCLK VSYNC,一、基本概念,二、上电识别camera流程,www.rock-,2.1 mediaservice启动 在init.rc文件中 service media /system/bin/mediaserver class main user media group system audio camera inet net_bt net_bt_admin net_b

3、w_acct drmrpc mediadrm ioprio rt 4 启动mediaservice的时候,main_mediaserver.cpp中 int main(int argc, char* argv) AudioFlinger:instantiate(); MediaPlayerService:instantiate(); CameraService:instantiate(); /cameraservice的启动 AudioPolicyService:instantiate();,二、上电识别camera流程,www.rock-,registerExtensions(); Proc

4、essState:self()-startThreadPool(); IPCThreadState:self()-joinThreadPool(); 启动cameraservice的时候非常重要的一步:camera_get_number_of_cameras这是获取camera个数及camera相关参数的。 #define CAMERAS_SUPPORT_MAX 2 rk_cam_info_t gCamInfosCAMERAS_SUPPORT_MAX; static signed int gCamerasNumber 其实这个时候是获取camera参数到gCamInfos中,从这里也最多看到最

5、多支持2个camera。 注意:这里容易识别不到设备,后续摄像头打不开。,三、kernel相关代码分析,www.rock-,3.1 v4l2_subdev v4l2_device下面一个层次是v4l2_subdev,它需要和它的子设备进行通信,如果说camera host是一个v4l2_device设备,那么就可以将camera模组称为一个v4l2_subdev设备,它们之间的通信可以采取多种方式常见的是I2C。 camera的驱动文件比较简单,它和v4l2_device都是在kerneldriversmediavideo 下面,以各型号命名,如ov5640.c gc0308.c 里面代码较简

6、单,是一些寄存器数组和简单寄存器逻辑判断组成(如af),数组包括初始化,预览分辨率,最大分辨率,还有如各种效果如曝光,白平衡等需要设置的寄存器组,以及设置他们的函数,三、kernel相关代码分析,www.rock-,3.2 v4l2_device 如上所说,camera host是一个v4l2_device设备,即我们的cif相关驱动, cif驱动较sub_dev复杂一点。 在上面说的目录下面有 rk30_camera_oneframe.c rk30_camera_pingpong.c 两个文件,目前默认的为前一种模式,即单帧模式,后一种为乒乓模式。 那host驱动就涉及到裁剪,格式,制式,v

7、ideobuf的初始化与设置。 当全部设置好,会设置寄存器设置开始接收stream流,当buf接受满后会产生中断,进入rk_camera_irq函数,会将camera数据存入队列,并将vb-state = VIDEOBUF_DONE;,四、camerahal代码分析,www.rock-,4.1 camerahal的初始化 当一打开摄像头的时候,从framework下来第一次执行的反函数是 CameraHal:CameraHal(int cameraId),里面会创建很多进程, displayThreadCommandQ(displayCmdQ), displayThreadAckQ(displ

8、ayAckQ), previewThreadCommandQ(previewCmdQ), previewThreadAckQ(previewAckQ), commandThreadCommandQ(commandCmdQ), commandThreadAckQ(commandAckQ), snapshotThreadCommandQ(snapshotCmdQ), snapshotThreadAckQ(snapshotAckQ), 之后执行的两个比较重要的函数, int CameraHal:cameraCreate(int cameraId),四、camerahal代码分析,www.rock-,

9、和initDefaultParameters 前一个函数,通过获取底层支持的数据格式和上层匹配,设置格式,以及申请必要的内存(ion). 后一个初始化camera各种参数,获取支持的预览和拍照分辨率,获取底层支持的各种效果的控件,以及当前效果的默认值。 初始化完这些,调用函数 mDisplayThread-run(CameraDispThread,ANDROID_PRIORITY_URGENT_DISPLAY); mPreviewThread-run(CameraPreviewThread,ANDROID_PRIORITY_DISPLAY); mCommandThread-run(Camera

10、CmdThread, ANDROID_PRIORITY_URGENT_DISPLAY); mAutoFocusThread-run(CameraAutoFocusThread, ANDROID_PRIORITY_DISPLAY); mSnapshotThread-run(CameraSnapshotThread, ANDROID_PRIORITY_NORMAL); 那么整个hal层的进程循环全部开始。,四、camerahal代码分析,www.rock-,4.2 camerahal的显示流程 那么说下显示进程 void CameraHal:displayThread() 先是在preview进程

11、中通过ioctl命令抓取buf数据 if (ioctl(iCamFd, VIDIOC_DQBUF, &cfilledbuffer1) 0) 抓取的数据放到显示进程来显示 在 case CMD_DISPLAY_FRAME:下面 if(CAMERA_IS_RKSOC_CAMERA() (经常我们可以在此处抓下yuv数据分析)这个将传送过来的数据,转成指定的显示格式数去显示,然后发送CMD_PREVIEW_QBUF命令到commandThread进程去将buf将重新入队列尾,这样可以循环采集。 hal层的一些命令 VIDIOC_REQBUFS:分配内存 VIDIOC_QUERYBUF:把VIDIOC

12、_REQBUFS中分配的数据缓存转换成物理地址 VIDIOC_QUERYCAP:查询驱动功能,四、camerahal代码分析,www.rock-, VIDIOC_ENUM_FMT:获取当前驱动支持的视频格式 VIDIOC_S_FMT:设置当前驱动的频捕获格式 VIDIOC_G_FMT:读取当前驱动的频捕获格式 VIDIOC_TRY_FMT:验证当前驱动的显示格式 VIDIOC_CROPCAP:查询驱动的修剪能力 VIDIOC_S_CROP:设置视频信号的边框 VIDIOC_G_CROP:读取视频信号的边框 VIDIOC_QBUF:把数据从缓存中读取出来 VIDIOC_DQBUF:把数据放回缓存

13、队列 VIDIOC_STREAMON:开始视频显示函数 VIDIOC_STREAMOFF:结束视频显示函数 VIDIOC_QUERYSTD:检查当前视频设备支持的标准,例如PAL或NTSC。,四、camerahal代码分析,4.3 拍照流程 case CMD_PREVIEW_CAPTURE: mPictureThread-runmPictureThread-run capturePicture err = hw_jpeg_encode( copyAndSendRawImage copyAndSendCompressedImage 先是command进程接收拍照命令,在case下启动拍照进程,先

14、申请拍照的buf,然后打开数据流,抓一帧数据存放,经过硬件编码成jpeg格式,通过copyAndSendCompressedImage返回给上层,当然在编码之前可以发送copyAndSendRawImage函数,直接发送原始数据。,五、3288和3188及以前的代码差异,www.rock-,5.1 两者差别 两者差别最大的就在camera大部分驱动放在camerahal做的。 3288的驱动文件放在hardwarerk29cameraSiliconImageisidrv,这里面只是简单camera芯片数组集合,以及一些函数结构体的赋值,部分操作代码放在库里面。3288比其他芯片多了isp(Image Signal Processing),当然对图像的处理代码也放在相应的isp库里面。 camera定义的地方也有所不一样hardwarerk29cameraConfigcam_board.xml 具体的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论