HISI_3516_vi

article/2025/11/8 12:39:10

主要的解释还是看这些大牛的,我这里只是想自己整理一遍:海思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

总的概述函数图:


http://chatgpt.dhexx.cn/article/PoVk5bhL.shtml

相关文章

hisi Camera 开发--HiMPP媒体处理软件开发基本概念

1. HIMPP平台架构简介 海思提供的媒体处理软件平台(Media Process Platform,简称 MPP),可支持应用软件快速开发。该平台对应用软件屏蔽了芯片相关的复杂的底层处理,并对应用软件直接提供 MPI(MPP Program Interface)接口完成相应功能。该平台支持应用软件快速开发以下功能:输入…

Hisiphp

最近有个项目要用到后台&#xff0c;就选用了hisiphp这个框架&#xff0c;框架使用的是thinkphp5.1。现在将里面的应用记录下来&#xff0c;为了以后方便使用。 1&#xff0c;首先要开启&#xff0c;系统-系统开发-开发模式 2&#xff0c;进入系统--系统扩展--模块管理--设计新…

海思芯片介绍

1.芯片介绍 芯片SOC里集成了众多控制芯片&#xff0c;比如负责深度学习的NNIE硬核&#xff0c;负责图像处理的IVE硬核&#xff0c;视频编解码单元H265/H264Codec&#xff0c;以及图像处理单元ISP等 为了减少用户对于硬件的直接操作&#xff0c;海思为用户封装了许多对于硬件的操…

hisi平台异常重启问题分析

Hisi平台开发之异常重启问题分析 目录 1. 问题描述...................................................................................................................... 3 2. 问题跟踪排查......................................................................…

【HISI系列】之开发板调试基本知识

1. HISI 根文件系统简介 Linux 的目录结构的最顶层是一个被称为“ / ”的根目录。系统加载 Linux 内核之后&#xff0c;就会挂载一个设备到根目录上。存在于这个设备中的文件系统被称为根文件系统。所有的系统命令、系统配置以及其他文件系统的挂载点都位于这个根文件系统中。 …

HTTP Digest接入方式鉴权认证流程

HTTP Digest接入方式鉴权认证流程 一、摘要认证原理 摘要认证与基础认证的工作原理很相似&#xff0c;用户先发出一个没有认证证书的请求&#xff0c;Web服务器回复一个带有WWW-Authenticate头的响应&#xff0c;指明访问所请求的资源需要证书。但是和基础认证发送以Base 64编…

C++ libcurl Digest Auth

C libcurl Digest Auth postman操作如下&#xff1a; 附认证原理如下&#xff1a; MD5 md5; string HA1 md5("username:realm:password"); string HA2 md5("method:uri"); string response md5("HA1:nouce:nc:cnonce:qop:HA2"); 这里…

mysql sql语句digest收集与展示

1.前言 mysql慢查询&#xff0c;已经有现成的成熟的方案收集展示了&#xff1a;pt-query-digest结合box公司的anemometer&#xff0c;没用过的移步&#xff1a;《mysql慢查询可视化》&#xff08;本章内容需要提前了解anemometer&#xff09;。 但DBA们一定还遇到过这样的问题…

HTTP Digest authentication

什么是摘要认证 摘要认证&#xff08; Digest authentication&#xff09;是一个简单的认证机制&#xff0c;最初是为HTTP协议开发的&#xff0c;因而也常叫做HTTP摘要&#xff0c;在RFC2617中描述。其身份验证机制很简单&#xff0c;它采用杂凑式&#xff08;hash&#xff09…

配置Apache Digest认证

Apache常见的用户认证可以分为下面三种&#xff1a; 基于IP&#xff0c;子网的访问控制(ACL)基本用户验证(Basic Authentication)消息摘要式身份验证(Digest Authentication) 消息摘要式身份验证(Digest Authentication) Digest Authentication在基本身份验证上面扩展了安全…

http Digest认证计算方法整理

摘要认证及实现HTTP digest authentication - 简书 HTTP Basic和Digest认证介绍与计算 - 诸子流 - 博客园 不要不知道上面说的URI是什么意思啊 图解HTTP 第 8 章 确认访问用户身份的认证 - 简书8.1 何为认证 为了弄清究竟是谁在访问服务器&#xff0c;就得让对方的客户端自报家…

业务维度digest日志的记录与监控方案

需求 ​   为了满足从业务整体的维度 实现监控和链路复原&#xff0c;我们希望对于一个业务接口&#xff0c;记录一行请求日志&#xff0c;并通过某个 Unique Id&#xff08;如UserId、OrderId&#xff09;将多行日志关联起来&#xff0c;最终产出一批和业务强相关的数据&am…

java发起Digest Auth请求

常规认证方式 上代码&#xff1a; 需要的Maven <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5</version></dependency><dependency><groupId>org.…

认证学习3 - Digest摘要认证讲解、代码实现、演示

文章目录 Digest摘要认证 - 密文讲解&#xff08;Digest摘要认证&#xff09;实现&#xff08;Digest认证&#xff09;代码&#xff08;Digest认证&#xff09;代码&#xff08;Digest认证-客户端&#xff09;演示&#xff08;Digest认证-postman&#xff09; 认证大全&#xf…

HTTP的认证方式之DIGEST 认证(摘要认证)

核心步骤&#xff1a; 步骤 1&#xff1a; 请求需认证的资源时&#xff0c;服务器会随着状态码 401Authorization Required&#xff0c;返回带WWW-Authenticate 首部字段的响应。该字段内包含质问响应方式认证所需的临时质询码&#xff08;随机数&#xff0c;nonce&#xff09;…

Digest Auth 摘要认证

Digest Auth 摘要认证 1.非常规方式 转载&#xff1a;https://blog.csdn.net/qq_25391785/article/details/86595529 public static void postMethod(String url, String query) {try {CredentialsProvider credsProvider new BasicCredentialsProvider();credsProvider.setC…

digest鉴权

“摘要”式认证&#xff08; Digest authentication&#xff09;是一个简单的认证机制&#xff0c;最初是为HTTP协议开发的&#xff0c;因而也常叫做HTTP摘要&#xff0c;在RFC2671中描述。其身份验证机制很简单&#xff0c;它采用杂凑式&#xff08;hash&#xff09;加密方法&…

消息摘要(Digest),数字签名(Signature),数字证书(Certificate)是什么?

1. 消息摘要&#xff08;Digest&#xff09; 1. 什么是消息摘要&#xff1f; 对一份数据&#xff0c;进行一个单向的 Hash 函数&#xff0c;生成一个固定长度的 Hash 值&#xff0c;这个值就是这份数据的摘要&#xff0c;也称为指纹。 2. 摘要算法 常见的摘要算法有 MD5、SHA…

HTTP通讯安全中的Digest摘要认证释义与实现

摘要 出于安全考虑&#xff0c;HTTP规范定义了几种认证方式以对访问者身份进行鉴权&#xff0c;最常见的认证方式之一是Digest认证 Digest认证简介 HTTP通讯采用人类可阅读的文本格式进行数据通讯&#xff0c;其内容非常容易被解读。出于安全考虑&#xff0c;HTTP规范定义了几…

http协议之digest(摘要)认证,详细讲解并附Java SpringBoot源码

目录 1.digest认证是什么&#xff1f; 2.digest认证过程 3.digest认证参数详解 4.基于SpringBoot实现digest认证 5.digest认证演示 6.digest认证完整项目 7.参考博客 1.digest认证是什么&#xff1f; HTTP通讯采用人类可阅读的文本格式进行数据通讯&#xff0c;其内容非…