HISI_3516_vi
主要的解释还是看这些大牛的,我这里只是想自己整理一遍:海思3518E开发笔记2.5——海思VI(video input)模块详解_Spark!的博客-CSDN博客_海思wdr目录海思video input模块架构介绍海思video input模块功能介绍结构体说明函数调用关系流程分析step 1: mipi configurestep 2: configure sensor and ISP(include WDR mode)step 3: run isp threadstep 4 : config & start vicap devStep 5: config & start vicap chn (max 1)海思3518的sample中,创建好视频缓存池及初https://blog.csdn.net/qq_28258885/article/details/118726016海思媒体处理平台VI视频输入模块 - 灰信网(软件开发博客聚合)https://www.freesion.com/article/5198150354/
目录
1.VI模块架构介绍
2.结构体说明
3.函数说明
初始化参数 ,后面函数会引用到
<1>VI_STARTMIPI
① GK_ADP_COMM_VI_GetMipiLaneDivideMode(pstViConfig)
②GK_ADP_COMM_VI_SetMipiHsMode(lane_divide_mode)
<2>GK_ADP_COMM_VI_SetParam
参数介绍
<3>GK_ADP_COMM_VI_CreateVi
①GK_ADP_COMM_VI_StartDev
②GK_ADP_COMM_VI_BindPipeDev
③GK_ADP_COMM_VI_StartViPipe
④GK_ADP_COMM_VI_StartViChn
<4> GK_ADP_COMM_VI_StartIsp
总的概述函数图:
1.VI模块架构介绍
摄像机通过镜头(lens)聚焦光线,将光信号投射到 sensor 的感光区域,sensor经过光电转换,将 Bayer 格式的原始图像送给 ISP(Image Signal Processing 图像信号处理) 经过算法处理,输出 RGB 空间域的图像给后端的视频采集单元。在这个过程中,ISP 通过运行在其上的 firmware 对 lens 和 sensor 进行相应控制,进而完成自动光圈、自动曝光、自动白平衡等功能。其中,firmware 的运转靠视频采集单元的中断驱动。
sensor数据信号出来后,通过 MIPI Rx(含 MIPI 接口、LVDS 接口和 HISPI 接口),SLVS-EC,BT.1120,BT.656,BT.601,DC 等接口接收视频数据。
MIPI:移动产业处理器接口(Mobile Industry Processor Interface 简称MIPI)是为移动应用处理器制定的开放标准和一个规范
数据传到dev后再对视频数据进行isp处理,再进行镜头畸变矫正(LDC)、动态对比度调节(DCI)、DIS(消抖)模块处理,最后通过dev将处理好的视频丢进通道,和其他模块进行交互。
2.结构体说明
typedef struct gk_VI_CONFIG_S
{ SAMPLE_VI_INFO_S astViInfo[VI_MAX_DEV_NUM]; //VI_MAX_DEV_NUM = 1GK_S32 as32WorkingViId[VI_MAX_DEV_NUM]; //VI_MAX_DEV_NUM = 1GK_S32 s32WorkingViNum;
} VI_CONFIG_S;//其中
typedef struct hiSAMPLE_VI_INFO_S
{SAMPLE_SENSOR_INFO_S stSnsInfo;SAMPLE_DEV_INFO_S stDevInfo;SAMPLE_PIPE_INFO_S stPipeInfo;SAMPLE_CHN_INFO_S stChnInfo;SAMPLE_SNAP_INFO_S stSnapInfo;
} SAMPLE_VI_INFO_S;
SAMPLE_VI_INFO_S内部参数说明:
3.函数说明
初始化参数 ,后面函数会引用到
pstViConfig->s32WorkingViNum = s32ViCnt;pstViConfig->as32WorkingViId[0] = 0;pstViConfig->astViInfo[0].stSnsInfo.MipiDev = GK_ADP_COMM_VI_GetComboDevBySensor(pstViConfig->astViInfo[0].stSnsInfo.enSnsType, 0);pstViConfig->astViInfo[0].stSnsInfo.s32BusId = 0;pstViConfig->astViInfo[0].stDevInfo.ViDev = ViDev0;pstViConfig->astViInfo[0].stDevInfo.enWDRMode = enWDRMode;pstViConfig->astViInfo[0].stPipeInfo.enMastPipeMode = enMastPipeMode;pstViConfig->astViInfo[0].stPipeInfo.aPipe[0] = ViPipe0; //实际上就是0pstViConfig->astViInfo[0].stPipeInfo.aPipe[1] = -1;pstViConfig->astViInfo[0].stChnInfo.ViChn = ViChn;pstViConfig->astViInfo[0].stChnInfo.enPixFormat = enPixFormat;pstViConfig->astViInfo[0].stChnInfo.enDynamicRange = enDynamicRange;pstViConfig->astViInfo[0].stChnInfo.enVideoFormat = enVideoFormat;pstViConfig->astViInfo[0].stChnInfo.enCompressMode = enCompressMode;
<1>VI_STARTMIPI
这部分只有一个COMM_VI_StartMIPI函数,这个函数中有一个COMM_VI_SetMipiAttr,作用是设置sensor的一些属性COMM_VI_SetMipiAttr中,首先打开mipi驱动加载进去后/dev底下生成的文件接着根据不同的sensor为COMM_VI_SetMipiAttr填充不同的参数,最后通过ioctl将参数设置给sensor。
这里仅具体解释两个函数。
① GK_ADP_COMM_VI_GetMipiLaneDivideMode(pstViConfig)
将lane_devide_mode赋值为0
②GK_ADP_COMM_VI_SetMipiHsMode(lane_divide_mode)
这个函数就是设置mipi的工作模式
一些代码解释:
fd = open(MIPI_DEV_NODE, O_RDWR);
/*判断打开文件是否正确。返回的是一个整型变量,如果这个值等于-1,说明打开文件出现错误,如果为大于0的值,那么这个值代表的就是文件描述符。*/
详细看这个https://blog.csdn.net/coderder/article/details/77726897https://blog.csdn.net/coderder/article/details/77726897
s32Ret = ioctl(fd, MIPI_SET_HS_MODE, &enHsMode);
//ioctl 是设备驱动程序中设备控制接口函数,就是参数设置
linux 内核 - ioctl 函数详解_岁月斑驳7的博客-CSDN博客_ioctl
<2>GK_ADP_COMM_VI_SetParam
参数介绍
GK_S32 i;GK_S32 s32ViNum;GK_S32 s32Ret;VI_PIPE ViPipe;VI_VPSS_MODE_S stVIVPSSMode;SAMPLE_VI_INFO_S *pstViInfo = GK_NULL;typedef struct VI_VPSS_MODE_S {VI_VPSS_MODE_E aenMode[VI_MAX_PIPE_NUM];
} VI_VPSS_MODE_S;
//是一个枚举类型:VI_VPSS_MODE_E,如下typedef enum VI_VPSS_MODE_E {VI_OFFLINE_VPSS_OFFLINE = 0,VI_OFFLINE_VPSS_ONLINE,VI_ONLINE_VPSS_OFFLINE,VI_ONLINE_VPSS_ONLINE,VI_PARALLEL_VPSS_OFFLINE,VI_PARALLEL_VPSS_PARALLEL,VI_VPSS_MODE_BUTT
} VI_VPSS_MODE_E;typedef struct hiSAMPLE_VI_INFO_S
{SAMPLE_SENSOR_INFO_S stSnsInfo;SAMPLE_DEV_INFO_S stDevInfo;SAMPLE_PIPE_INFO_S stPipeInfo;SAMPLE_CHN_INFO_S stChnInfo;SAMPLE_SNAP_INFO_S stSnapInfo;
} SAMPLE_VI_INFO_S;
GK_ADP_COMM_VI_SetParam(pstViConfig)具体实现如下功能:
1 //获取 VI,VPSS 的工作模式 2 s32Ret = HI_MPI_SYS_GetVIVPSSMode(&stVIVPSSMode); 3 //设置 VI,VPSS 工作模式。 4 s32Ret = HI_MPI_SYS_SetVIVPSSMode(&stVIVPSSMode);其实这里就是把之前设置好的vivpss的值设置好
for (i = 0; i < pstViConfig->s32WorkingViNum; i++)
//因为s32WorkingViNum == 1 所以以下的都是pstViConfig[0],而根据之前最早的初始化
//aPIPE[0] = 0, aPiPE[1] = -1;所以if (ViPipe != -1)等于没用{s32ViNum = pstViConfig->as32WorkingViId[i];pstViInfo = &pstViConfig->astViInfo[s32ViNum];ViPipe = pstViInfo->stPipeInfo.aPipe[0];stVIVPSSMode.aenMode[ViPipe] = pstViInfo->stPipeInfo.enMastPipeMode;if ((pstViInfo->stPipeInfo.bMultiPipe == GK_TRUE)|| (VI_OFFLINE_VPSS_ONLINE == pstViInfo->stPipeInfo.enMastPipeMode)){GK_ADP_COMM_VI_UpdateVIVPSSMode(&stVIVPSSMode);ViPipe = pstViInfo->stPipeInfo.aPipe[1];if (ViPipe != -1){stVIVPSSMode.aenMode[ViPipe] = pstViInfo->stPipeInfo.enMastPipeMode;}}if ((pstViInfo->stSnapInfo.bSnap) && (pstViInfo->stSnapInfo.bDoublePipe)){ViPipe = pstViInfo->stPipeInfo.aPipe[1];if (ViPipe != -1){stVIVPSSMode.aenMode[ViPipe] = pstViInfo->stSnapInfo.enSnapPipeMode;}}}s32Ret = GK_API_SYS_SetVIVPSSMode(&stVIVPSSMode);
<3>GK_ADP_COMM_VI_CreateVi
①GK_ADP_COMM_VI_StartDev
主要就三个函数
GK_ADP_COMM_VI_GetDevAttrBySns(enSnsType, &stViDevAttr); //获得dev0的属性 GK_API_VI_SetDevAttr(ViDev, &stViDevAttr); /*设置 VI 设备属性。基本设备属性默认了部分芯片配置,满足绝大部分的 sensor 对接要 求。*/ GK_API_VI_EnableDev(ViDev); //启用vi设备
②GK_ADP_COMM_VI_BindPipeDev
设置 VI 设备与物理 PIPE 的绑定关系GK_API_VI_SetDevBindPipe(pstViInfo->stDevInfo.ViDev, &stDevBindPipe);
③GK_ADP_COMM_VI_StartViPipe
GK_ADP_COMM_VI_GetPipeAttrBySns(pstViInfo->stSnsInfo.enSnsType, &stPipeAttr);
//获得pipe的属性,
//memcpy_s(pstPipeAttr, sizeof(VI_PIPE_ATTR_S), &PIPE_ATTR_4000x3000_RAW12_420_3DNR_RFR, sizeof(VI_PIPE_ATTR_S));
GK_API_VI_CreatePipe(ViPipe, &stPipeAttr)
创建一个 VI PIPE。
GK_API_VI_SetPipeVCNumber(ViPipe, pstViInfo->stPipeInfo.u32VCNum[i])
C语言 memcpy_s 函数 - C语言零基础入门教程 - 猿说编程 - 博客园 (cnblogs.com)
④GK_ADP_COMM_VI_StartViChn
通道的设置和启用
<4> GK_ADP_COMM_VI_StartIsp
主要是图像处理函数,这里主要看以下blog
海思3518E开发笔记2.5——海思VI(video input)模块详解_Spark!的博客-CSDN博客_海思wdrhttps://blog.csdn.net/qq_28258885/article/details/118726016基于Hi3559AV100 RFCN实现细节解析-(3)系统输入VI分析一 : - debugger.wiki - debugger.wikihttps://www.debugger.wiki/article/html/1614846962375332
总的概述函数图:
HISI_3516_vi相关推荐
最新文章
- Linux(CentOS 7_x64位)系统下安装RDkit
- java jdk目录_Java开发工具包JDK安装和目录介绍
- Spark精华问答 | Spark做大规模高性能数值计算可以吗?
- 【Vue】父子组件的传值(父组件-->子组件、子组件-->父组件)
- linux文件目录类命令--pwd命令
- machine learning之PCA、ICA
- 计算机演示文稿PPT知识点,计算机PowerPoint考点
- 再次回归 IDEA 的部分修改记录...
- 对话 | AI、机器学习在材料科学研究中能发挥哪些作用?
- 金士顿DT100 G3 PS2251-07海力士U盘量产修复成功教程
- 高速公路联网收费二义性路径识别系统原理及开发
- 如何去掉CSDN中图片的水印
- 海外社交媒体最佳图片尺寸
- 计算机英语次技术词汇,技术词汇-计算机英语
- linux实训报告内容一万字,Linux实训报告.doc
- JN5168的SPI使用
- [LiteratureReview]PointNet Deep Learning on Point Sets for 3D Classification and Segmentation
- 汽车网络和控制单元的安全威胁研究
- 【每日收藏】资深开发者的开发工具
- gif图片拆帧及合成[python]实现
热门文章
- 5g上行速率怎么提升_5G上行速率提升优化案例
- 手机端如何把图片传到php后台,android上传图片到PHP后台全过程
- 学生成绩管理系统(简易本地版)
- java byte char io流_Java基础进阶 IO流之字节流
- Java入门学习第十七天——字节流读写文件、字节缓冲流拷贝文件
- 刚做了一个梦,梦见自己错过了黄金十年
- 利用docxtpl库将excel里的数据向一个word模板里填充数据,并保存为一个word文档
- Ubuntu 安装软件到一半被中断的解决办法 - Linux
- 【边学边记_03】——参数化设计实现模块重用
- 供应商管理软件如何帮助企业提高盈利能力?