MI HVP API


REVISION HISTORY

Revision No.
Description
Date
3.0
  • Initial release
  • 09/20/2022
    3.1
  • 修改通道源参数像素重复类型
  • 02/02/2023
    3.2
  • 新增通道源参数色域类型
  • 06/02/2023

    1. MI HVP概述


    1.1. 模块说明

    HVP(Highspeed Video Processor)模块为高速视频处理器单元,它可以对视频信号进行格式转换、画面裁剪、变化尺寸、帧率控制等处理。

    参考目前的硬件设计,“HDMI-RX”是HVP模块唯一的输入源。 HVP 输出 DISP 和 SCL 模块支持的视频格式,它使用 'MI_SYS' 的 'realtime' 模式来绑定其他模块。

    HVP模块的应用场景用在HDMI接口的显示设备上,实时检测输入的视频信号并将其转换为DISP/SCL模块支持的格式。


    1.2. 流程框图

    HVP模块是基于Pipeline模式的一种MI模块,内部是由MI_SYS提供工作线程驱动。

    HVP模块没有输入端口,当前设计仅支持1个通道以及1个输出端口,输出端口可以同时以Realtime的方式绑定SCL和DISP模块。


    1.3. 工作模式

    HVP内部有输入和输出2种Timing,根据不同的工作模式,会有不同的应用,HVP模块可根据应用场景的差异可配置三种不同的工作模式。

    HVP内部会有一个FIFO用于暂存Timing Input进来的数据,FIFO的深度可调,以图像的张数为单位,每张的内存大小由DmaColor格式和图像大小决定的,用户不需要关心内存的总大小,只需要设定张数。

    对应三种不同的视频处理流程框图如下所示:

    • Lock Out Mode

      该模式下HVP内部的DMA写由Video Input Timing驱动,读由Video Output Timing驱动,由于写和读由两种不同的timing驱动且互相不影响,那么就可以实现了帧率转换的功能,该模式下后级模块必须为DISP模块,可选择并联一路输出到SCL模块。Output Timing与DISP的屏驱共享Clock,共享同一个Vsync。

    • Ratio Mode

      Ratio Mode下HVP内部的DMA读和写的DMA只由Video Input Timing驱动,后级模块仅支持SCL,由于只有一个输入Timing驱动,因此不支持帧率转换功能。

    • FBL Mode

      FBL全称是Framebufferless,即不会申请DMA所用的内存也不会打开HVP内部的DMA模块,输入的Video Timing直接驱动HVP的后级模块,后级模块仅支持SCL,同Ratio Mode一样不支持帧率转换,另外不支持Timing输入Interlace的信号。


    1.4. 内部视频处理流程

    HVP内部的信号处理分为2个阶段,第一阶段进行输入讯号到WDMA之间的图像处理,内部讯号通过WDMA写入DRAM,第二阶段通过RDMA读取DRAM储存的图像数据进行第二阶段的图像处理。

    第一阶段图像处理流程(Video Processor Stage0):

    • 格式转换(RGB444, YUV422, YUV444)

    • 图像缩小

    第二阶段图像处理流程(Video Processor Stage1)包括:

    • YUV格式转换(仅支持YUV422转YUV444)

    • 图像放大和缩小

    • 隔行转逐行信号

    另外通过改变读写DMA的硬件属性,支持一定程度的图像处理

    • 8bit to 6bit图像内存压缩

    • 垂直镜像(Flip)

    • 水平镜像(Mirror)

    • 帧率转换(FRC)

    为了方便理解,在MI_HVP中与第一阶段图像处理流程相关的用户设定定义为Src端,相关的设定定义为“Src Parameter”。与之对应的,DMA读写部分、第二阶段处理流程,合并在一起定义为Dst端,相关设定定义为“Dst Parameter”。


    1.5. 内部延时

    HVP处于FBL Mode时,内部数字信号的延时是由硬件电路逻辑决定的,延时可忽略不计,除此之外,当处于Ratio和Lock Out模式时,DMA Buf为1张时处于低延时模式(Game Mode),当DMA Buf大于1张时,延时为写DMA的Timing的一个周期时间,具体延时的时间参考procfs中的字段:"DmaRead","Sw React"。


    1.6. Reset Event

    当HVP接入输入信号后发生了信号不稳定的情况,输入Timing的HTotal、VTotal等参数超过了某一个阈值,那么就会触发HVP的自动消隐功能。消隐会把输出端显示的内容全部替换成某种颜色(一般为黑色),硬件能够保证自动消隐触发的实时性,因而可以保证当信号不稳定时只会发生闪屏而不会在屏幕上看到脏数据。当硬件的自动消隐产生后,会触发中断,HVP内部再把中断事件转发到用户层,命名为"Reset Event",在HVP的用户层会有一套API来接收和响应"Reset Event"。

    自动消隐产生后会使能消隐功能触发中断,且在已经使能消隐的状态下不会重发。用户层需要有一个独立的后台用于侦听“Reset Event”,当输入信号重新恢复稳定后,需要用户做ClearEvent的动作。

    后台处理流程中需要轮询检测信号是否稳定(参考API:MI_HVP_GetSourceSignalStatus)或是否发生变化(参考API:MI_HVP_GetSourceSignalTiming)。为了能够及时收到“Reset Event”,提供了API:MI_HVP_GetResetEventFd,以及:MI_HVP_CloseResetEventFd,用户可以通过前者拿到文件描述符,并通过系统调用 “select” 函数及时地响应“Reset Event” 的中断信号,当中断发生后通过API:MI_HVP_GetResetEvent获取到当前是否是 “ResetEvent”触发状态。

    输入信号的变化检测有两种情况,其一是“ResetEvent” 触发,其二是通过前后2次轮询,检查到输入的ColorFormat、ColorDepth发生变化(通过HDMIRX提供的接口获取,这种变化不会触发“ResetEvent” ),用户层检测到变化,并且新的信号稳定后,通过HDMIRX模块提供的接口获取当前稳定Timing的ColorFormat/ColorDepth/enPixRepType等讯息,并通过调用API:MI_HVP_GetChannelParamMI_HVP_SetChannelParam改变其SrcParam中所对应的设定,当一切设定改变完成后,调用API:MI_HVP_ClearResetEvent

    以上流程请参考流程图:

    参考代码请看APIMI_HVP_GetResetEventFd中的举例。


    1.7. 关键字说明

    • FRC

      帧率控制

    • WDMA

      DRAM存储器写单元

    • RDMA

      DRAM存储器读单元


    2. MI API 参考

    API名 功能
    MI_HVP_CreateDevice 初始化设备
    MI_HVP_DestroyDevice 去初始化设备
    MI_HVP_GetSourceSignalStatus 获取数据源信号稳定状态
    MI_HVP_GetSourceSignalTiming 获取数据源信号Timing
    MI_HVP_GetResetEventFd 获取reset事件Fd
    MI_HVP_CloseResetEventFd 关闭reset事件Fd
    MI_HVP_GetResetEvent 获取reset事件
    MI_HVP_ClearResetEvent 清除reset中断标志
    MI_HVP_CreateChannel 初始化设备通道
    MI_HVP_DestroyChannel 去初始化设备通道
    MI_HVP_StartChannel 启动设备通道传输
    MI_HVP_StopChannel 停止设备通道传输
    MI_HVP_SetChannelParam 设置设备通道参数
    MI_HVP_GetChannelParam 获取设备通道参数
    MI_HVP_SetVideoMute 设置图像消隐

    2.1. MI_HVP_CreateDevice

    • 功能

      初始化HVP设备,根据设备参数可以选择数据源。

    • 语法

      MI_S32 MI_HVP_CreateDevice(MI_HVP_DEV devId, const MI_HVP_DeviceAttr_t *pstDevAttr);
      
    • 形参

      参数类型 参数名称 参数含义 输入/输出
      MI_HVP_DEV devId HVP设备的device id 输入
      MI_HVP_DeviceAttr_t pstDevAttr HVP的设备属性 输入
    • 返回值

      • MI_SUCCESS:成功

      • MI_ERR_HVP_INVALID_DEVID:非法的设备id

      • MI_ERR_HVP_BUSY:设备已经创建,或者注册MI设备失败

      • MI_ERR_HVP_ILLEGAL_PARAM:非法的输入参数

    • 依赖

      • 头文件:mi_sys.h、mi_hvp.h

      • 库文件:无

    • 注意

      • HVP目前仅支持devId = 0。
      • 目前仅支持E_MI_HVP_SRC_TYPE_HDMI。
    • 举例

      void CreateDestroyHvp(void)
      {
          MI_HVP_DeviceAttr_t stDevAttr;
          MI_HVP_DEV devId = 0;
          MI_S32 s32Ret = 0;
      
          memset(&stDevAttr, 0, sizeof(MI_HVP_DeviceAttr_t));
          stDevAttr.enSrcType = E_MI_HVP_SRC_TYPE_HDMI;
          s32Ret = MI_HVP_CreateDevice(devId, &stDevAttr);
          if (MI_SUCCESS != s32Ret)
          {
              return;
          }
      
          MI_HVP_DestroyDevice(devId);
      }
      
    • 相关主题

      MI_HVP_DestroyDevice


    2.2. MI_HVP_DestroyDevice

    • 功能

      反初始化HVP设备。

    • 语法

      MI_S32 MI_HVP_DestroyDevice(MI_HVP_DEV devId);
      
    • 形参

      参数类型 参数名称 参数含义 输入/输出
      MI_HVP_DEV devId 设备id 输入
    • 返回值

      • MI_SUCCESS:成功。

      • 非MI_SUCCESS:失败,参照返回值

    • 依赖

      • 头文件:mi_sys.h、mi_hvp.h

      • 库文件:无

    • 注意

      • 调用前Device必须先创建,否正会报错。
      • 在HVP设备上的通道已经创建的情况下去销毁HVP设备,则HVP的通道也会在内部销毁。
    • 举例

      参见MI_HVP_CreateDevice举例。

    • 相关主题

      MI_HVP_CreateDevice


    2.3. MI_HVP_GetSourceSignalStatus

    • 功能

      获取数据源信号稳定状态。

    • 语法

      MI_S32 MI_HVP_GetSourceSignalStatus(MI_HVP_DEV devId, MI_HVP_SignalStatus_e *penSignalStatus);
      
    • 形参

      参数类型 参数名称 参数含义 输入/输出
      MI_HVP_DEV devId 设备id 输入
      MI_HVP_SignalStatus_e penSignalStatus 输入信号状态 输出
    • 返回值

      • MI_SUCCESS:成功。

      • 非MI_SUCCESS:失败,参照返回值

    • 依赖

      • 头文件:mi_sys.h、mi_hvp.h

      • 库文件:无

    • 注意

      • 调用前Device必须先创建。
    • 举例

      void SampleHvp(void)
      {
          MI_HVP_DeviceAttr_t stDevAttr;
          MI_HVP_DEV devId = 0;
          MI_HVP_SignalStatus_e enSignalStatus;
          MI_HVP_SignalTiming_t stSrcTiming;
          MI_S32 s32Ret = 0;
      
          memset(&stDevAttr, 0, sizeof(MI_HVP_DeviceAttr_t));
          stDevAttr.enSrcType = E_MI_HVP_SRC_TYPE_HDMI;
          s32Ret = MI_HVP_CreateDevice(devId, &stDevAttr);
          if (MI_SUCCESS != s32Ret)
          {
              return;
          }
      
          s32Ret = MI_HVP_GetSourceSignalStatus(devId, &enSignalStatus);
          if (MI_SUCCESS != s32Ret)
          {
              return;
          }
          printf("SignalStatus:%d\n", enSignalStatus);
      
          memset(&stSrcTiming, 0x0, sizeof(MI_HVP_SignalTiming_t));
          s32Ret = MI_HVP_GetSourceSignalTiming(devId, &stSrcTiming);
          if (MI_SUCCESS != s32Ret)
          {
              return;
          }
          printf("stSrcTiming.bInterlace:%d\n", stSrcTiming.bInterlace);
          printf("stSrcTiming.u16Fpsx100:%d\n", stSrcTiming.u16Fpsx100);
          printf("stSrcTiming.u16Height:%d\n", stSrcTiming.u16Height);
          printf("stSrcTiming.u16Width:%d\n", stSrcTiming.u16Width);
      
          MI_HVP_DestroyDevice(devId);
      }
      
    • 相关主题

      NA


    2.4. MI_HVP_GetSourceSignalTiming

    • 功能

      获取数据源信号Timing。

    • 语法

      MI_S32 MI_HVP_GetSourceSignalTiming(MI_HVP_DEV devId, MI_HVP_SignalTiming_t *pstSrcTiming);
      
    • 形参

      参数类型 参数名称 参数含义 输入/输出
      MI_HVP_DEV devId 设备id 输入
      MI_HVP_SignalTiming_t pstSrcTiming 输入信号Timing 输出
    • 返回值

      • MI_SUCCESS:成功。

      • 非MI_SUCCESS:失败,参照返回值

    • 依赖

      • 头文件:mi_sys.h、mi_hvp.h

      • 库文件:无

    • 注意

      • 调用前Device必须先创建。
      • 若当前信号源不稳定,则返回的信号timing值都为0。
    • 举例

      参见MI_HVP_GetSourceSignalStatus举例。

    • 相关主题

      NA


    2.5. MI_HVP_GetResetEventFd

    • 功能

      获取Reset Event的文件描述符,请参阅Reset Event

    • 语法

      MI_S32 MI_HVP_GetResetEventFd(MI_HVP_DEV devId, MI_S32 *p32Fd);
      
    • 形参

      参数类型 参数名称 参数含义 输入/输出
      MI_HVP_DEV devId 设备id 输入
      MI_S32 p32Fd 指向Fd的指针 输出
    • 返回值

      • MI_SUCCESS:成功。

      • 非MI_SUCCESS:失败,参照返回值

    • 依赖

      • 头文件:mi_sys.h、mi_hvp.h

      • 库文件:无

    • 注意

      • 设备必须已经创建。
    • 举例

      #define SIGNAL_MONITOR_COLOR_FORMAT_HDMI_2_HVP(__hvp, __hdmirx) \
          do                                                          \
          {                                                           \
              switch (__hdmirx)                                       \
              {                                                       \
                  case E_MI_HDMIRX_PIXEL_FORMAT_RGB:                  \
                      __hvp = E_MI_HVP_COLOR_FORMAT_RGB444;           \
                      break;                                          \
                  case E_MI_HDMIRX_PIXEL_FORMAT_YUV444:               \
                      __hvp = E_MI_HVP_COLOR_FORMAT_YUV444;           \
                      break;                                          \
                  case E_MI_HDMIRX_PIXEL_FORMAT_YUV422:               \
                      __hvp = E_MI_HVP_COLOR_FORMAT_YUV422;           \
                      break;                                          \
                  case E_MI_HDMIRX_PIXEL_FORMAT_YUV420:               \
                      __hvp = E_MI_HVP_COLOR_FORMAT_YUV420;           \
                      break;                                          \
                  default:                                            \
                      __hvp = E_MI_HVP_COLOR_FORMAT_MAX;              \
                      break;                                          \
              }                                                       \
          } while(0)
      #define SIGNAL_MONITOR_COLOR_DEPTH_HDMI_2_HVP(__hvp, __hdmirx) \
      do                                                             \
          {                                                          \
              switch (__hdmirx)                                      \
              {                                                      \
                  case E_MI_HDMIRX_PIXEL_BITWIDTH_8BIT:              \
                      __hvp = E_MI_HVP_COLOR_DEPTH_8;                \
                      break;                                         \
                  case E_MI_HDMIRX_PIXEL_BITWIDTH_10BIT:             \
                      __hvp = E_MI_HVP_COLOR_DEPTH_10;               \
                      break;                                         \
                  case E_MI_HDMIRX_PIXEL_BITWIDTH_12BIT:             \
                      __hvp = E_MI_HVP_COLOR_DEPTH_12;               \
                      break;                                         \
                  default:                                           \
                      __hvp = E_MI_HVP_COLOR_DEPTH_MAX;              \
                      break;                                         \
              }                                                      \
          } while(0)
      #define SIGNAL_MONITOR_PIXEX_REPETITIVE_HDMI_2_HVP(__hvp, __hdmirx)      \
      do                                                                       \
          {                                                                    \
              switch (__hdmirx)                                                \
              {                                                                \
                  case E_MI_HDMIRX_OVERSAMPLE_1X:                              \
                      __hvp = E_MI_HVP_PIX_REP_TYPE_1X;                        \
                      break;                                                   \
                  case E_MI_HDMIRX_OVERSAMPLE_2X:                              \
                      __hvp = E_MI_HVP_PIX_REP_TYPE_2X;                        \
                      break;                                                   \
                  case E_MI_HDMIRX_OVERSAMPLE_3X:                              \
                      __hvp = E_MI_HVP_PIX_REP_TYPE_3X;                        \
                      break;                                                   \
                  case E_MI_HDMIRX_OVERSAMPLE_4X:                              \
                      __hvp = E_MI_HVP_PIX_REP_TYPE_4X;                        \
                      break;                                                   \
                  default:                                                     \
                      __hvp = E_MI_HVP_PIX_REP_TYPE_MAX;                       \
                      break;                                                   \
              }                                                                \
          } while(0)
      #define SIGNAL_MONITOR_COLOR_RANGE_TYPE_HDMI_2_HVP(__hvp, __hdmirx) \
      do                                                                  \
          {                                                               \
              switch (__hdmirx)                                           \
              {                                                           \
                  case E_MI_HDMIRX_QUANTIZATION_DEFAULT:                  \
                      __hvp = E_MI_HVP_COLOR_RANGE_TYPE_FULL;             \
                      break;                                              \
                  case E_MI_HDMIRX_QUANTIZATION_LIMIT_RANGE:              \
                      __hvp = E_MI_HVP_COLOR_RANGE_TYPE_LIMIT;            \
                      break;                                              \
                  case E_MI_HDMIRX_QUANTIZATION_FULL_RANGE:               \
                      __hvp = E_MI_HVP_COLOR_RANGE_TYPE_FULL;             \
                      break;                                              \
                  default:                                                \
                      __hvp = E_MI_HVP_COLOR_RANGE_TYPE_MAX;              \
                      break;                                              \
              }                                                           \
          } while (0)
      static int signal_monitor_sync_hdmi_paramter_2_hvp(const MI_HDMIRX_TimingInfo_t *pstTimingInfo)
      {
          MI_S32 ret = 0;
          MI_HVP_ChannelParam_t stChnParam;
          MI_HVP_DEV dev = 0;
          MI_HVP_CHN chn = 0;
      
          memset(&stChnParam, 0, sizeof(MI_HVP_ChannelParam_t));
          ret = MI_HVP_GetChannelParam(dev, chn, &stChnParam);
          if (ret != MI_SUCCESS)
          {
              printf("Get HVP Param error! Dev %d Chn %d\n", dev, chn);
              return -1;
          }
          SIGNAL_MONITOR_PIXEX_REPETITIVE_HDMI_2_HVP(stChnParam.stChnSrcParam.enPixRepType, stTimingInfo.eOverSample);
          SIGNAL_MONITOR_COLOR_FORMAT_HDMI_2_HVP(stChnParam.stChnSrcParam.enInputColor, pstTimingInfo->ePixelFmt);
          SIGNAL_MONITOR_COLOR_DEPTH_HDMI_2_HVP(stChnParam.stChnSrcParam.enColorDepth, pstTimingInfo->eBitWidth);
          SIGNAL_MONITOR_COLOR_RANGE_TYPE_HDMI_2_HVP(stChnParam.stChnSrcParam.enColorRange, pstTimingInfo->eQuantRange);
          ret = MI_HVP_SetChannelParam(dev, chn, &stChnParam);
          if (ret != MI_SUCCESS)
          {
              printf("Set HVP param error! Dev %d Chn %d\n", dev, chn);
              return -1;
          }
          return 0;
      }
      static void signal_monitor_hdmi(void)
      {
          int select_ret = 0;
          MI_HVP_DEV dev = 0;
          MI_S32 ret = 0;
          MI_S32 s32Fd = -1;
          MI_BOOL bTrigger;
          fd_set read_fds;
          struct timeval tv;
          MI_HDMIRX_PortId_e port_id = E_MI_HDMIRX_PORT0;
          MI_HDMIRX_SigStatus_e cur_signal_status_hdmirx = E_MI_HDMIRX_SIG_NO_SIGNAL;
          MI_HVP_SignalStatus_e cur_signal_status = E_MI_HVP_SIGNAL_UNSTABLE;
          MI_HVP_SignalTiming_t cur_signal_timing = {0, 0, 0, 0};
          MI_HDMIRX_TimingInfo_t cur_hdmirx_timing_info;
          static MI_HVP_SignalTiming_t last_signal_timing = {0, 0, 0, 0};
          static MI_HDMIRX_TimingInfo_t last_hdmirx_timing_info;
      
          ret = MI_HVP_GetResetEventFd(dev, &s32Fd);
          if (ret != MI_SUCCESS)
          {
              printf("Get Reset fd Errr, Hvp Dev%d!\n", dev);
              return;
          }
          FD_ZERO(&read_fds);
          FD_SET(s32Fd, &read_fds);
          tv.tv_sec = 0;
          tv.tv_usec = 100 * 1000;
          select_ret = select(s32Fd + 1, &read_fds, NULL, NULL, &tv);
          if (select_ret < 0)
          {
              printf("Reset fd select error!!\n");
              goto EXIT_FD;
          }
          ret = MI_HVP_GetResetEvent(dev, &bTrigger);
          if (ret != MI_SUCCESS)
          {
              printf("Get Reset cnt Errr, Hvp Dev%d!\n", dev);
              goto EXIT_FD;
          }
          ret = MI_HDMIRX_GetSignalStatus(port_id, &cur_signal_status_hdmirx);
          if (ret != MI_SUCCESS)
          {
              printf("Get hdmirx Signal Status Errr, port_id %d!\n", port_id);
              goto EXIT_RST_CNT;
          }
          ret = MI_HVP_GetSourceSignalStatus(dev, &cur_signal_status);
          if (ret != MI_SUCCESS)
          {
              printf("Get Signal Status Errr, Hvp Dev%d!\n", dev);
              goto EXIT_RST_CNT;
          }
          ret = MI_HVP_GetSourceSignalTiming(dev, &cur_signal_timing);
          if (ret != MI_SUCCESS)
          {
              printf("Get Signal Timing Errr, Hvp Dev%d!\n", dev);
              goto EXIT_RST_CNT;
          }
          ret = MI_HDMIRX_GetTimingInfo(port_id, &cur_hdmirx_timing_info);
          if (ret != MI_SUCCESS)
          {
              printf("Get Hdmirx Timing error!\n");
              goto EXIT_RST_CNT;
          }
          if (cur_signal_timing.u16Width != last_signal_timing.u16Width
              || cur_signal_timing.u16Height!= last_signal_timing.u16Height
              || cur_signal_timing.bInterlace!= last_signal_timing.bInterlace
              || cur_hdmirx_timing_info.eOverSample != last_hdmirx_timing_info.eOverSample
              || cur_hdmirx_timing_info.ePixelFmt != last_hdmirx_timing_info.ePixelFmt
              || cur_hdmirx_timing_info.eBitWidth != last_hdmirx_timing_info.eBitWidth)
          {
              printf("Get Signal St W: %d H: %d, Fps: %d bInterlace: %d OverSample: %d HdmirxFmt: %d BitWidth: %d\n",
                     cur_signal_timing.u16Width, cur_signal_timing.u16Height,
                     cur_signal_timing.u16Fpsx100, (int)cur_signal_timing.bInterlace,
                     cur_hdmirx_timing_info.eOverSample, cur_hdmirx_timing_info.ePixelFmt,
                     cur_hdmirx_timing_info.eBitWidth);
              if (cur_signal_status_hdmirx == E_MI_HDMIRX_SIG_SUPPORT && cur_signal_status == E_MI_HVP_SIGNAL_STABLE)
              {
                  printf("Signal stable.\n");
              }
              else
              {
                  printf("Signal unstable.\n");
              }
              signal_monitor_sync_hdmi_paramter_2_hvp(&cur_hdmirx_timing_info);
              last_signal_timing = cur_signal_timing;
              last_hdmirx_timing_info = cur_hdmirx_timing_info;
          }
      EXIT_RST_CNT:
          if (bTrigger)
          {
              printf("Get reset event!!\n");
              MI_HVP_ClearResetEvent(dev);
          }
      EXIT_FD:
          MI_HVP_CloseResetEventFd(dev, s32Fd);
      }
      static int is_exit = 0;
      int do_main(void)
      {
          while (!is_exit)
          {
              signal_monitor_hdmi();
          }
          return 0;
      }
      
    • 相关主题

      MI_HVP_CloseResetEventFd


    2.6. MI_HVP_CloseResetEventFd

    • 功能

      关闭Reset Event的文件描述符,请参阅Reset Event

    • 语法

      MI_S32 MI_HVP_CloseResetEventFd(MI_HVP_DEV devId, MI_S32 s32Fd);
      
    • 形参

      参数类型 参数名称 参数含义 输入/输出
      MI_HVP_DEV devId 设备id 输入
      MI_S32 s32Fd 文件描述符Fd 输入
    • 返回值

      • MI_SUCCESS:成功。

      • 非MI_SUCCESS:失败,参照返回值

    • 依赖

      • 头文件:mi_sys.h、mi_hvp.h

      • 库文件:无

    • 注意

      • 设备必须已经创建。
    • 举例

      参见MI_HVP_GetResetEventFd举例。

    • 相关主题

      MI_HVP_GetResetEventFd


    2.7. MI_HVP_GetResetEvent

    • 功能

      获取Reset Event的触发状态,若pbTrigger指向的值为TRUE,那么表示曾经有发生过硬件自动消隐中断,并且未使用接口MI_HVP_ClearResetEvent清除Reset Event。

      请参阅Reset Event

    • 语法

      MI_S32 MI_HVP_GetResetEvent(MI_HVP_DEV devId, MI_BOOL *pbTrigger);
      
    • 形参

      参数类型 参数名称 参数含义 输入/输出
      MI_HVP_DEV devId 设备id 输入
      MI_BOOL * pbTrigger 指向是否有reset中断的指针 输出
    • 返回值

      • MI_SUCCESS:成功。

      • 非MI_SUCCESS:失败,参照返回值

    • 依赖

      • 头文件:mi_sys.h、mi_hvp.h

      • 库文件:无

    • 注意

      • 设备必须已经创建。
    • 举例

      参见MI_HVP_GetResetEventFd举例。

    • 相关主题

      MI_HVP_ClearResetEvent


    2.8. MI_HVP_ClearResetEvent

    • 功能

      清除Reset Event的中断标志,请参阅Reset Event

    • 语法

      MI_S32 MI_HVP_ClearResetEvent(MI_HVP_DEV devId);
      
    • 形参

      参数类型 参数名称 参数含义 输入/输出
      MI_HVP_DEV devId 设备id 输入
    • 返回值

      • MI_SUCCESS:成功。

      • 非MI_SUCCESS:失败,参照返回值

    • 依赖

      • 头文件:mi_sys.h、mi_hvp.h

      • 库文件:无

    • 注意

    • 举例

      参见MI_HVP_GetResetEventFd举例。

    • 相关主题

      MI_HVP_GetResetEvent


    2.9. MI_HVP_CreateChannel

    • 功能

      初始化设备通道。

    • 语法

      MI_S32 MI_HVP_CreateChannel(MI_HVP_DEV devId, MI_HVP_CHN chnId, const MI_HVP_ChannelAttr_t *pstChnAttr);
      
    • 形参

      参数类型 参数名称 参数含义 输入/输出
      MI_HVP_DEV devId 设备id 输入
      MI_HVP_CHN chnId 通道id 输入
      MI_HVP_ChannelAttr_t pstChnAttr 通道属性 输入
    • 返回值

      • MI_SUCCESS:成功。

      • 非MI_SUCCESS:失败,参照返回值

    • 依赖

      • 头文件:mi_sys.h、mi_hvp.h

      • 库文件:无

    • 注意

      • 设备必须已经创建。
      • HVP目前仅支持chnId = 0,Chn不能重复创建,否则会报错。
      • 通道属性设定中(MI_HVP_FrcMode_e)即工作模式的设定,请参考章节1.3的说明。
      • 当工作模式处于“FBL模式”时需要使能(MI_HVP_FrcFblModeConfig_t)。
      • 当工作模式处于“Ratio模式”和“Lock Out模式”时,需要使能DMA,并设定DMA读写的Buffer(PqBuf),对应的配置的参数类型是(MI_HVP_PqBufModeConfig_t)。
      • "Lock Out"模式下,MI_HVP_PqBufModeConfig_t 中的参数u16BufMaxWidth、u16BufMaxHeight建议设定与显示的Timing宽高相等,若小于显示的Timing,则显示的Disp Window的宽高无法占满整个显示的区域。
      • "Lock Out"模式下,若显示的Timing会动态改变(例如DISP BT656动态切输出Timing),且MI_HVP_PqBufModeConfig_t 中参数u16BufMaxWidth、u16BufMaxHeigh 的设定宽高为可能的最大Timing的大小,则无需再根据当前的Timing大小重新销毁创建HVP的通道,但需要通过接口MI_HVP_SetChannelParam去改变HVP的输出大小和Disp Window的大小。
      • "Lock Out"模式下,Pq Buf的最小个数取决于输入和输出Timing Fps之比,逐行扫描输入时,PqBufMin=Alignment( InputFps / OutputFps) + 1。其中Alignment表示向上整数对齐,隔行扫描输入时,PqBufMin=Alignment( InputFps*2 / OutputFps ) + 1,如输入1080p24Fps输出1080p60Fps,则最小Pq Buf为 Aligment(24 / 60) + 1 =2。
      • "Ratio"模式和"Lock Out"模式时,PqBuf设定为1,这种情况为低延迟模式,不支持隔行输入。
    • 举例

      void SampleHvp1(void)
      {
          MI_HVP_DeviceAttr_t stDevAttr;
          MI_HVP_DEV devId = 0;
          MI_HVP_CHN chnId = 0;
          MI_HVP_ChannelAttr_t stChnAttr;
          MI_HVP_ChannelParam_t stChnParam;
          MI_S32 s32Ret = 0;
      
          memset(&stDevAttr, 0, sizeof(MI_HVP_DeviceAttr_t));
          stDevAttr.enSrcType = E_MI_HVP_SRC_TYPE_HDMI;
          s32Ret = MI_HVP_CreateDevice(devId, &stDevAttr);
          if (MI_SUCCESS != s32Ret)
          {
              return;
          }
      
          memset(&stChnAttr, 0x0, sizeof(MI_HVP_ChannelAttr_t))
          stChnAttr.enFrcMode = E_MI_HVP_FRC_MODE_LOCK_OUT;
          if (stChnAttr.enFrcMode == E_MI_HVP_FRC_MODE_RATIO
              || stChnAttr.enFrcMode == E_MI_HVP_FRC_MODE_LOCK_OUT)
          {
              stChnAttr.stPqBufModeConfig.eDmaColor = E_MI_HVP_COLOR_FORMAT_YUV444;
              stChnAttr.stPqBufModeConfig.u16BufMaxCount = 10;
              stChnAttr.stPqBufModeConfig.u16BufMaxWidth = 1920;
              stChnAttr.stPqBufModeConfig.u16BufMaxHeight = 1080;
              stChnAttr.stPqBufModeConfig.eBufCompressMode = E_MI_SYS_COMPRESS_MODE_NONE;
              stChnAttr.stPqBufModeConfig.eFieldType = E_MI_SYS_FIELDTYPE_NONE;
          }
          s32Ret = MI_HVP_CreateChannel(devId, chnId, &stChnAttr);
          if (MI_SUCCESS != s32Ret)
          {
              return;
          }
      
          memset(&stChnParam, 0x0, sizeof(MI_HVP_ChannelParam_t));
          stChnParam.stChnSrcParam.enPixRepType = E_MI_HVP_PIX_REP_TYPE_1X;
          stChnParam.stChnSrcParam.enInputColor = E_MI_HVP_COLOR_FORMAT_RGB444;
          stChnParam.stChnSrcParam.enColorDepth = E_MI_HVP_COLOR_DEPTH_8;
          stChnParam.stChnSrcParam.enColorRange = E_MI_HVP_COLOR_RANGE_TYPE_FULL;
          stChnParam.stChnSrcParam.stCropWin.u16X = 0;
          stChnParam.stChnSrcParam.stCropWin.u16Y = 0;
          stChnParam.stChnSrcParam.stCropWin.u16Width = 1920;
          stChnParam.stChnSrcParam.stCropWin.u16Height = 1080;
      
          stChnParam.stChnDstParam.bFlip = 0;
          stChnParam.stChnDstParam.bMirror = 0;
          stChnParam.stChnDstParam.enColor = E_MI_HVP_COLOR_FORMAT_YUV444;
          stChnParam.stChnDstParam.u16Fpsx100 = 60;
          stChnParam.stChnDstParam.u16Width = 1920;
          stChnParam.stChnDstParam.u16Height = 1080;
          stChnParam.stChnDstParam.stDispWin.u16X = 0;
          stChnParam.stChnDstParam.stDispWin.u16Y = 0;
          stChnParam.stChnDstParam.stDispWin.u16Width = 1920;
          stChnParam.stChnDstParam.stDispWin.u16Height = 1080;
          stChnParam.stChnDstParam.stCropWin.u16X = 0;
          stChnParam.stChnDstParam.stCropWin.u16Y = 0;
          stChnParam.stChnDstParam.stCropWin.u16Width = 1920;
          stChnParam.stChnDstParam.stCropWin.u16Height = 1080;
          s32Ret = MI_HVP_SetChannelParam(devId, chnId, &stChnParam);
          if (MI_SUCCESS != s32Ret)
          {
              return;
          }
      
          memset(&stChnParam, 0x0, sizeof(MI_HVP_ChannelParam_t));
          s32Ret = MI_HVP_GetChannelParam(devId, chnId, &stChnParam);
          if (MI_SUCCESS != s32Ret)
          {
              return;
          }
          printf("stChnParam.xxx=xxx\n");
      
          s32Ret = MI_HVP_StartChannel(devId, chnId);
          if (MI_SUCCESS != s32Ret)
          {
              return;
          }
      
          /* To do things */
      
          MI_HVP_StopChannel(devId, chnId);
      
          MI_HVP_DestroyChannel(devId, chnId);
      
          MI_HVP_DestroyDevice(devId);
      }
      
    • 相关主题

      MI_HVP_DestroyChannel


    2.10. MI_HVP_DestroyChannel

    • 功能

      去初始化设备通道。

    • 语法

      MI_S32 MI_HVP_DestroyChannel(MI_HVP_DEV devId, MI_HVP_CHN chnId);
      
    • 形参

      参数类型 参数名称 参数含义 输入/输出
      MI_HVP_DEV devId 设备id 输入
      MI_HVP_CHN chnId 通道id 输入
    • 返回值

      • MI_SUCCESS:成功。

      • 非MI_SUCCESS:失败,参照返回值

    • 依赖

      • 头文件:mi_sys.h、mi_hvp.h

      • 库文件:无

    • 注意

      • 设备和通道必须已经创建。
    • 举例

      参见MI_HVP_CreateChannel举例。

    • 相关主题

      MI_HVP_CreateChannel


    2.11. MI_HVP_StartChannel

    • 功能

      启动设备通道传输。

    • 语法

      MI_S32 MI_HVP_StartChannel(MI_HVP_DEV devId, MI_HVP_CHN chnId);
      
    • 形参

      参数类型 参数名称 参数含义 输入/输出
      MI_HVP_DEV devId 设备id 输入
      MI_HVP_CHN chnId 通道id 输入
    • 返回值

      • MI_SUCCESS:成功。

      • 非MI_SUCCESS:失败,参照返回值

    • 依赖

      • 头文件:mi_sys.h、mi_hvp.h

      • 库文件:无

    • 注意

      • 设备和通道必须已经创建,Chn不能重复Start,否则会报错。
    • 举例

      参见MI_HVP_CreateChannel举例。

    • 相关主题

      MI_HVP_StopChannel


    2.12. MI_HVP_StopChannel

    • 功能

      停止设备通道传输。

    • 语法

      MI_S32 MI_HVP_StopChannel(MI_HVP_DEV devId, MI_HVP_CHN chnId);
      
    • 形参

      参数类型 参数名称 参数含义 输入/输出
      MI_HVP_DEV devId 设备id 输入
      MI_HVP_CHN chnId 通道id 输入
    • 返回值

      • MI_SUCCESS:成功。

      • 非MI_SUCCESS:失败,参照返回值

    • 依赖

      • 头文件:mi_sys.h、mi_hvp.h

      • 库文件:无

    • 注意

      • 设备和通道必须已经创建,Chn不能重复Stop,否则会报错。
    • 举例

      参见MI_HVP_CreateChannel举例。

    • 相关主题

      MI_HVP_StartChannel


    2.13. MI_HVP_SetChannelParam

    • 功能

      设置设备通道参数。

    • 语法

      MI_S32 MI_HVP_SetChannelParam(MI_HVP_DEV devId, MI_HVP_CHN chnId, const MI_HVP_ChannelParam_t *pstChnParam);
      
    • 形参

      参数类型 参数名称 参数含义 输入/输出
      MI_HVP_DEV devId 设备id 输入
      MI_HVP_CHN chnId 通道id 输入
      MI_HVP_ChannelParam_t pstChnParam 通道参数 输入
    • 返回值

      • MI_SUCCESS:成功。

      • 非MI_SUCCESS:失败,参照返回值

    • 依赖

      • 头文件:mi_sys.h、mi_hvp.h

      • 库文件:无

    • 注意

      • 设备和通道必须已经创建。

      • 除第一次设定,建议先调用(MI_HVP_GetChannelParam)获取到通道参数信息后,再此基础上修改想要改变的值。

      • 通道正在传输且信号稳定时,调用此接口必须保证已经设定了图像消隐,消隐相关接口(MI_HVP_SetVideoMute),否则有可能会看到通道参数改变造成的花屏现象。

      • 通道设定完成后可以立即调用接口(MI_HVP_SetVideoMute)解消隐。

      • 与Video裁剪放大相关的设定按照硬件处理的流水线顺序划分为SrcCrop->Scaling->DstCrop->DispWindow,其中包含(MI_HVP_SrcParam_t)中的stSrcCrop参数,(MI_HVP_DstParam_t)中的(u16Width,u16Heigh)、DstCrop参数、stDsipWin参数设定。

      • 如果SrcCrop后的图像大于Scaling后的图像,则Scaling做Scaling down,反之则做Scaling Up。

      • 下图为整个图像处理的流水线,分为只放大和只缩小两种:

      • 还有一种情况上图未列出来,SrcCrop之后的图H和V方向可能一个做放大一个做缩小,那么在SrcCrop之后会先做一个方向做缩小后再进PqBuf Fifo,从Fifo中出来后在另外一个方向做放大。

      • 上图中HVP经过Scaling后就会把图像送给SCL,DstCrop功能和DispWin显示功能只会作用于Disp显示的Timing上。

      • 若工作模式为“FBL Mode”,则没有PqBuf Fifo。

      • 设定MI_HVP_DstParam_t时,需要根据当前的工作模式遵循一定的规则:

        FBL Mode:

        DmaColor DstColor
        NA E_MI_HVP_COLOR_FORMAT_YUV444
        参数 使用限制
        bMirror 不支持
        bFlip 不支持
        enColorRange 支持
        stDispWin 不支持
        stCropWin 不支持
        u16Width,u16Heigh 不能大于输入Timing的宽高,2 pixel对齐

        Ratio Mode:

        DmaColor DstColor
        E_MI_HVP_COLOR_FORMAT_YUV444 E_MI_HVP_COLOR_FORMAT_YUV444
        参数 使用限制
        bMirror 支持
        bFlip 不支持
        enColorRange 支持
        stDispWin 不支持
        stCropWin 不支持
        u16Width,u16Heigh 不能大于输入Timing的宽高和MI_HVP_PqBufModeConfig_t中的宽高,2 pixel对齐

        Lock Out Mode (Output Disp Only):

        DmaColor DstColor
        E_MI_HVP_COLOR_FORMAT_RGB444 E_MI_HVP_COLOR_FORMAT_RGB444
        E_MI_HVP_COLOR_FORMAT_YUV444 E_MI_HVP_COLOR_FORMAT_YUV444
        E_MI_HVP_COLOR_FORMAT_YUV422 E_MI_HVP_COLOR_FORMAT_YUV422
        E_MI_HVP_COLOR_FORMAT_YUV422 E_MI_HVP_COLOR_FORMAT_YUV444
        参数 使用限制
        bMirror 支持
        bFlip 支持
        enColorRange 支持
        stDispWin 支持,2 pixel对齐
        stCropWin 其中x,y位置只能设置(0,0),2 pixel对齐
        u16Width,u16Heigh 不能大于输入Timing的宽高和MI_HVP_PqBufModeConfig_t中的宽高,2pixel对齐

        Lock Out Mode (Output Disp And Scl):

        DmaColor DstColor
        E_MI_HVP_COLOR_FORMAT_YUV444 E_MI_HVP_COLOR_FORMAT_YUV444
        E_MI_HVP_COLOR_FORMAT_YUV422 E_MI_HVP_COLOR_FORMAT_YUV444
        参数 使用限制
        bMirror 支持
        bFlip 支持
        enColorRange 支持
        stDispWin 仅在DISP显示有效,2 pixel对齐
        stCropWin 仅在DISP显示有效,其中x,y位置只能设置(0,0),2 pixel对齐
        u16Width,u16Heigh 不能大于输入Timing的宽高和MI_HVP_PqBufModeConfig_t中的宽高,2 pixel对齐
    • 举例

      参见MI_HVP_CreateChannel举例。

    • 相关主题

      MI_HVP_GetChannelParam


    2.14. MI_HVP_GetChannelParam

    • 功能

      获取设备通道参数。

    • 语法

      MI_S32 MI_HVP_GetChannelParam(MI_HVP_DEV devId, MI_HVP_CHN chnId, MI_HVP_ChannelParam_t *pstChnParam);
      
    • 形参

      参数类型 参数名称 参数含义 输入/输出
      MI_HVP_DEV devId 设备id 输入
      MI_HVP_CHN chnId 通道id 输入
      MI_HVP_ChannelParam_t pstChnParam 通道参数 输出
    • 返回值

      • MI_SUCCESS:成功。

      • 非MI_SUCCESS:失败,参照返回值

    • 依赖

      • 头文件:mi_sys.h、mi_hvp.h

      • 库文件:无

    • 注意

      • 设备和通道必须已经创建。
    • 举例

      参见MI_HVP_CreateChannel举例。

    • 相关主题

      MI_HVP_SetChannelParam


    2.15. MI_HVP_SetVideoMute

    • 功能

      设置图像消隐。

    • 语法

      MI_S32 MI_HVP_SetVideoMute(MI_HVP_DEV devId, MI_HVP_CHN chnId, MI_BOOL bEnable, MI_U32 u32MuteColor);
      
    • 形参

      参数类型 参数名称 参数含义 输入/输出
      MI_HVP_DEV devId 设备id 输入
      MI_HVP_CHN chnId 通道id 输入
      MI_BOOL bEnable 是否使能消隐 输入
      MI_U32 u32MuteColor 设置消隐颜色,24位有效,格式为RGB888 输入
    • 返回值

      • MI_SUCCESS:成功。

      • 非MI_SUCCESS:失败,参照返回值

    • 依赖

      • 头文件:mi_sys.h、mi_hvp.h

      • 库文件:无

    • 注意

      • 设备和通道必须已经创建。
      • 在软件调用接口后,真正使能消隐和去除消隐的时间点由底层驱动和硬件内部逻辑决定,它会根据当前的输入输出的Vsync Timing以及PqBuf内部的Fifo大小决定真正生效的时间点。
    • 举例

      void SampleHvp2(void)
      {
          MI_HVP_DeviceAttr_t stDevAttr;
          MI_HVP_DEV devId = 0;
          MI_HVP_CHN chnId = 0;
          MI_HVP_ChannelAttr_t stChnAttr;
          MI_U32 u32MuteColor = 0;
          MI_S32 s32Ret = 0;
      
          memset(&stDevAttr, 0, sizeof(MI_HVP_DeviceAttr_t));
          stDevAttr.enSrcType = E_MI_HVP_SRC_TYPE_HDMI;
          s32Ret = MI_HVP_CreateDevice(devId, &stDevAttr);
          if (MI_SUCCESS != s32Ret)
          {
              return;
          }
      
          memset(&stChnAttr, 0x0, sizeof(MI_HVP_ChannelAttr_t))
          stChnAttr.enFrcMode = E_MI_HVP_FRC_MODE_LOCK_OUT;
          if (stChnAttr.enFrcMode == E_MI_HVP_FRC_MODE_RATIO
              || stChnAttr.enFrcMode == E_MI_HVP_FRC_MODE_LOCK_OUT)
          {
              stChnAttr.stPqBufModeConfig.eDmaColor = E_MI_HVP_COLOR_FORMAT_YUV444;
              stChnAttr.stPqBufModeConfig.u16BufMaxCount = 10;
              stChnAttr.stPqBufModeConfig.u16BufMaxWidth = 1920;
              stChnAttr.stPqBufModeConfig.u16BufMaxHeight = 1080;
              stChnAttr.stPqBufModeConfig.eBufCompressMode = E_MI_SYS_COMPRESS_MODE_NONE;
              stChnAttr.stPqBufModeConfig.eFieldType = E_MI_SYS_FIELDTYPE_NONE;
          }
          s32Ret = MI_HVP_CreateChannel(devId, chnId, &stChnAttr);
          if (MI_SUCCESS != s32Ret)
          {
              return;
          }
      
          u32MuteColor = 0x0000FF; /* blue */
          s32Ret = MI_HVP_SetVideoMute(devId, chnId, 1, u32MuteColor)
          if (MI_SUCCESS != s32Ret)
          {
              return;
          }
      
          MI_HVP_DestroyChannel(devId, chnId);
      
          MI_HVP_DestroyDevice(devId);
      }
      
    • 相关主题

      NA


    3. MI HVP 数据类型

    视频前处理相关数据类型、数据结构定义如下:

    数据类型 定义
    MI_HVP_SourceType_e HVP 输入信号源选择
    MI_HVP_ColorType_e HVP 色彩类型
    MI_HVP_ColorDepth_e HVP 色彩位深
    MI_HVP_SignalStatus_e HVP 输入信号稳定状态
    MI_HVP_DeviceAttr_t HVP 的设备属性
    MI_HVP_SrcParam_t HVP src参数配置结构体
    MI_HVP_FrcMode_e HVP FRC模式
    MI_HVP_FrcFblModeConfig_t HVP FRC FBL模式配置结构体
    MI_HVP_PqBufModeConfig_t HVP PQ Buffer配置结构体
    MI_HVP_ChannelAttr_t HVP 通道参数配置结构体
    MI_HVP_DstParam_t HVP dst参数配置结构体
    MI_HVP_ChannelParam_t HVP 通道参数配置结构体
    MI_HVP_SignalTiming_t HVP 信号Timing配置结构体

    3.1. MI_HVP_SourceType_e

    • 说明

      HVP输入信号源。

    • 定义

      typedef enum
      {
          E_MI_HVP_SRC_TYPE_HDMI,
          E_MI_HVP_SRC_TYPE_DMA
      } MI_HVP_SourceType_e;
      
    • 成员

      成员名称 描述
      E_MI_HVP_SRC_TYPE_HDMI 选择HVP的输入源为HDMI_RX
      E_MI_HVP_SRC_TYPE_DMA 选择HVP的输入源为DMA

    3.2. MI_HVP_ColorFormat_e

    • 说明

      HVP 输入以及输出的色彩类型。

    • 定义

      typedef enum
      {
          E_MI_HVP_COLOR_FORMAT_RGB444,
          E_MI_HVP_COLOR_FORMAT_YUV444,
          E_MI_HVP_COLOR_FORMAT_YUV422,
          E_MI_HVP_COLOR_FORMAT_YUV420,
          E_MI_HVP_COLOR_FORMAT_MAX
      } MI_HVP_ColorFormat_e;
      
    • 成员

      成员名称 描述
      E_MI_HVP_COLOR_FORMAT_RGB444 RGB4:4:4
      E_MI_HVP_COLOR_FORMAT_YUV444 YUV4:4:4
      E_MI_HVP_COLOR_FORMAT_YUV422 YUV4:2:2
      E_MI_HVP_COLOR_FORMAT_YUV420 YUV4:2:0

    3.3. MI_HVP_ColorDepth_e

    • 说明

      HVP 色彩位深。

    • 定义

      typedef enum
      {
          E_MI_HVP_COLOR_DEPTH_8,
          E_MI_HVP_COLOR_DEPTH_10,
          E_MI_HVP_COLOR_DEPTH_12,
          E_MI_HVP_COLOR_DEPTH_MAX
      } MI_HVP_ColorDepth_e;
      
    • 成员

      成员名称 描述
      E_MI_HVP_COLOR_DEPTH_8 8bit
      E_MI_HVP_COLOR_DEPTH_10 10bit
      E_MI_HVP_COLOR_DEPTH_12 12bit

    3.4. MI_HVP_SignalStatus_e

    • 说明

      HVP 输入信号稳定状态。

    • 定义

      typedef enum
      {
          E_MI_HVP_SIGNAL_STABLE,
          E_MI_HVP_SIGNAL_UNSTABLE
      } MI_HVP_SignalStatus_e;
      
    • 成员

      成员名称 描述
      E_MI_HVP_SIGNAL_STABLE 信号稳定
      E_MI_HVP_SIGNAL_UNSTABLE 信号不稳定

    3.5. MI_HVP_DeviceAttr_t

    • 说明

      HVP的设备属性。

    • 定义

      typedef struct MI_HVP_DeviceParam_s
      {
          MI_HVP_SourceType_e enSrcType;
      } MI_HVP_DeviceAttr_t;
      
    • 成员

      成员类型 成员名称 描述
      MI_HVP_SourceType_e enSrcType HVP输入信号源类型

    3.6. MI_HVP_SrcParam_t

    • 说明

      HVP Src参数配置结构体。

    • 定义

      typedef struct MI_HVP_SourceParam_s
      {
          MI_HVP_PixelRepetitionType_e enPixRepType;;
          MI_HVP_ColorType_e  enInputColor;
          MI_HVP_ColorDepth_e enColorDepth;
          MI_SYS_WindowRect_t stCropWin;
          MI_HVP_ColorRangeType_e enColorRange;
      } MI_HVP_SrcParam_t;
      
    • 成员

      成员类型 成员名称 描述
      MI_HVP_PixelRepetitionType_e enPixRepType 像素点重复类型
      MI_HVP_ColorFormat_e enInputColor 色彩类型
      MI_HVP_ColorDepth_e enColorDepth 色彩位深
      MI_SYS_WindowRect_t stCropWin 裁剪窗口配置结构体
      MI_HVP_ColorRangeType_e enColorRange 色域类型

    3.7. MI_HVP_FrcMode_e

    • 说明

      HVP FRC模式。

    • 定义

      typedef enum
      {
          E_MI_HVP_FRC_MODE_FBL,
          E_MI_HVP_FRC_MODE_RATIO,
          E_MI_HVP_FRC_MODE_LOCK_OUT
      } MI_HVP_FrcMode_e;
      
    • 成员

      成员名称 描述
      E_MI_HVP_FRC_MODE_FBL FBL模式
      E_MI_HVP_FRC_MODE_RATIO RATIO模式
      E_MI_HVP_FRC_MODE_LOCK_OUT LOCK_OUT模式

    3.8. MI_HVP_FrcFblModeConfig_t

    • 说明

      HVP FRC FBL模式配置。

    • 定义

      typedef struct MI_HVP_FrcFblModeConfig_s
      {
          MI_U32 u32Reserve;
      } MI_HVP_FrcFblModeConfig_t;
      
    • 成员

      成员类型 成员名称 描述
      MI_U32 u32Reserve 保留

    3.9. MI_HVP_PqBufModeConfig_t

    • 说明

      HVP PQ Buffer配置结构体。

    • 定义

      typedef struct MI_HVP_PqBufModeConfig_s
      {
          MI_HVP_ColorFormat_e    eDmaColor;
          MI_U16                  u16BufMaxCount;
          MI_U16                  u16BufMaxWidth;
          MI_U16                  u16BufMaxHeight;
          MI_SYS_CompressMode_e   eBufCompressMode;
          MI_SYS_FieldType_e      eFieldType;
      } MI_HVP_PqBufModeConfig_t;
      
    • 成员

      成员类型 成员名称 描述
      MI_HVP_ColorFormat_e eDmaColor DMA支持的色彩格式
      MI_U16 u16BufMaxCount PQ Buffer 最大值
      MI_U16 u16BufMaxWidth PQ Buffer 宽上限
      MI_U16 u16BufMaxHeight PQ Buffer 高上限
      MI_SYS_CompressMode_e eBufCompressMode 定义压缩方式枚举类型
      MI_SYS_FieldType_e eFieldType 逐行扫描类型

    3.10. MI_HVP_ChannelAttr_t

    • 说明

      HVP 通道参数配置结构体。

    • 定义

      typedef struct MI_HVP_ChannelAttr_s
      {
          MI_HVP_FrcMode_e enFrcMode;
          union
          {
              MI_HVP_FrcFblModeConfig_t stFrcFblModeConfig;
              MI_HVP_PqBufModeConfig_t  stPqBufModeConfig;
          };
      } MI_HVP_ChannelAttr_t;
      
    • 成员

      成员类型 成员名称 描述
      MI_HVP_FrcMode_e enFrcMode FRC模式
      MI_HVP_FrcFblModeConfig_t stFrcFblModeConfig HVP FRC FBL模式配置结构体
      MI_HVP_FrcFblModeConfig_t stPqBufModeConfig HVP PQ Buffer配置结构体

    3.11. MI_HVP_DstParam_t

    • 说明

      HVP Dst参数配置结构体。

    • 定义

      typedef struct MI_HVP_DstParam_s
      {
          MI_HVP_ColorFormat_e  enColor;
          MI_BOOL               bMirror;
          MI_BOOL               bFlip;
          MI_U16                u16Fpsx100;
          MI_U16                u16Width;
          MI_U16                u16Height;
          MI_SYS_WindowRect_t   stDispWin;
          MI_SYS_WindowRect_t   stCropWin;
      } MI_HVP_DstParam_t;
      
    • 成员

      成员类型 成员名称 描述
      MI_HVP_ColorFormat_e enColor 色彩格式
      MI_BOOL bMirror 是否镜像
      MI_BOOL bFlip 是否翻转
      MI_U16 u16Fpsx100 帧率
      MI_U16 u16Width
      MI_U16 u16Height
      MI_SYS_WindowRect_t stDispWin 显示窗口配置参数结构体
      MI_SYS_WindowRect_t stCropWin 裁剪窗口配置参数结构体

    3.12. MI_HVP_ChannelParam_t

    • 说明

      HVP 通道参数配置结构体。

    • 定义

      typedef struct MI_HVP_ChannelParam_s
      {
          MI_HVP_SrcParam_t stChnSrcParam;
          MI_HVP_DstParam_t stChnDstParam;
      } MI_HVP_ChannelParam_t;
      
    • 成员

      成员类型 成员名称 描述
      MI_HVP_SrcParam_t stChnSrcParam HVP Src参数配置结构体
      MI_HVP_DstParam_t stChnDstParam HVP Dst参数配置结构体

    3.13. MI_HVP_SignalTiming_t

    • 说明

      HVP 信号Timing参数配置结构体。

    • 定义

      typedef struct MI_HVP_SignalTiming_s
      {
          MI_BOOL bInterlace;
          MI_U16  u16Fpsx100;
          MI_U16  u16Width;
          MI_U16  u16Height;
      } MI_HVP_SignalTiming_t;
      
    • 成员

      成员类型 成员名称 描述
      MI_BOOL bInterlace 是否隔行扫描
      MI_U16 u16Fpsx100 帧率
      MI_U16 u16Width
      MI_U16 u16Height

    3.14. MI_HVP_PixelRepetitionType_e

    • 说明

      HVP 像素重复类型。

    • 定义

      typedef enum
      {
          E_MI_HVP_PIX_REP_TYPE_1X,
          E_MI_HVP_PIX_REP_TYPE_2X,
          E_MI_HVP_PIX_REP_TYPE_3X,
          E_MI_HVP_PIX_REP_TYPE_4X,
          E_MI_HVP_PIX_REP_TYPE_MAX
      } MI_HVP_PixelRepetitionType_e;
      
    • 成员

      成员名称 描述
      E_MI_HVP_PIX_REP_TYPE_1X 1倍
      E_MI_HVP_PIX_REP_TYPE_2X 2倍
      E_MI_HVP_PIX_REP_TYPE_3X 3倍
      E_MI_HVP_PIX_REP_TYPE_4X 4倍

    3.15. MI_HVP_ColorRangeType_e

    • 说明

      HVP色域类型

    • 定义

      typedef enum
      {
          E_MI_HVP_COLOR_RANGE_TYPE_FULL,
          E_MI_HVP_COLOR_RANGE_TYPE_LIMIT,
          E_MI_HVP_COLOR_RANGE_TYPE_MAX,
      } MI_HVP_ColorRangeType_e;
      
    • 成员

      成员名称 描述
      E_MI_HVP_COLOR_RANGE_TYPE_FULL 默认
      E_MI_HVP_COLOR_RANGE_TYPE_LIMIT 仅在yuv色域才会触发limit->full的转换

    4. MI HVP返回值

    MI_HVP API 返回值如下表所示。

    错误码 宏定义 描述
    0xA0292001 MI_ERR_HVP_INVALID_DEVID 使用错误的设备id
    0xA0292002 MI_ERR_HVP_INVALID_CHNID 使用错误的通道id
    0xA0292003 MI_ERR_HVP_ILLEGAL_PARAM 使用错误的参数
    0xA0292004 MI_ERR_HVP_EXIST 通道已经存在
    0xA0292005 MI_ERR_HVP_UNEXIST 通道不存在
    0xA0292006 MI_ERR_HVP_NULL_PTR 空指针
    0xA0292007 MI_ERR_HVP_NOT_CONFIG 未配置
    0xA0292008 MI_ERR_HVP_NOT_SUPPORT 不支持当前配置
    0xA0292009 MI_ERR_HVP_NOT_PERM 不允许当前配置
    0xA029200C MI_ERR_HVP_NOMEM 无系统内存
    0xA029200D MI_ERR_HVP_NOBUF 无连续物理内存
    0xA029200E MI_ERR_HVP_BUF_EMPTY 物理内存池为空
    0xA029200F MI_ERR_HVP_BUF_FULL 物理内存池满
    0xA0292010 MI_ERR_HVP_NOTREADY 设备当前不可用
    0xA0292011 MI_ERR_HVP_BADADDR 错误的地址
    0xA0292012 MI_ERR_HVP_BUSY 资源冲突
    0xA0292013 MI_ERR_HVP_CHN_NOT_STARTED 通道未开始
    0xA0292014 MI_ERR_HVP_CHN_NOT_STOPPED 通道未结束
    0xA029201F MI_ERR_HVP_UNDEFINED 未知错误

    5. PROCFS介绍

    5.1. HVP cat

    • 调试信息

      # cat /proc/mi_modules/mi_hvp/mi_hvpX(其中X为HVP的设备id)
      

    • 调试信息分析

      记录当前HVP的使用状况以及device属性、channel属性、outputport属性,可以动态地获取到这些信息,方便调试和测试。

    • 参数说明

      参数 描述
      device info IsrMask 中断掩码
      AutoMuteIsrCnt 自动消隐中断次数
      IrqCnt 输入或输出中断次数
      IrqCnt/Ms 一段时间内的输入或输出中断次数
      Ips 每秒的输入或输出中断次数
      MaxIv/MinIv 一段时间内的输入或输出中断最大和最小间隔时间
      InputType 输入数据源类型
      InputId 输入数据源对应Id(保留)
      OutputType 输出类型
      OutputId (用于指定gwin的mops0 or mops1)
      SignalSt 输入信号稳定状态
      AutoMuteSt 是否使能AutoMute
      StrSt STR状态
      FpllLockSt Fpll是否锁住
      Htt 水平总长度。单位:像素
      Vtt 垂直总长度。单位:行
      HdeStart 水平有效开始。单位:像素
      VdeStart 垂直有效开始。单位:行
      HdeEnd 水平有效结束。单位:像素
      VdeEnd 垂直有效结束。单位:行
      HAct 水平有效长度。单位:像素
      VAct 垂直有效长度。单位:行
      bInterlace 隔行/逐行
      Fpsx100 帧率乘以100
      channel info Chn 通道id
      bStart 通道是否开始
      MuteMask 消隐掩码
      MuteColor 消隐颜色
      FrcMode fbl/ratio/lock_out
      bEnableDmaBuf 是否使用DMA Buffer
      BufW DMA Buffer的宽
      BufH DMA Buffer的高
      BufCnt DMA Buffer数量
      Fmt 色彩格式
      CompressMd 压缩方式
      DiType 逐行扫描类型
      PqBufSize PqBuf总内存长度
      PqBufAddr PqBuf内存起始地址
      PqBufStride PqBuf跨度
      PatGenEn 是否使能HVP内部Timing Gen pattern
      PatW Timing Gen pattern的宽
      PatH Timing Gen pattern的高
      PixRepType 重复像素点类型
      SrcCropX Src端裁剪窗口的起始横坐标
      SrcCropY Src端裁剪窗口的起始纵坐标
      SrcCropW Src端裁剪窗口的宽度
      SrcCropH Src端裁剪窗口的高度
      SrcColor Src端色彩类型
      SrcCR Src色域
      SrcBpp Src端色彩位深
      DstColor Dst端色彩类型
      DstFps Dst端输出帧率
      bMirror 是否镜像
      bFilp 是否翻转
      DstW Dst端画面的宽度
      DstH Dst端画面的高度
      DispX Disp窗口的起始横坐标
      DispY Disp窗口的起始纵坐标
      DispW Disp窗口的宽度
      DispH Disp窗口的高度
      DstCropX Dst端裁剪窗口的起始横坐标
      DstCropY Dst端裁剪窗口的起始纵坐标
      DstCropW Dst端裁剪窗口的宽度
      DstCropH Dst端裁剪窗口的高度
      Output Task Info DoneCnt 完成的Task次数
      DoneCnt/Ms 一段时间内完成的Task次数
      Fps 每秒完成的Task次数
      MaxIv/MinIv 一段时间内完成的Task的最大和最小间隔时间
      Hardware Timestamp DmaRead 输入帧同步时间戳
      Sw React 输出帧同步时间戳
      Diff Hvp内部延时

    5.2. HVP echo

    功能
    获取当前HVP所支持的echo命令及其具体使用形式
    命令 echo help > /proc/mi_modules/mi_hvp/mi_hvp0
    参数说明
    举例 echo help > /proc/mi_modules/mi_hvp/mi_hvp0
    功能
    设置HVP内部Timing Gen的参数
    命令 echo genTiming [hsync_w] [hbp] [hact] [hst] [htt] [vsync_w] [vbp] [vact] [vst] [vtt] [interlaced] > /proc/mi_modules/mi_hvp/mi_hvp0
    参数说明 [hsync_w] [hbp] [hact] [hst] [htt] [vsync_w] [vbp] [vact] [vst] [vtt] [interlaced]
    举例 echo genTiming 44 148 1920 192 2200 5 36 1080 41 1125 0 > /proc/mi_modules/mi_hvp/mi_hvp0
    功能
    设置HVP内部Test Pattern的宽高及使能
    命令 echo genPattern [bEn] (w) (h) > /proc/mi_modules/mi_hvp/mi_hvp0
    参数说明 [bEn] 是否使能 (w) 宽 (h) 高,其中宽高是可选参数,不填的话默认等于src宽高
    举例 echo genPattern 1 1920 1080 > /proc/mi_modules/mi_hvp/mi_hvp0或者echo genPattern 1 > /proc/mi_modules/mi_hvp/mi_hvp0
    功能
    设置HVP输入Timing来源
    命令 echo setSrcTiming [chn] [src_type] [id] > /proc/mi_modules/mi_hvp/mi_hvp0
    参数说明 [chn] 通道id [src_type] hdmirx,display,timing_gen [id] 保留,输入0即可
    举例 echo setSrcTiming 0 timing_gen 0 > /proc/mi_modules/mi_hvp/mi_hvp0
    功能
    设置HVP自动消隐功能(AutoMute)是否使能
    命令 echo setAutoMuteOnOff [bEn] > /proc/mi_modules/mi_hvp/mi_hvp0
    参数说明 [bEn] 是否使能
    举例 echo setAutoMuteOnOff 1 > /proc/mi_modules/mi_hvp/mi_hvp0
    功能
    开启消隐功能
    命令 echo setMute [chn] [bEn] [color rgb[23:0]] > /proc/mi_modules/mi_hvp/mi_hvp0
    参数说明 [chn] 通道id [bEn] 是否使能 [color rgb[23:0]] 消隐颜色
    举例 echo setMute 0 1 0xff0000 > /proc/mi_modules/mi_hvp/mi_hvp0
    功能
    发送一个Action Task到内部的工作线程中,研发人员Debug用。
    命令 echo applyTask [chnid] [dupCnt] [taskFrameFlags] [taskActFlags] > /proc/mi_modules/mi_hvp/mi_hvp0
    参数说明 [chnid] [dupCnt] [taskFrameFlags] [taskActFlags]
    举例 echo applyTask [chnid] [dupCnt] [taskFrameFlags] [taskActFlags] > /proc/mi_modules/mi_hvp/mi_hvp0