sunshine 组合
海思3516A开发板调试整理(⼆)
第四部分 Sensor调试
我们⼿头上这块开发板使⽤的是索尼的IMX178LQJSensor,那么完成以上的⼯作之后就进⼊了针对这款sensor的修改调试⼯作了。1. 依赖⽂件
SDK中针对sensor的驱动有以下⼏个依赖⽂件:
1). load3516a:这⾥主要是3516pinmux中⼏个跟sensor有关的寄存器,可修改。
2). sensor_i2c.ko /sensor_spi.ko:这两个⽂件⼆选⼀使⽤,主要是提供了和sensor通信的⽀持,需要根据sensor的通信⽅式进⾏进⾏有选
heart attack择性地加载,加载操作在load3516a中。这两个ko的源码位于$(SDK_PATH)\mpp\extdrv 下,可修改。
3). libsns_xxx.a /libsns_xxx.so:这两个⽂件⼆选⼀使⽤,主要提供了sensor图像输出的配置接⼝,需要在应⽤层序中进⾏调⽤,使⽤静
态库还是动态库⽅式都是可以的,如以imx178的sensor为例,对应的库⽂件分别为libsns_imx178.a和libsns_imx178.so,其源码位于$(SDK_PATH)\mpp\component\isp\sensor下,可修改。
以上⼏个⽂件是配置sensor时有可能需要进⾏配置的地⽅。⽬前,总部那边使⽤的ov4689的sensor,在demo板上使⽤的驱动
在SDK020基础上⽆需做任何修改。
2. IMX178配置
第⼀步通信⽅式
⼀般sensor的通信⽅式有SPI或I2C两种⽅式,⾄于IMX178LQJ的sensor通信⽅式,卖家提供给我的信息是使⽤SPI通信,但是从海思提供的配置和代码来看,是使⽤I2C的⽅式进⾏通信的,那么这⾥就出现了分歧,那么就获取官⽅信息吧,千⽅百计地卖家要了⼀
份IMX178的datasheet,⼀查,有如下描述:
Imagedata output(Low voltage serial LVDS output)
Communicationport( IIC interface )唐僧抒怀
那么这就很明显了,通信⽅式是I2C通信,图像输出使⽤LVDS,那么再看load3516a中的配置,在ins
ert_sns函数中imx178的分⽀配置了寄存器0x200f0050和0x200f0054分别设置为i2c0_scl和i2c0_sda,然后再看ko的加载,在函数insert_ko中有加载了sensor_i2c.ko,所以这些配置⽆误。
下⾯,对sensor的⼯作时钟进⾏配置。
第⼆步时钟配置
对于sensor的输⼊时钟,在datasheet中介绍有如下⼏种⼯作模式:54MHzor 27MHz / 74.25MHz or 37.125MHz,
在$(SDK_PATH)\mpp\component\isp\sensor\ ⽂档中有针对sensor输⼊时钟的配置⽅法,其描述如下:
卖家提供的信息是需要配置成27M输⼊时钟,我经过测试发现在SDK030下,配置成25M时钟,sensor配置为1080p@60fps下出CVBS视频暂时没有问题,配置成27M时钟也没有问题,也就是说从⽬前的测试情况,两种⼯作模式都可以。⾄于是否会有其他⽅⾯问题,需要进⼀步验证。
第三步图像输出
Sensor图像输出的配置是在应⽤程序中调⽤SAMPLE_COMM_ISP_Init函数中注册实现,使⽤SDK030的默认配置即可。
3. H3A参数
每⼀种sensor在SDK⾥⾯都提供了默认的H3A参数,这些H3A参数保存
在$(SDK_PATH)\mpp\component\isp\sensor\$(SENSRO_TYPE)\$(SENSOR_NAME)_cfg.ini⽂件中,如果需要使⽤配置⽂件的⽅式进⾏如下两步操作:
1、将$(SDK_PATH)\mpp\Makefile.param 中”exportISP_INI_CONFIG=n” 改为”exportISP_INI_CONFIG=y”,并进⼊
到$(SDK_PATH)\mpp\component\isp\sensor重新编译sensor的库⽂件,并将库⽂件更新到应⽤程序中。
2、在⽂件系统中,在和应⽤层序同⼀级⽬录下新建configs⽂件夹,并将$(SENSOR_NAME)_cfg.ini拷贝到该⽂件夹中。
但是这种⽅式还没⽤起来,在链接lib_iniparser.a的时候提⽰有函数不到,应该是libc库版本的问题,所以暂时把这个问题放下了,直接使⽤代码中的默认参数来进⾏配置。
4. 遗留问题
1. 1080P⾼清输出未调;
2. 5M标清和⾼清输出未调;
3. Vpss离线模式输出未调;
第五部分应⽤程序
第⼀节系统VIO
系统VIO程序源码来⾃于SDK中提供的sample_vio相关的代码。
孙子涵图片
VIO这个例⼦主要是测试系统VI和VO即视频的输⼊和输出,有5组在线模式的例⼦和5组离线模式的例⼦,下⾯列举⼀下在线模式和离线模式的区别。
第⼀步差异
说到海思Hi3516⽅案中的VIO系统,即视频输⼊输出系统,必定要将在线模式和离线模式分开,⽽在线模式和离线模式之间的差异是⽐较多的。⾸先还是先了解⼀下系统VIO的流程,如下图所⽰:
图5-1系统VIO流图
从上图可以看出,视频VIO的基本流程是从VI->VPSS->VO,⽽从VPSS到VO的这个过程,⼜可以分为bypass和⾮bypass两种模式。
再来说⼀说online模式和offline模式之间的区别:
1. Offline是传统的Hi3518/Hi3520D等芯⽚的VI/VPSS协作模式,它要经历从VI->DDR->VPSS的过程;⽽online模式是3516A独有的,⽆
需经历DDR的转存。所以online模式的优势在于节省了内存的消耗。
2. Online模式在VI侧⽆法进⾏CoverEx、OverlayEx、Rotate、LDC等操作,需要在VPSS各通道写出之后再进⾏Rotate/LDC等处理。
kiss因为是女子3. Online模式不⽀持DIS,即数字防抖和数字防抖信息的统计
4. Online模式下以下接⼝不⽀持:
HI_MPI_VI_SetFrameDepth
HI_MPI_VI_GetFrame
HI_MPI_VI_ReleaseFrame
HI_MPI_VI_SetUserPic
HI_MPI_VI_EnableUserPic
HI_MPI_VI_DisableUserPic
HI_MPI_VI_Query
HI_MPI_VI_SetExtChnAttr
HI_MPI_VI_GetExtChnAttr
HI_MPI_VI_SetExtChnCrop
HI_MPI_VI_GetExtChnCrop
HI_MPI_VI_SetLDCAttr
HI_MPI_VI_GetLDCAttr
HI_MPI_VI_SetRotate
HI_MPI_VI_GetRotate
HI_MPI_VPSS_EnableBackupFrame
HI_MPI_VPSS_DisableBackupFrame
HI_MPI_VPSS_SetGrpCrop
HI_MPI_VPSS_GetGrpCrop
HI_MPI_VPSS_SendFrame
HI_MPI_VPSS_GetGrpFrame
HI_MPI_VPSS_UserReleaseGrpFrame
HI_MPI_VPSS_SetGrpFrameRate
HI_MPI_VPSS_GetGrpFrameRate
HI_MPI_VPSS_SetGrpDelay
HI_MPI_VPSS_GetGrpDelay
5. Online模式下使⽤chn帧率控制⽅案,对各个物理通道图像进⾏帧率控制;offline模式下使⽤group帧率控制⽅案,对各group输⼊图像
进⾏帧率控制。
6. Online模式⽀持以⾏为单位,边采集别发送的⽅式,降低延时。
7. Online模式仅能创建⼀个group,即VPSS只⽀持⼀路输出;Offline模式⽀持创建多路group。
第⼆步online模式
开启online模式的⽅法前⾯已经介绍了,在使⽤load3516a的时候不添加–offline操作即可,它的区别在于运⾏sysctl_hi3516a.sh脚本的时候对⼏个寄存器的配置有所区别。
⾸先我运⾏./sample_vio 0 0来调试online模式来进⾏调试,输⼊是将VI和VPSS绑定,输出将VPSS和CVBS绑定,sensor进来1080p图像,后端输出CVBSNTSC模式或者PAL模式标清视频,两种输出模式均能正常输出视频,但是出现如下的问题:
1. 在VI通道端抓图错误,错误码提⽰操作不⽀持
HI_MPI_VI_SetFrameDepth和HI_MPI_VI_GetFrame接⼝均提⽰操作不⽀持,错误码为0xa0108008。仔细查看⽂档,发现⽂档⾥⾯说了,确实是在线模式不⽀持这样获取VI图像信息,那么怎么进⾏在线模式的前端抓图呢?这⾥做⼀个遗留。
2. 在VO通道抓图错误,可以获取到帧数据,但是保存的图像不对。
⽂档中提供了三个接⼝:
接⼝⼀:HI_MPI_VO_GetScreenFrame这个接⼝是获取视频层的图像
接⼝⼆:HI_MPI_VO_GetChnFrame这个接⼝是获取通道图像数据
接⼝三:HI_MPI_VO_GetGraphicLayerCSC这个是获取图形层图像数据
那么这三个层有什么区别呢?
⾸先关于接⼝三,⽂档中有这样的说明:该接⼝主要⽤于获取图形层的输出效果,包括亮度、对⽐度、⾊调、饱和度,其取值范围为[0,100],所以这个接⼝跟获取图像帧数据⽆关,可以排除。
关于视频层和通道以及设备三者之间的关系,在⽂档中有如下描述:
从以上的描述信息和两个表来看,设备->视频层->通道三者存在从属关系,3516A中只有⼀个设备,所以设备号最⼤为0,⽽且这个是标清设备,不⽀持⾼清设备。视频层只有⼀个,通道数最⼤32个。显然由于⼀个视频层是有多个通道的,我们应该采⽤获取通道参数的接⼝来获
取VO的帧信息。
但是反复使⽤HI_MPI_VO_GetChnFrame接⼝发现仍然⽆法获取正常的yuv图像出来,为什么会这样呢?反复⽐对vou_chn_dump.c中的程序,发现⼀个问题,当获取的帧有设置压缩模式的时候,需要将该帧通过VGS模块进⾏解压缩才能获取到原图,并不能直接将从接
⼝HI_MPI_VO_GetChnFrame获取到的帧数据进⾏内存映射之后写到⽂件⾥⾯去,这样只能得到压缩后的图像,并不能得到原图,所以需要调度VGS⼯作任务进⾏内存拷贝之后,将解压缩之后的⽬标内存⾥的数据写到yuv图像⾥⾯去,才能得到正常的图像。相关的源码可以参
照vou_chn_dump.c⽂件。
第三步offline模式
kara组合图片
Offline模式由于使⽤DDR来缓存VI输⼊,是可以使⽤HI_MPI_VI_SetFrameDepth和HI_MPI_VI_GetFrame接⼝来进⾏VI端视频输⼊补帧的。第⼆节 H3A统计
第⼀步PQTool⼯具调试
PQTool在线图像调试⼯具是海思提供的⼀款基于⽹络连接的在PC端进⾏设备图像效果调试的软件,其软件运⾏依赖于设备端
的ittb_control的已⽤程序,在海思提供的030版本的SDK中可以到PQTools_V3.7.3.zip和Hi3516A_PQ_V1.0.两个压缩包,分别对应PC端的PQTool⼯具和设备端的ittb_control⼯具,这两个⼯具使⽤⽅法可以参考⽂档《图像质量调试⼯具使⽤指南.pdf》。
需要注意的事,设备端的ittb_control⼯具有⼀些依赖的动态库,⼏乎说有的库都放在同级⽬录下的libs⽬录下⾯,但是有⼏个标准库存在⼀些不匹配的问题,⽐如我在调试的时候出现libpthread.so.0库不匹配的问题,程序运⾏出现断错误,所以到合适的libpthread.so.0库之后放在 ittb的libs⽬录下即可。
第⼆步ISP、3A和Sensor
ISP库是海思SDK提供的封装库,这部分内容未开源,只提供了⼀些注册接⼝和调⽤接⼝,3A库除了
可以使⽤海思提供的库之外还可以使⽤⾃⾏开发的库,sensor需要向3A和ISP都提供注册函数,三者关系如图:
图5-2 ISP、3A、sensor之间关系
除上图中所描述的之外,3A库还需要向ISP提供回调函数注册。
下⾯⼏个图表分别描述了各个模块需要注册的函数
图5-3 sensor向ISP注册函数
图5-4sensor向AE库注册函数
图5-5 sensor向AWB注册函数
图5-6 AE向ISP注册函数
图5-7 AWB向ISP注册函数
以上注册关系需要在运⾏ISP之前完成所有函数的注册。注册完之后在程序运⾏时调⽤HI_MPI_ISP_Run启动ISP线程。所以,在我们开发和使⽤⾃⼰的3A库的时候,按照海思提供的⽅案
是需要按上⾯⼏幅图的流程来建⽴ISP、3A和Sensor之间的调⽤关系,同时,需要⾃⾏实现回调函数。
第三步统计信息
海思⽅案⾃带的3A库有lib_hiae.a、lib_hiawb.a和lib_hiaf.a,针对这三个库,应⽤程序分别
⽤HI_MPI_AE_Register、HI_MPI_AWB_Register和HI_MPI_AF_Register针对这三个库分别使⽤”hisi_ae_lib”、
”hisi_awb_lib”和”hisi_af_lib”进⾏3A库注册,同时,SDK针对⾃带的3A库提供了很多设置和获取信息的接⼝。
接⼝HI_MPI_ISP_GetStatistics⽤来获取ISP统计信息,统计信息结果保存到ISP_STATISTICS_S结构体中,该结构体包含了以下统计信息:
AE统计信息有:
全局5段直⽅图信息;
分区间5段直⽅图信息;
全局256段直⽅图信息;
全局统计平均值,按顺序分别表⽰R,Gr,Gb,B分量的平均值;
分区间统计平均值,按顺序分别表⽰R,Gr,Gb,B分量的平均值。
AWB统计信息有:
Bayer域全局统计的R、G、B分量平均值;
Bayer域15*17区域分区间统计的R、G、B分量平均值;
RGB域全局统计的G/R值;
RGB域全局统计的G/B值;
RGB域全局统计的灰点个数;
RGB域分区间统计的G/R值;
RGB域分区间统计的G/B值;
RGB域分区间统计的灰点个数。
3A算法并不需要显式地去配置ISP寄存器,只需将需要配置的ISP寄存器值写
到ISP_AE_RESULT_S、ISP_AWB_RESULT_S、ISP_AF_RESULT_S结构体中即可;也不需要显式地去读取ISP寄存器,只需
从ISP_AE_INFO_S、ISP_AWB_INFO_S、ISP_AF_INFO_S结构体中读取即可。
以上这些接⼝和结构体的使⽤⽅式是在同进程内获取ISP和3A统计信息的⽅式,与之对应的,海思SDK提供了从基址为0x205A0000开始的多组寄存器来保存这些响应的数据信息,以便外部程序获取ISP统计信息,0x0~0xFFFF对应ISP的硬件寄存器,0x10000~0x1FFFF对
应ISPfirmware的外部寄存器。0x20000~0x2FFFF对应AE的外部寄存器,其中分成了16份,海思AE⽤
了0x20000~0x21FFF。0x30000~0x3FFFF对应AWB的外部寄存器,0x40000~0x4FFFF对应AF的外部寄存器,同样的也分成了16份。
这些外部寄存器使⽤HI_MPI_ISP_MemInit接⼝来进⾏初始化,使⽤接⼝HI_MPI_ISP_SetRegister来
设置这些寄存器的值,设置之后可以在其他进程中获取这些寄存器的值。⾄于这些外部寄存器,海思未做限制,完全由应⽤程序操作处理。不过使⽤时需要避免内存地址被占⽤,海思提供了⼤概1300多组ISP的硬件寄存器(硬件寄存器详细信息查看⽂档《Hi3516A/Hi3516D专业型HDIP Camera Soc⽤户指南》
第11章ISP部分),这些硬件中有的已经不在0x0~0xFFFF的地址空间之内了,⽽从芯⽚地址空间的映射关系来
看,0x205C_00000x205C_FFFF的地址空间⽤于VDP寄存器使⽤来使⽤。