海思3516A开发板调试整理(二)

在学了在学了! 2020-08-11 10:30:44 5252
第四部分 Sensor调试

我们手头上这块开发板使用的是索尼的IMX178LQJSensor,那么完成以上的工作之后就进入了针对这款sensor的修改调试工作了。

依赖文件

SDK中针对sensor的驱动有以下几个依赖文件:
1). load3516a:这里主要是3516pinmux中几个跟sensor有关的寄存器,可修改。
2). sensor_i2c.ko /sensor_spi.ko:这两个文件二选一使用,主要是提供了和sensor通信的支持,需要根据sensor的通信方式进行进行有选择性地加载,加载操作在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基础上无需做任何修改。

IMX178配置

第一步 通信方式
一般sensor的通信方式有SPI或I2C两种方式,至于IMX178LQJ的sensor通信方式,卖家提供给我的信息是使用SPI通信,但是从海思提供的配置和代码来看,是使用I2C的方式进行通信的,那么这里就出现了分歧,那么就获取官方信息吧,千方百计地找卖家要了一份IMX178的datasheet,一查,有如下描述:

Imagedata output(Low voltage serial LVDS output)
Communicationport( IIC interface )

那么这就很明显了,通信方式是I2C通信,图像输出使用LVDS,那么再看load3516a中的配置,在insert_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\ readme_cn.txt文档中有针对sensor输入时钟的配置方法,其描述如下:

卖家提供的信息是需要配置成27M输入时钟,我经过测试发现在SDK030下,配置成25M时钟,sensor配置为1080p@60fps下出CVBS视频暂时没有问题,配置成27M时钟也没有问题,也就是说从目前的测试情况,两种工作模式都可以。至于是否会有其他方面问题,需要进一步验证。

第三步 图像输出
Sensor图像输出的配置是在应用程序中调用SAMPLE_COMM_ISP_Init函数中注册实现,使用SDK030的默认配置即可。

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库版本的问题,所以暂时把这个问题放下了,直接使用代码中的默认参数来进行配置。

遗留问题

  • 1080P高清输出未调;
  • 5M标清和高清输出未调;
  • Vpss离线模式输出未调;
第五部分 应用程序
第一节 系统VIO

系统VIO程序源码来自于SDK中提供的sample_vio相关的代码。
VIO这个例子主要是测试系统VI和VO即视频的输入和输出,有5组在线模式的例子和5组离线模式的例子,下面列举一下在线模式和离线模式的区别。

第一步 差异
说到海思Hi3516方案中的VIO系统,即视频输入输出系统,必定要将在线模式和离线模式分开,而在线模式和离线模式之间的差异是比较多的。首先还是先了解一下系统VIO的流程

视频VIO的基本流程是从VI->VPSS->VO,而从VPSS到VO的这个过程,又可以分为bypass和非bypass两种模式。
再来说一说online模式和offline模式之间的区别:

  • Offline是传统的Hi3518/Hi3520D等芯片的VI/VPSS协作模式,它要经历从VI->DDR->VPSS的过程;而online模式是3516A独有的,无需经历DDR的转存。所以online模式的优势在于节省了内存的消耗。
  • Online模式在VI侧无法进行CoverEx、OverlayEx、Rotate、LDC等操作,需要在VPSS各通道写出之后再进行Rotate/LDC等处理。
  • Online模式不支持DIS,即数字防抖和数字防抖信息的统计。
  • 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

  • Online模式下使用chn帧率控制方案,对各个物理通道图像进行帧率控制;offline模式下使用group帧率控制方案,对各group输入图像进行帧率控制。
  • Online模式支持以行为单位,边采集别发送的方式,降低延时。
  • 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模式标清视频,两种输出模式均能正常输出视频,但是出现如下的问题:
在VI通道端抓图错误,错误码提示操作不支持
HI_MPI_VI_SetFrameDepth和HI_MPI_VI_GetFrame接口均提示操作不支持,错误码为0xa0108008。仔细查看文档,发现文档里面说了,确实是在线模式不支持这样获取VI图像信息,那么怎么进行在线模式的前端抓图呢?这里做一个遗留。

在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模式
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.3.0.tgz两个压缩包,分别对应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都提供注册函数

以上注册关系需要在运行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寄存器使用来使用。

原文链接:https://blog.csdn.net/bobpeter84/article/details/78835909?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 点赞 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
在学了在学了!
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区