目录
1、更换OV9712并且做配置更改和测试
1.1、更改配置脚本
编辑1.2、测试运行
1.3、更换sensor的总结
2、MIPI和LVDS和并口
2.1、并口Sensor
2.2、LVDS
2.3、MIPI(MIPI-CSI2)
2.4、总结
3、HI3518E的Sensor接口引脚复用设置
3.1、查看引脚定义框图
3.2、找到相应设置寄存器
3.3、himm工具---是海思提供的一个写寄存器的软件库,海思在rootfs中已经安装好了
4、sensor驱动源码解析
4.1、sensor驱动源码寻找
4.2、sensor驱动的框架
4.2.1、xxxx_cmos.c中:回调函数实现和注册
4.2.2、xxxx_sensor_ctl.c中:sensor 的底层控制驱动,主要实现 sensor 的读写和初始化动作。用户可以根据sensor 的 datasheet 进行这两个文件的开发,必要的时候可以向 sensor 厂家寻求支持
5、ISP_3A框架解读(在Hi3518E_SDK_V1.0.3.0\package\mpp\component\isp目录下)
6、更改黑电平
6.1、sensor的注册接口分析
6.2、黑电平
6.3、修改sensor驱动中黑电平的设置
7、sensor驱动的寄存器操作
7.1、sensor驱动的寄存器设置在sensor_init函数中
7.2、翻转图像
8、总结
8.1、体系思想
8.2、海思方案的sensor驱动相关体系关键点
8.3、扩展学习方向
修改Hi3518E_SDK_V1.0.3.0\package\mpp\sample\Makefile.param
运行官方SDK sample的测试版本(打包到本地)
运行ORTP传输的测试版本(RTP实时预览)
(1)程序框架做好多种sensor支持的框架,导致我们可以通过配置很容易的更改
(2)不同的sensor要注意硬件接线上面的差异
(3)由于配置不同,导致加载不同的驱动,做不同的参数设置
查看Hi3518E V200R001C01SPC030\00.hardware\chip\document_cn\Hi3518EV200经济型HD IP Camera SoC产品简介 了解这款SoC支持哪些接口的sensor
(1)OV9712和AR0130都是并口的
(2)并口的接口定义:参考AR0130的原理图pdf
(3)并口传输的是CMOS电平信号(重点是非差分)
(4)并口sensor属于较低端老旧的,新型高像素的都是MIPI/LVDS/HISPI等差分信号的
(1)low voltage differential signal,低电压差分信号
(2)接口由1组差分clock和若干组差分信号线组成
(3)LVDS主要用于视频传输的2个领域:camera和主控、LCD和主控
(4)LVDS利用差分抗干扰能力,提升clock频率从而提升带宽,传输距离也更远
(5)LVDS的数据线组数越多带宽越大、clock频率越高带宽越大(牺牲抗干扰和距离)
(6)并口和LVDS之间可以互转,但是需要专门的电平转换芯片(类似于232和485)
(1)MIPI: mobile industry processor interface,移动工业处理器接口
(2)MIPI接口由1组差分clock和1-4组差分信号线组成
(3)MIPI和LVDS虽然都是差分对信号,但是不兼容,不能直接对接
(4)MIPI的架构层次更分明,广泛应用在手机平板等领域中,可以认为MIPI是LVDS的升级版
(5)MIPI的数据线组数越多带宽越大、clock频率越高带宽越大(牺牲抗干扰和距离)
(6)MIPI和LVDS和并口之间均可以互相转换,但是需要专门的电平转换芯片
(1)老旧的、低端的、数据量小的就用电平信号;新的、高端的、数据量大的都用差分信号
(2)要通信,物理层、协议层、应用层都得能对接才行。
(3)因为历史原因,很多行业会使用不同的接口标准,必要时需要去互相转换
Hi3518E V200R001C01SPC030\00.hardware\sensor\开发板原理图\*
Hi3518E V200R001C01SPC030\00.hardware\chip\document_cn\Hi3518EV20X/Hi3516CV200经济型HD IP Camera Soc用户指南
使用himm工具修改Sensor相关引脚寄存器的配置
(1)从sample入手
(2)sensor层驱动在component/isp中(mpp\component\isp\sensor\ar0130)
查看Makefile
发现sensor驱动最终编成.so动态库和.a静态库的形式被放到了lib目录下
这是应用层驱动,应用层驱动是将内核驱动大部分内容放到了应用层实现,好处是驱动更改时,无需重新编译内核,只需将重新制作动态库。坏处是很容易被替换,安全性不好,还有一个就是应用层驱动的效率没有内核层效率高。
并且,应用层驱动是不可以直接操作硬件的,它最终还是调用了内核I2C驱动操作硬件。
sensor_register_callback
cmos_init_sensor_exp_function
sensor_init
sensor_init_720p_30fps
sensor_write_register
ioctl(g_fd, GPIO_I2C_WRITE, &i2c_data);//应用层调用I2C驱动
(3)底层i2c驱动在kernel中
(1)mpp定义了一套sensor驱动的实现和封装
(2)xxxx_cmos.c中定义回调和上层函数
(3)xxxx_sensor_ctl.c中定义底层硬件相关的寄存器值配置函数
(4)kernel中的I2C驱动提供i2c层面的物理层操作接口
//应用层和Sensor驱动的接口
sensor_register_callback //这个函数 主要是对 与Sensor驱动相关的函数的绑定
cmos_init_sensor_exp_function //一系列函数指针的填充
HI_MPI_ISP_SensorRegCallBack //初始化Sensor中与ISP相关的操作
cmos_init_ae_exp_function //一系列函数指针的填充
HI_MPI_AE_SensorRegCallBack //初始化Sensor中与AE相关的操作
cmos_init_awb_exp_function //一系列函数指针的填充
HI_MPI_AWB_SensorRegCallBack //初始化Sensor中与AWB相关的操作
ISP 的 Firmware固件 包含三部分,一部分是 ISP 控制单元和基础算法单元,即 ISP 库(isp\firmware),一部分是 AE/AWB/AF 算法库(isp\3a),一部分是 sensor 库(isp\sensor)。Firmware 设计的基本思想是单独提供 3A 算法库,由 ISP 控制单元调度基础算法单元和 3A 算法库,同时 sensor 库分别向ISP 库和 3A 算法库注册函数回调,以实现差异化的 sensor 适配,实现解耦合。
SAMPLE_COMM_ISP_Init
sensor_register_callback sensor 库分别向ISP 库和 3A 算法库注册函数回调
HI_MPI_AE_Register 3A算法库向ISP库注册函数回调
HI_MPI_AWB_Register
HI_MPI_AF_Register
ISP firmware 设计思路如下图
不同的 sensor 都向 ISP 库和 3A 算法库注册控制函数,这些函数都以回调函数的形式存
在。ISP 控制单元调度基础算法单元和 3A 算法库时,将通过这些回调函数获取初始化
参数,并控制 sensor,如调节曝光时间、模拟增益、数字增益,控制 lens 步进聚焦或
旋转光圈等。
例子:sensor驱动自己提供操作曝光时间的函数和获取曝光时间的函数,然后将这个函数注册到ISP库和3A算法库,3A算法库根据外部光照强度计算出一个Sensor曝光时间的设置值,ISP库得到这个设置值,然后通过Sensor之前注册的回调函数,把这个值设置到Sensor的硬件寄存器中去,实现整个过程。
2.1 软件流程
ISP 作为图像前处理部分,需要和视频采集单元(VIU)协同工作。ISP 初始化和基本
配置完成后,需要 VIU 进行接口时序匹配。一是为了匹配不同 sensor 的输入时序,二
是为 ISP 配置正确的输入时序。待时序配置完成后(SAMPLE_COMM_ISP_Init函数执行结束),ISP 就可以启动 Run(执行SAMPLE_COMM_ISP_Run函数) 来进行动态
图像质量调节。此时输出的图像被 VIU 采集,进而送去显示或编码。软件使用流程如
图 2-1 所示。
PQ Tools 工具主要完成在 PC 端进行动态图像质量调节,可以调节多个影响图像质量的
因子,如去噪强度、色彩转换矩阵、饱和度等。
黑电平(black level)是指显示装置上,全黑输出对应视频信号电平。即定义图像数据为0时对应的信号电平。
例子:图像上用rgb000表示黑颜色,000是数字信号,需要转化成模拟电信号,然后再将模拟电信号转化为光信号(rgb000对应全黑输出)显示到显示器上。这是显示器上,Sensor那边也一样,是反着来的
光透过镜头照到Sensor上-》光信号转化为模拟电信号-》AD转换成数字信号(rawRGB)
(1)修改驱动源码(sambashar\Hi3518E_SDK_V1.0.3.0\package\mpp\component\isp\sensor\ar0130)
(2)清除,并重新编译
(3)确认mpp中lib目录下的libsnsxxx.a/so已经被更新
(4)重新编译sample并运行查看效果
(5)能看到图像变得更粉红、更亮
sensor_init
sensor_init_720p_30fps
sensor_write_register
(1)sensor内部有若干寄存器,可以通过I2C接口来读写
(2)数据手册有对寄存器的基本说明
(3)经验:大部分寄存器设置厂家会给,偶尔需要自己调一些
0x3040寄存器用于管mirror(镜像)和flip(翻转)图像的;
一般的监控摄像头是倒装的,所以可以只设置flip位就能达到效果;
(1)查sensor数据手册的寄存器列表
(2)改sensor驱动代码
(3)重新编译isp
(4)确认sensor库已经更新到mpp中
(5)重新编译sample,运行测试
未flip的图像
flip后的图像
(1)成熟的商业解决方案都是一整套设计好的模式
(2)第一步是理解,第二步是用起来,第三步是小修改,第四步是大修改,第五步是创造
(1)搞清楚sensor的本质:光电转换+AD+ISP+并口/MIPI/LVDS
(2)ISP有多种实现:sensor内置、主SoC内置、外接专用ISP芯片
(3)3A是为最终图像效果负责的,3A的实现依赖于镜头、sensor、isp等各部门协同工作
(4)海思的体系中把sensor和3A、ISP实现为:指针挂接注册的各自独立模块
(1)sensor的各种参数
(2)其他几种sensor的驱动和对比实现
(3)isp的firmware
(4)3A算法相关知识