Android中的camera架构及工作原理
一、Android中的camera架构
Android的camera系统架构自上而下分别为应用层、框架层、硬件抽象层及linux驱动层。下面将通过对其框架层、硬件抽象层即Linux驱动层做简单的介绍。
APP - Framework
应用层与java框架层的间主要由Binder机制进行通信。
系统初始化时会开启一个CameraService的守护进程,为上层应用提供camera的功能接口。
Framework - HAL
框架层与硬件抽象层间通过回调函数传递数据。
Overlay
Overlay层由ServiceFlinger和OverlayHal组成,实现视频输出功能,只有camera框架层或者视频框架层能调用它,上层无法直接调用。
HAL - driver
抽象层位于用户空间,通过系统调用如open(),read(),ioctl()等与内核空间进行数据传递。
二、camera工作原理
原理简介
外部光线穿过lens后,经过color filter滤波后照射到sensor面上,sensor将从lens上传到过来的光线转换成电信号,再通过内部的AD转换为数字信号,如果sensor没有集成DSP,则通过DVP的方式传输到baseband,此时的数据格式是RAW DATA。如果集成了DSP,这RAW DATA数据经过AWB,color matrix,lens shading,gamma,sharpness,AE和de-noise处理后输出YUV或者RGB格式的数据。最后会由CPU送到framebuffer中进行显示,这样我们就看到camera拍摄到的景象了。
camera chip 电路图:
5M back camera chip mt9d111的硬件电路图如下:
拿到原理图,我们需要关注的是19、21两个管脚分别连接到CAM_I2C_SDA和CAM_I2C_SCL,可以通过I2C来配置摄像头。另外调试摄像头的时候,可以根据这个原理图使用示波器来测量波形以验证代码是否正确。
这里还需要注意的是开发驱动之前最好用万用表测量摄像头的各个管脚是否和芯片连接正确,否则即使代码没有问题也看不到图像。
mt9d111是CMOS接口的图像传感器芯片,可以感知外部的视觉信号并将其转换为数字信号并输出。
我们需要通过XVCLK1给摄像头提供时钟,RESET是复位线,PWDN在摄像头工作时应该始终为低。HREF是行参考信号,PCLK是像素时钟,VSYNC是场同步信号。一旦给摄像头提供了时钟,并且复位摄像头,摄像头就开始工作了,通过HREF,PCLK和VSYNC同步传输数字图像信号。mt9d111向外传输的图像格式是YUV的格式,YUV是一种压缩后的图像数据格式,它里面还包含很多具体的格式类型,我们的摄像头对应的是YCbCr(8 bits, 4:2:2, Interpolated color)。后面的驱动里面设置的格式一定要和这个格式一致。