1、Cmera I2C介绍
I2C总线协议
-
I2C总线在物理连接上比较简单,分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成。通信原理是通过对SCL和SDA线高低电平时序的控制,来产生I2C总线协议所需要的信号进行数据的传递。在总线空闲时,这两根线一般被上面所接的上拉电阻拉高,保持着高电平。I2C通信方式为半双工,只有一根SDA线,同一时间只可单向通信。
**
I2C总线特征 -
I2C总线上的每一个设备都可以作为主设备或者从设备,而且每一个设备都会对应一个唯一的地址(地址通过物理接地或者拉高,主从设备之间就通过这个地址来确定与哪个器件进行通信,在通常的应用中,我们把CPU端带有I2C总线接口的模块作为主设备,把挂接在总线上的其他设备都作为从设备。
-
I2C总线上可挂接的设备数量受总线的最大电容400pF限制,如果所挂接的是相同型号的器件,则还受器件地址位的限制。
-
I2C总线数据传输速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s。一般通过I2C总线接口可编程时钟来实现传输速率的调整,同时也跟所接的上拉电阻的阻值有关。
-
I2C总线上的主设备与从设备之间以字节(8位)为单位进行双向的数据传输。
I2C总线协议
-
I2C协议规定,总线上数据的传输必须以一个起始信号作为开始条件,以一个结束信号作为传输的停止条件。起始和结束信号总是由主设备产生(意味着从设备不可以主动通信,所有的通信都是主设备发起的,主可以发出询问的command,然后等待从设备的通信)
-
起始和结束信号产生条件:总线在空闲状态时,SCL和SDA都保持着高电平;
-
当SCL为高电平而SDA由高到低的跳变,表示产生一个起始条件;
-
当SCL为高而SDA由低到高的跳变,表示产生一个停止条件。
-
在起始条件产生后,总线处于忙状态,由本次数据传输的主从设备独占,其他I2C器件无法访问总线;而在停止条件产生后,本次数据传输的主从设备将释放总线,总线再次处于空闲状态。起始和结束如图所示
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/d3e5c02e87148f71d88a7434ba6a723e.png)
-
数据传输以字节为单位(8bit位)。主设备在SCL线上产生每个时钟脉冲的过程中将在SDA线上传输一个数据位,当一个字节按数据位从高位到低位的顺序传输完后,紧接着从设备将拉低SDA线,回传给主设备一个应答位,
此时才认为一个字节真正的被传输完成 -
并不是所有的字节传输都必须有一个应答位,比如:当从设备不能再接收主设备发送的数据时,从设备将回传一个 否定应答位
。数据传输的过程如图所示:
- I2C总线上的每一个设备都对应一个唯一的地址,主从设备之间的数据传输是建立在地址的基础上,也就是说,主设备在传输有效数据之前要先指定从设备的地址,地址指定的过程和上面数据传输的过程一样,只不过大多数从设备的地址是7位的,然后协议规定再给地址添加一个最低位用来表示接下来数据传输的方向,0表示主设备向从设备写数据,1表示主设备向从设备读数据。向指定设备发送数据的格式如图所示:
(每一最小包数据由9bit组成,8bit内容+1bit ACK, 如果是地址数据,则8bit包含1bit方向):
I2C总线操作
主设备往从设备中写数据,数据传输如下:
- 主设备从从设备中读数据,数据传输如下:
- 主设备往从设备中写数据,然后重启起始条件,紧接着从从设备中读取数据;或者是主设备从从设备中读数据,然后重启起始条件,紧接着主设备往从设备中写数据。数据传输格式如下
Image Sensor类型
YUV sensoe
-
YUV
sensor输出Data格式为YUV,图像的处理效果使用sensor内部的ISP,BB端接收YUV格式的data后只进行格式的转换,效果方面不进行处理,由于sensor内部的ISP处理能力有限,且YUV
sensor的数据量比较大,一般Size都比较小,常见的YUV sensor都是5M以下Raw Sensor
-
Raw Sensor输出的Data格式为Raw,图像的效果处理使用BB端的ISP,BB端接收Raw
data后进行一系列的图像处理(OB,Shading,AWB,Gamma,EE,ANR等),效果方面由BB端控制,需要针对不同的模组进行效果调试,Raw
sensor是目前的主流,数据量比YUV Sensor小(RAW10 格式的sensor 1个pixel
10个bit)使用平台ISP处理,能支持较大的size。
3、常见概念
三路电压
- camera包含的三路电压为模拟电压(VCAMA),数字电压(VCAMD),IO口电压(VCAMIO)
I2C信号
- BB与Sensor端通过I2C来通信(读写寄存器),包括SCL(I2C Clock) SDA(I2C Data)信号
mipi几条lane
- mipi data是成对的差分信号,MIPI_RDN和MIPI_RDP,有几对这样的pin脚,则说明是几条lane,同一颗sensor由于register setting不同,输出的信号有可能是2 lane或者4lane等。
parallel高低八位
- Parallel接口一般Data有10根pin,分别叫做Data0~Data9,Parallel
sensor输出的data信号是8根pin时,这八根pin接到的是Data0Data7还是Data2Data9,需要配置正确,叫做接到高八位或者低八位,接错了可能产生如下现象
Data Format
-
Sensor输出的数据格式,对于YUV Sensor来说,Data
Fomat一般有YUYV,YVYU,UYVY等,配置不对可能会导致颜色和亮度错掉,例如下图 -
对于Raw Sensor来说,Data Format就是First Pixel的颜色,分为R,Gr,Gb,B,配置不对会导致颜色错误
MCLK
- BB提供给Sensor的外部clock
PCLK
- Parallel接口的Sensor输出的clock,该clock变化一次,data更新一次
mipi 信号
- mipi信号包括mipi clock和mipi data,该信号是高速信号,用来传输mipi数据包
Flare
- 镜片(感光区)表面反射后产生的雾蒙。Blue glass比IR cut要好。
摩尔纹
- 感光元件出现的高频干扰。消除摩尔纹应使镜头分辨率小于感光元件的空间频率或者感光元件像素密度超过镜头分辨率。
False color
- 除了摩尔效应之外,感光的RGB色块排列有是原因之一。一般ISP按照bayer
pattern色块的顺序排列,当遇到突出部或微细构造时,会出现颜色换算出错而产生 false color。
Purple Fringe(紫边)
- 镜头色散与颜色插值运算问题导致。一般都是在拍反差的景物时,在明暗交界边缘部分会出现异常的紫色。
-
Android系统简述
MTK camera HAL层框架
camea service、camera provider、camera hal service、 camera device manager、camera device这五部分 -
frameworks/av/services/camera/libcameraservice/CameraService.cpp
-
vendor/mediatek/proprietary/hardware/mtkcam3/main/hal/devicemgr/provider/2.4/CameraProviderImpl.cpp
-
vendor/mediatek/proprietary/hardware/mtkcam3/main/hal/service/service.cpp
-
vendor/mediatek/proprietary/hardware/mtkcam3/main/hal/devicemgr/CameraDeviceManagerBase.cpp
-
vendor/mediatek/proprietary/hardware/mtkcam3/main/hal/device/3.x/device/CameraDevice3Impl.cpp
Android框架启动过程
-
手机开机后,引导芯片启动,引导芯片开始从固化在ROM里的预设代码执行,加载引导程序到RAM,bootloader检查RAM,初始化硬件参数等功能。
-
硬件参数初始化完成,进入Kenrel层,kenrel层主要加载一些硬件设备驱动,初始化进程管理等操作。在kenrel中首先启动swapper进程(pid=0),用于初始化进程管理、内部管理、加载Driver等操作,再启动kthread进程(pid=2),这些linux系统内湖进程,kthread是进程鼻祖。
-
kenrel加载完毕后,硬件设备驱动与HAL层进行交互,初始化进程管理等操作会启动INIT进程,这些在native层。
-
init进程启动后,启动adbd,logd等用户守护进程,并且会启动servicemanager等重要服务,同时孵化出zygote进程,属于c++
FWK,CameraHalServer进程就在这时启动
-
USER 进程当前用户
-
PID 进程ID
-
PPID 父进程ID
-
VSIZE 进程的虚拟内存大小,以kb为单位
-
RSS 实际占用内存大小,以kb为单位
-
WCHAN 进程正在睡眠的内核函数名称,该函数的名称是从/root/system.map文件获取
-
PC Program Counter Name 进程状态及名称
-
zygote进程由init进程解析init.rc文件后fork生成,它会加载虚拟机,启动System
Server,它会负责启动和管理整个JAVA
FWK,包含ActivityManager、WindowManager、PackageManager、PowerManager等 -
zygote同时启动相关App进程,启动的第一个App进程为Launcher,然后启动Email,SMS等进程,所有的APP进程都有zygote
fork生成。init进程启动
start_kernel()->rest_init()-kernel_thread(kernel_init)->kernel_init(),如图所示init进程就这样启动了
init.rc有两个,使用场景不一样,分别位于
-
./system/core/rootdir/init.rc //一个是正常启动用到的.
-
./bootable/recovery/etc/init.rc //一个是刷机用到的,也就是进入recorvery模式,
rc文件加载
- camera hal server 是因为用rc文件文件启动
rc文件简介
service关键字声明你要定义一个service,而servicehalserver就是这个service的名字,后面的目录库就是这个server对应的可执行文件在系统中的位置。这个位置指的是开发板运行你的Android源码编译后的目录,而不是源码目录。本文位置在vendor/mediatek/proprietary/hardware/mtkcam3/main/hal/service/下
-
class 设置class name
-
user 用户归属
-
group 组归属
-
ioprio io调度优先级
-
capability 能力,也就是系统对进程的一种权限控制。
-
writepid 当fork一个子进程时,写子进程的pid到一个给定的文件。是给cgroup/cpuset使用
rc文件中使用Init进程启动camerahalserver,意思就是说在init进程中camerahalserver.rc文件如何加载以至于启动hal服务