前言

  海思对摄像头的支持是只有固定的,如果我们想更换新的相机,让fpga接入通过lvds接口给3559提供视频源的话,除了相关配置,还需要添加新的sensor库,编译新的isp库,而且,如果移植不善,还可能对第三方库(SDL,FreeType,SDL_TTF等)造成影响,需要进一步修改

参考文档:

  Sensor 调试指南
  MIPI使用指南
  HiMPP V4.0 媒体处理软件 FAQ
  HiISP 开发参考

一.调试流程

1.2 准备材料

1.2.1 确认主芯片规格

  支持 Master 模式,支持的线性、WDR 接口模式,支持输入频率上限。

1.2.2 Sensor datasheet

   确认图像传输接口模式,输出频率。
  确认曝光时间、增益如何设置,帧率如何修改。
  确认在 WDR 模式下的以上两项。
   LVDS 接口,需要确认同步码。

1.2.3 Initialize Settings

  获取 Sensor Initialize Settings,一般至少要准备最大规格和标准分辨率两种序列。

1.3 采集图像

1.3.1 硬件准备就绪

  首先验证是否可以读写 Sensor 寄存器。
  利用 i2c_read/ i2c_write 命令,或 ssp_read/ssp_write 命令,测试 Sensor 寄存器读写。
该命令集成在默认的文件系统中,可直接调用。

1.3.2 完成初始化序列配置

  配置初始化序列,建议参考版本发布包里面的 sensor 驱动,以便于快速开发。为了方便调试,此时要排除 AE 配置及帧率配置的干扰。

步骤 1 准备 Sensor 驱动

  可以基于一款规格相近 Sensor(master/slave, i2c/spi, wdr/linear)驱动修改,尝试编译出 Sensor 库。具体可参看 isp/sensor/hi35xx/xxxx 目录下的 xxx_cmos.c 和xxx_sensor_ctl.c 文件进行修改。
   修改 cmos_set_image_mode 函数,及 cmos_get_isp_default 中的 u32MaxWidth,u32MaxHeight 参数。使该 senosr 分辨率、帧率可以被正确设置。
   在 sys_config.c 中修改 Sensor 时钟配置、I2C/SPI 接口 pin mux、vi 时钟、isp 时钟等寄存器。适配时,可基于相似规格的 Sensor 修改。对于从模式的 sensor,需要配置从模式 pin mux,Hi3559AV100、Hi3519AV100 默认打开从模式 pin mux,
  Hi3516CV500 通过调用 vi_slave_mode_mux 配置从模式 pin_mux(默认不会调用该函数,对于从模式 sensor 要增加判断分支实现该函数的调用来正确配置从模式pin mux)。

步骤 2 Sensor 初始化序列

  实现 void sensor_init()函数。参考 sensor 手册或者 sensor 厂家提供的 sensor 序列实现这个函数。对于从模式 sensor,在 sensor_init()函数中需要调用HI_MPI_ISP_GetSnsSlaveAttr 接口来实现从模式寄存器的适配。以 imx334 从模式的 sensor_init 为例:


void imx334slave_init(VI_PIPE ViPipe)
{HI_U8 u8ImgMode;HI_BOOL bInit;HI_S32 SlaveDev;HI_U32 u32Data;bInit = g_pastImx334Slave[ViPipe]->bInit;u8ImgMode = g_pastImx334Slave[ViPipe]->u8ImgMode;SlaveDev = g_Imx334SlaveBindDev[ViPipe];u32Data = g_Imx334SalveSensorModeTime[ViPipe];/* hold sync signal as fixed */CHECK_RET(HI_MPI_ISP_GetSnsSlaveAttr(SlaveDev,&gstImx334Sync[ViPipe]));gstImx334Sync[ViPipe].unCfg.stBits.bitHEnable = 0;gstImx334Sync[ViPipe].unCfg.stBits.bitVEnable = 0;gstImx334Sync[ViPipe].u32SlaveModeTime = u32Data;CHECK_RET(HI_MPI_ISP_SetSnsSlaveAttr(SlaveDev,&gstImx334Sync[ViPipe]));/* 1. sensor i2c init */imx334slave_i2c_init(ViPipe);CHECK_RET(HI_MPI_ISP_GetSnsSlaveAttr(SlaveDev,&gstImx334Sync[ViPipe]));// release hv syncgstImx334Sync[ViPipe].u32HsTime =g_astImx334ModeTbl[u8ImgMode].u32InckPerHs;if (g_pastImx334Slave[ViPipe]->astRegsInfo[0].stSlvSync.u32SlaveVsTime == 0) {gstImx334Sync[ViPipe].u32VsTime =g_astImx334ModeTbl[u8ImgMode].u32InckPerVs;} else {gstImx334Sync[ViPipe].u32VsTime = g_pastImx334Slave[ViPipe]->astRegsInfo[0].stSlvSync.u32SlaveVsTime;}gstImx334Sync[ViPipe].unCfg.u32Bytes = 0xc0030000;gstImx334Sync[ViPipe].u32HsCyc = 0x3;gstImx334Sync[ViPipe].u32VsCyc = 0x3;CHECK_RET(HI_MPI_ISP_SetSnsSlaveAttr(SlaveDev,&gstImx334Sync[ViPipe]));/*sensor registers init*/……g_pastImx334Slave[ViPipe]->bInit = HI_TRUE;return;
}

  在 xxx_sensor_ctl.c 填写 sensor 寄存器的基地址 sensor_i2c_addr,地址的比特位宽sensor_addr_byte,寄存器的比特位宽信息 sensor_data_byte。在 xxx_cmos.c 文件中,注释掉全部 sensor_write_register,并在cmos_get_sns_regs_info 函数里,把 u32RegNum 配置为 0。以使 AE 不配置sensor,排除干扰。
  ----结束

  在目录/Hi3559AV100_SDK_V2.0.3.1/mpp/component/isp/user/sensor下新建两个文件夹cyclone_lvds0,cyclone_lvds1,参考开发板自带的,新建自己的sensor库,直接给最后的源码如下
(后面给出)

1.3.3 Sensor 输出

  本部分是基于 mpp 目录下的 sample 做整个通路的输出说明。主要在已完成了 sensor 序列的前提下做的。其步骤主要包括:MIPI、VI、ISP 以及 VPSS 的配置。这些配置可以参考已有 sensor 的配置进行简单修改即可。如果已经有集成的环境直接配置参数就可以运行,比如 Hisi PQTool 的启动脚本,对应 sensor 的目录有启动的配置文件,只需要配置正确即可。

步骤 1

  在完成初始化的配置之后,可在 ISP 目录下编译即可生成新的 Sensor 的库,新库的路径为 Hi3559AV100_SDK_V2.0.3.1/mpp/component/isp/user/lib libsns_lvds0.a 和 Hi3559AV100_SDK_V2.0.3.1/mpp/component/isp/user/lib libsns_lvds0.so。

步骤 2

  基于 mpp 的 sample 对新 Sensor 进行验证。在 sample/Makefile.param 文件中新增一款Sensor 的编译配置 SENSOR_TYPE,然后添加对应的 libsns_lvds0.a 文件
  SENSOR0_TYPE ?= FPGA_CYCLONE_LVDS_XM_XFPS_16BIT_1080P
  SENSOR1_TYPE ?= FPGA_CYCLONE_LVDS_XM_XFPS_16BIT_720P
  SENSOR_LIBS += $(REL_LIB)/libsns_lvds0.a
  SENSOR_LIBS += $(REL_LIB)/libsns_lvds1.a

步骤 3

  在 sample_comm.h 中的 SAMPLE_VI_MODE_E 中添加该 sensor 类型,注意和sample/Makefile.param 文件中新增的 SENSOR_TYPE 一致。然后再 sample_comm_isp.c中 SAMPLE_COMM_ISP_Init 函数中添加这个 sensor 类型的属性,如:Bayer pattern,帧率,宽高信息。

步骤 4 配置 MIPI 属性,

  在 sample_comm_vi.c 中 SAMPLE_COMM_VI_SetMipiAttr 添加 MIPI属性,调试 MIPI/LVDS 部分参考《MIPI 使用指南》。

步骤 5 配置 VI 属性。

  在 sample_comm_vi.c 中 SAMPLE_COMM_VI_StartDev 添加 VI 属性。

步骤 6

  编译并运行相应的应用程序 sample_vio,如果一切顺利,此时整个系统已经运行。可以通过 cat /proc/umap/isp 或者 cat /proc/umap/hi_mipi 等查看信息。

步骤 7

  如果 ISP 没有中断,请先检查 Sensor 输入时钟、输出信号及 Sensor 寄存器配置是否正常。具体操作请查阅《Hi35xx 专业型 HD IP Camera SoC 用户指南》或 《Hi35xxVxxxultra-HD Mobile Camera SoC 用户指南》。

步骤 8

  若发现 MIPI、VI、ISP 等都正常,并想进行图像质量调节,可以把上述的配置移植到PQTool 的对应 sensor 配置文件中(在 config 目录下新建一个 sensor 目录,参考类似sensor 的配置做相应的修改即可)。
  ----结束
注意事项
  当使用多路从模式 sensor 时,需要注意部分 sensor 由于自身对于 Vsync 信号和 Hsync信号的时序匹配的精度要求比较高。
  在 VI 端开启同步模式时,需要对 sensor 的启动流程进行特别的处理。比如对于SONY 的 IMX477,工作在从模式时,因为其 Vsync 信号由 VI 端产生,Hsync 信号由 sensor 自己产生,Vsync 和 Hsync 信号在时序上需要严格匹配。
当 VI 端开启同步模式时,会改变 Vsync 信号时序来进行多路 Vsync 信号的同步,此时造成 Vsync 和 Hsync 信号时序上有差异从而导致 IMX477 数据输出异常。所以对于 IMX477 这类对 Vsync 和 Hsync 信号时序匹配精度要求比较高的 sensor,需要更改 sensor 的启动流程,在 VI 端开启同步模式前控制 sensor 先进入 standby模式,等 VI 端的 Vsync 信号同步结束后再控制 sensor 切换到数据输出模式。具体改动可参考 IMX477 多路从模式的 Sample 用例。

1.4 ISP 基本功能

  本章节涉及 Sensor 部分,请仔细阅读 Sensor 的 Datasheet,或联系 Sensor 原厂 FAE。
结构体说明请参考《HiISP 开发参考》。
  驱动文件一般分为 xxx_cmos.c 文件,xxx_cmos_ex.h 和 xxx_sensor_ctl.c 文件,分别用于 ISP 功能和初始化序列,xxx_cmos_ex.h 文件用于存放定义的驱动文件中的全局变量。
  驱动文件共有 3 个 callback 函数,是 sensor 驱动向 Firmware 注册函数的接口。
HI_MPI_ISP_SensorRegCallBack(),HI_MPI_AE_SensorRegCallBack(),HI_MPI_AWB_Sen
sorRegCallBack(),分别对应 ISP、海思 AE 及海思 AWB。
开发流程
  ISP 基本功能,请按如下顺序实现:

  1. cmos_set_image_mode(), cmos_set_wdr_mode()。
  2. sensor_global_init()。
  3. sensor_init(), sensor_exit()。
  4. cmos_get_isp_default(),cmos_get_isp_black_level()。

注意事项

cmos_set_image_mode ()

  该函数用于区分不同分辨率,用 ISP_SNS_STATE_S 中的 u8ImgMode 传递分辨率模式
请注意返回值,返回“0”表示重新配置 Sensor,会调用 sensor_init(),返回“-2”表示不用重新配置 Sensor,无动作。
请注意 ISP_SNS_STATE_S 中 u32FLStd 和 au32FL 的区别。u32FLStd 是当前分辨率及 WDR 模式下,标准帧率(一般为 30fps)时的总行数。au32FL 是实际总行数,该参数会在其它函数中,由于降帧的原因,基于标准行数 u32FLStd 及帧率修改。
  cmos_set_wdr_mode()
  该函数用于区分不同 WDR 模式,用 ISP_SNS_STATE_S 中的 enWDRMode 传递。不同 WDR 模式,一般会修改 AE 相关函数,ISP default 内各个参数以及初始化序列。
  sensor_init()
  请根据不同的分辨率及 WDR 模式配置不同序列。
  sensor_exit()
  实现参考类似 sensor 的驱动即可。
  cmos_get_isp_default()
  该函数配置基本是调试或校正参数,可以在调试及校正时修改参数。
  请注意不同 WDR 模式参数可能不一样,比如 Gamma,DRC 等。具体请参考
《HiISP 开发参考》。
  cmos_get_isp_black_level()
  在这个函数里面配置 RAW 数据四个通道的黑电平。

注意:!!!
  有些类型的 sensor 的黑电平会随着 gain 值的变化而漂移,这时需要在不同的 ISO 值下分别校正出对应的黑电平值,在 cmos_get_isp_black_level()函数内进行相应的实现。
  sensor_global_init()
  该函数配置了 sensor 初始化的相关配置,包括分辨率、WDR 模式、u32FLStd 的默认值,初始化状态值及其他相关的状态值。

1.5 完成 AE 配置

  完成 AE 配置后,图像就基本正常了。
开发流程
  AE 配置,请按如下顺序实现:

  1. cmos_get_sns_regs_info()。
  2. cmos_get_ae_default(), cmos_again_calc_table(), cmos_dgain_calc_table()。
  3. cmos_get_inttime_max()。
  4. cmos_gains_update(), cmos_inttime_update()。
  5. cmos_fps_set(), cmos_slow_framerate_set()。

注意事项
  cmos_get_sns_regs_info()
  该函数用于配置需要确保同步性的 sensor、ISP 寄存器,如曝光时间、增益及总行数等。虽然这些寄存器可以通过直接调用 sensor_write_register()来配置,但无法保证同步性,可能出现闪烁。所以这些寄存器请一定要用该函数配置。
  u8DelayFrmNum 是寄存器配置延时。举个例子,很多 Sensor 的增益是下一帧生效,但曝光时间是下下帧生效,所以需要增益晚一帧配置,以使增益和曝光时间同时生效,这时就需要用 Delay 的功能。配置 u8Cfg2ValidDelayMax 是控制 ISP 与sensor 同步,ISP 包括 ISP Dgain 和 WDR 曝光比等参数,可通过检查 ISP Dgain 是否与 sensor gain 同步来检查参数正确性。该参数的意义是生效时间,一般会比最大的 sensor 寄存器延迟多 1。

  • bUpdate 用于控制该寄存器是否更新,如果不用修改,可以置为 false。cmos_get_ae_default()
  • 请根据 sensor 修改参数。enAccuType 是计算精度的类型,常用AE_ACCURACY_TABLE 及 AE_ACCURACY_LINEAR。而AE_ACCURACY_DB 因为 CPU 计算精度问题,除非精度很低的,均由 TABLE的方式代替。
  • LINEAR 方式是指曝光时间或增益以固定步长线性递增。比如每一步增长 0.325倍,或曝光时间每一步增长 1。步长由 f32Accuracy 决定。
  • TABLE 方式一般用于增益,指每一步可以达到的增益通过查表的方式,在cmos_again_calc_table()或 cmos_dgain_calc_table()函数中计算得到。此时f32Accuracy 失去意义,不生效。海思 AE 默认计算顺序是先分配曝光时间,其次 again,然后 digain,最后 ispdgain。可以通过设置 AE Route 或 AE RouteEx 来调整分配顺序。
    cmos_again_calc_table(), cmos_dgain_calc_table()这两个函数输入、输出完全一致,分别对应 Again 和 Dgain 的 TABLE 方式。下面以 Again 为例说明。
  • pu32AgainLin 同时做输入和输出。做输入是 AE 计算出来的期望增益,1024 表示 1 倍。在该函数中,要查询到一个 sensor 可以实现的,小于该增益的最大增益。并重新赋给该参数作为向 AE 的输出。
  • pu32AgainDb 是输出,AE 内部不用于运算,只是作为函数 cmos_gains_update()的输入。一般用于传递当前增益的 sensor 寄存器值。
    例如:某 sensor 增益按 0.3dB 递增。sensor 寄存器值从 0 开始,每增加 1,对应增益分别为 0dB, 0.3dB, 0.6dB, 0.9dB…离线算出一个将 dB 转化为线性倍数的查找表,为 1024, 1060, 1097, 1136…
    在函数中将输入的增益与查找表比对,假如输入为 1082,那查出来可用的最大增益是 1060,返回 1060 为实际生效的增益。
    cmos_get_inttime_max()
    该函数只在 xto1 WDR 模式下生效,用于计算不同曝光比的时候,曝光时间的最大值一般是行合成模式才需要。因为行合成模式,曝光时间的限制为长曝光时间加短曝光时间的和要小于一帧长度。所以不同曝光比下,最大曝光时间有差异,需要重新运算。
    cmos_gains_update(), cmos_inttime_update()
    这两个函数,是根据输入的 Again、Dgain 或曝光时间配置 sensor 寄存器。精度模式采用 TABLE 时,输入参数值为对应
    cmos_again_calc_table()/cmos_dgain_calc_table() 函数中返回的 pu32AgainDb、
    pu32DgainDb。
    精度模式采用 Linear 时,输入参数为生效的增益、曝光时间除以 f32Accuracy。比
    如 f32Accuracy 为 0.0078125,实际生效增益为 1.5 倍时,输入值为 1.5 / 0.0078125
    = 192。
    Xto1 WDR 模式,需要分别配置长短每一帧的曝光时间。cmos_inttime_update()会
    被调用 X 次,分别传入不同帧曝光时间,第一次传入短帧。
    cmos_fps_set(), cmos_slow_framerate_set()
    **cmos_fps_set()**函数为手动帧率配置函数,需要根据传入的帧率配置 sensor 对应的寄存器,实现改变 sensor 帧率的功能,并返回实际生效的帧率及最大曝光行数。
    cmos_slow_framerate_set()函数为自动降帧配置函数,需要根据当前曝光实际需要的最大曝光行数配置 sensor 对应的寄存器,实现 sensor 的降帧功能,并返回实际生效的最大曝光行数。

1.6 完善功能

  完善所有其它的函数,确保所有功能工作正常。由于 AE 中的同步性最容易出错,请重点验证同步。

1.7 颜色、去噪等校正

  请根据《图像质量调试工具使用指南》校正 sensor 参数。

1.8 图像质量调优

  图像质量调优请参阅对应的《ISP 图像调优指南》。

如果看的太乱了直接快进到这里

  上面的是官方文档,有些操作跳过了(我不严谨我不严谨),有些操作按照官方的做了然后添加了具体的做法,看起来会有点乱,如果只想看移植步骤可以直接看这里,提供了一个老版本移植到新版本的步骤说明一定一定要看清SDK版本

1.新建sensor库

  源码位于/Hi3559AV100_SDK_V2.0.3.1/mpp/component/isp/user/sensor
在isp级目录编译,会在路径Hi3559AV100_SDK_V2.0.3.1/mpp/component/isp/user/lib 下生成libsns_lvds0.a和.so,并且会拷贝至Hi3559AV100_SDK_V2.0.3.1/mpp/out/linux/multi-core/lib
第一个相机,称为lvds0(1080P)共三个文件,
源码,实在太大了博客放不下

2.修改make sample/Makefile.param,增加sensor类型和刚刚生成的库

SENSOR0_TYPE ?= FPGA_CYCLONE_LVDS_XM_XFPS_16BIT_1080P
SENSOR1_TYPE ?= FPGA_CYCLONE_LVDS_XM_XFPS_16BIT_720
SENSOR_LIBS += $(REL_LIB)/libsns_lvds0.a
SENSOR_LIBS += $(REL_LIB)/libsns_lvds1.a

3.引用刚刚的库中的结构体stSnsLVDS0Obj

  在\Hi3559AV100_SDK_V2.0.3.1\mpp\component\isp\include\hi_sns_ctrl.h中,添加

extern ISP_SNS_OBJ_S stSnsLVDS0Obj;
extern ISP_SNS_OBJ_S stSnsLVDS1Obj;

  该头文件可能也需要在mpp/out/linux/multi-core/include下,没把握就都改了

4.sample/common路径下的sampl_comm.h增加sensor枚举类型

typedef enum hiSAMPLE_SNS_TYPE_E
{SONY_IMX477_MIPI_12M_30FPS_12BIT,SONY_IMX477_MIPI_9M_50FPS_10BIT,SONY_IMX477_MIPI_8M_60FPS_12BIT,SONY_IMX477_MIPI_8M_30FPS_12BIT,SONY_IMX290_MIPI_2M_30FPS_12BIT,SONY_IMX290_MIPI_2M_30FPS_12BIT_WDR3TO1,SONY_IMX334_SLAVE_MIPI_8M_30FPS_12BIT,SONY_IMX334_MIPI_8M_30FPS_12BIT,SONY_IMX334_MIPI_8M_30FPS_12BIT_WDR2TO1,SONY_IMX277_SLVS_8M_120FPS_10BIT,SONY_IMX277_SLVS_8M_30FPS_12BIT,SONY_IMX277_SLVS_8M_60FPS_12BIT,SONY_IMX277_SLVS_12M_30FPS_12BIT,SONY_IMX277_SLVS_2M_240FPS_12BIT,FPGA_CYCLONE_LVDS_XM_XFPS_16BIT_1080P,FPGA_CYCLONE_LVDS_XM_XFPS_16BIT_720P,SAMPLE_SNS_TYPE_BUTT,
} SAMPLE_SNS_TYPE_E;

5.sample/common路径下的sampl_comm_vi.c增加sensor类型

(1)

static input_mode_t SAMPLE_COMM_VI_GetSnsInputMode(SAMPLE_SNS_TYPE_E enSnsType)
{input_mode_t enInputMode;switch (enSnsType){case SONY_IMX277_SLVS_8M_120FPS_10BIT:  /*imx277 test*/case SONY_IMX277_SLVS_8M_30FPS_12BIT:case SONY_IMX277_SLVS_8M_60FPS_12BIT:case SONY_IMX277_SLVS_12M_30FPS_12BIT:case SONY_IMX277_SLVS_2M_240FPS_12BIT:enInputMode = INPUT_MODE_SLVS;break;case FPGA_CYCLONE_LVDS_XM_XFPS_16BIT_1080P:case FPGA_CYCLONE_LVDS_XM_XFPS_16BIT_720P:enInputMode=INPUT_MODE_LVDS;break;default:enInputMode = INPUT_MODE_MIPI;break;}return enInputMode;
}

(2)

HI_S32 SAMPLE_COMM_VI_GetComboAttrBySns(SAMPLE_SNS_TYPE_E enSnsType, combo_dev_t MipiDev, combo_dev_attr_t* pstComboAttr)
{switch (enSnsType){SAMPLE_PRT("!!!!!!!!!!!!!!!enSnsTypeis %d!",enSnsType);case SONY_IMX477_MIPI_12M_30FPS_12BIT:if (0 == MipiDev){hi_memcpy(pstComboAttr, sizeof(combo_dev_attr_t), &MIPI_4lane_CHN0_SENSOR_IMX477_12BIT_12M_NOWDR_ATTR, sizeof(combo_dev_attr_t));}else if (2 == MipiDev){hi_memcpy(pstComboAttr, sizeof(combo_dev_attr_t), &MIPI_4lane_CHN2_SENSOR_IMX477_12BIT_12M_NOWDR_ATTR, sizeof(combo_dev_attr_t));}else if (4 == MipiDev){hi_memcpy(pstComboAttr, sizeof(combo_dev_attr_t), &MIPI_4lane_CHN4_SENSOR_IMX477_12BIT_12M_NOWDR_ATTR, sizeof(combo_dev_attr_t));}else if (6 == MipiDev){hi_memcpy(pstComboAttr, sizeof(combo_dev_attr_t), &MIPI_4lane_CHN6_SENSOR_IMX477_12BIT_12M_NOWDR_ATTR, sizeof(combo_dev_attr_t));}else{SAMPLE_PRT("unsupported mipi dev :%d for SnsType :%d\n", MipiDev, enSnsType);}break;case SONY_IMX477_MIPI_9M_50FPS_10BIT:if (0 == MipiDev){hi_memcpy(pstComboAttr, sizeof(combo_dev_attr_t), &MIPI_4lane_CHN0_SENSOR_IMX477_10BIT_9M_NOWDR_ATTR, sizeof(combo_dev_attr_t));}else if (2 == MipiDev){hi_memcpy(pstComboAttr, sizeof(combo_dev_attr_t), &MIPI_4lane_CHN2_SENSOR_IMX477_10BIT_9M_NOWDR_ATTR, sizeof(combo_dev_attr_t));}else if (4 == MipiDev){hi_memcpy(pstComboAttr, sizeof(combo_dev_attr_t), &MIPI_4lane_CHN4_SENSOR_IMX477_10BIT_9M_NOWDR_ATTR, sizeof(combo_dev_attr_t));}else if (6 == MipiDev){hi_memcpy(pstComboAttr, sizeof(combo_dev_attr_t), &MIPI_4lane_CHN6_SENSOR_IMX477_10BIT_9M_NOWDR_ATTR, sizeof(combo_dev_attr_t));}else{SAMPLE_PRT("unsupported mipi dev :%d for SnsType :%d\n", MipiDev, enSnsType);}break;case SONY_IMX477_MIPI_8M_60FPS_12BIT:if (0 == MipiDev){hi_memcpy(pstComboAttr, sizeof(combo_dev_attr_t), &MIPI_4lane_CHN0_SENSOR_IMX477_10BIT_8M_NOWDR_ATTR, sizeof(combo_dev_attr_t));}else if (2 == MipiDev){hi_memcpy(pstComboAttr, sizeof(combo_dev_attr_t), &MIPI_4lane_CHN2_SENSOR_IMX477_10BIT_8M_NOWDR_ATTR, sizeof(combo_dev_attr_t));}else if (4 == MipiDev){hi_memcpy(pstComboAttr, sizeof(combo_dev_attr_t), &MIPI_4lane_CHN2_SENSOR_IMX477_10BIT_8M_NOWDR_ATTR, sizeof(combo_dev_attr_t));}else if (6 == MipiDev){hi_memcpy(pstComboAttr, sizeof(combo_dev_attr_t), &MIPI_4lane_CHN4_SENSOR_IMX477_10BIT_8M_NOWDR_ATTR, sizeof(combo_dev_attr_t));}else{SAMPLE_PRT("unsupported mipi dev :%d for SnsType :%d\n",MipiDev, enSnsType);}break;case SONY_IMX477_MIPI_8M_30FPS_12BIT:if (0 == MipiDev){hi_memcpy(pstComboAttr, sizeof(combo_dev_attr_t), &MIPI_4lane_CHN0_SENSOR_IMX477_12BIT_8M_NOWDR_ATTR, sizeof(combo_dev_attr_t));}else if (2 == MipiDev){hi_memcpy(pstComboAttr, sizeof(combo_dev_attr_t), &MIPI_4lane_CHN2_SENSOR_IMX477_12BIT_8M_NOWDR_ATTR, sizeof(combo_dev_attr_t));}else if (4 == MipiDev){hi_memcpy(pstComboAttr, sizeof(combo_dev_attr_t), &MIPI_4lane_CHN2_SENSOR_IMX477_12BIT_8M_NOWDR_ATTR, sizeof(combo_dev_attr_t));}else if (6 == MipiDev){hi_memcpy(pstComboAttr, sizeof(combo_dev_attr_t), &MIPI_4lane_CHN4_SENSOR_IMX477_12BIT_8M_NOWDR_ATTR, sizeof(combo_dev_attr_t));}else{SAMPLE_PRT("unsupported mipi dev :%d for SnsType :%d\n",MipiDev, enSnsType);}break;case SONY_IMX290_MIPI_2M_30FPS_12BIT:if (0 == MipiDev){hi_memcpy(pstComboAttr, sizeof(combo_dev_attr_t), &MIPI_4lane_CHN0_SENSOR_IMX290_12BIT_2M_NOWDR_ATTR, sizeof(combo_dev_attr_t));}else if (1 == MipiDev){hi_memcpy(pstComboAttr, sizeof(combo_dev_attr_t), &MIPI_4lane_CHN1_SENSOR_IMX290_12BIT_2M_NOWDR_ATTR, sizeof(combo_dev_attr_t));}else{SAMPLE_PRT("unsupported mipi dev :%d for SnsType :%d\n",MipiDev, enSnsType);}break;case SONY_IMX290_MIPI_2M_30FPS_12BIT_WDR3TO1:hi_memcpy(pstComboAttr, sizeof(combo_dev_attr_t), &MIPI_4lane_CHN0_SENSOR_IMX290_10BIT_2M_WDR3to1_ATTR, sizeof(combo_dev_attr_t));break;case SONY_IMX334_SLAVE_MIPI_8M_30FPS_12BIT:case SONY_IMX334_MIPI_8M_30FPS_12BIT:hi_memcpy(pstComboAttr, sizeof(combo_dev_attr_t), &MIPI_4lane_CHN0_SENSOR_IMX334_12BIT_8M_NOWDR_ATTR, sizeof(combo_dev_attr_t));break;case SONY_IMX334_MIPI_8M_30FPS_12BIT_WDR2TO1:hi_memcpy(pstComboAttr, sizeof(combo_dev_attr_t), &MIPI_4lane_CHN0_SENSOR_IMX334_12BIT_8M_WDR2to1_ATTR, sizeof(combo_dev_attr_t));break;case SONY_IMX277_SLVS_8M_120FPS_10BIT:hi_memcpy(pstComboAttr, sizeof(combo_dev_attr_t), &SLVS_8lane_CHN0_SENSOR_IMX277_10BIT_8M_NOWDR_ATTR, sizeof(combo_dev_attr_t));break;case SONY_IMX277_SLVS_8M_30FPS_12BIT:case SONY_IMX277_SLVS_8M_60FPS_12BIT:hi_memcpy(pstComboAttr, sizeof(combo_dev_attr_t), &SLVS_6lane_CHN0_SENSOR_IMX277_12BIT_8M_NOWDR_ATTR, sizeof(combo_dev_attr_t));break;case SONY_IMX277_SLVS_12M_30FPS_12BIT:hi_memcpy(pstComboAttr, sizeof(combo_dev_attr_t), &SLVS_6lane_CHN0_SENSOR_IMX277_12BIT_12M_NOWDR_ATTR, sizeof(combo_dev_attr_t));break;case SONY_IMX277_SLVS_2M_240FPS_12BIT:hi_memcpy(pstComboAttr, sizeof(combo_dev_attr_t), &SLVS_6lane_CHN0_SENSOR_IMX277_12BIT_2M_NOWDR_ATTR, sizeof(combo_dev_attr_t));break;case FPGA_CYCLONE_LVDS_XM_XFPS_16BIT_1080P:hi_memcpy(pstComboAttr, sizeof(combo_dev_attr_t), &LVDS_4lane_CHN0_FPGA_CYCLONE_16BIT_xM_1080P_NOWDR_ATTR, sizeof(combo_dev_attr_t));break;case FPGA_CYCLONE_LVDS_XM_XFPS_16BIT_720P:hi_memcpy(pstComboAttr, sizeof(combo_dev_attr_t), &LVDS_4lane_CHN1_FPGA_CYCLONE_16BIT_xM_720P_NOWDR_ATTR, sizeof(combo_dev_attr_t));break;default:SAMPLE_PRT("not support enSnsType: %d\n", enSnsType);hi_memcpy(pstComboAttr, sizeof(combo_dev_attr_t), &MIPI_4lane_CHN0_SENSOR_IMX477_12BIT_12M_NOWDR_ATTR, sizeof(combo_dev_attr_t));}return HI_SUCCESS;
}

(3)

HI_S32 SAMPLE_COMM_VI_GetDevAttrBySns(SAMPLE_SNS_TYPE_E enSnsType, VI_DEV_ATTR_S* pstViDevAttr)
{switch (enSnsType){SAMPLE_PRT("!!!!!!!!!!!!!!!enSnsTypeis %d!",enSnsType);case SONY_IMX477_MIPI_12M_30FPS_12BIT:hi_memcpy(pstViDevAttr, sizeof(VI_DEV_ATTR_S), &DEV_ATTR_IMX477_12M_BASE, sizeof(VI_DEV_ATTR_S));break;case SONY_IMX477_MIPI_9M_50FPS_10BIT:hi_memcpy(pstViDevAttr, sizeof(VI_DEV_ATTR_S), &DEV_ATTR_IMX477_9M_BASE, sizeof(VI_DEV_ATTR_S));break;case SONY_IMX477_MIPI_8M_60FPS_12BIT:hi_memcpy(pstViDevAttr, sizeof(VI_DEV_ATTR_S), &DEV_ATTR_IMX477_8M_BASE, sizeof(VI_DEV_ATTR_S));break;case SONY_IMX477_MIPI_8M_30FPS_12BIT:hi_memcpy(pstViDevAttr, sizeof(VI_DEV_ATTR_S), &DEV_ATTR_IMX477_8M_BASE, sizeof(VI_DEV_ATTR_S));break;case SONY_IMX290_MIPI_2M_30FPS_12BIT:hi_memcpy(pstViDevAttr, sizeof(VI_DEV_ATTR_S), &DEV_ATTR_IMX290_2M_BASE, sizeof(VI_DEV_ATTR_S));break;case SONY_IMX290_MIPI_2M_30FPS_12BIT_WDR3TO1:hi_memcpy(pstViDevAttr, sizeof(VI_DEV_ATTR_S), &DEV_ATTR_IMX290_2M_BASE, sizeof(VI_DEV_ATTR_S));pstViDevAttr->au32ComponentMask[0] = 0xFFC00000;break;case SONY_IMX334_SLAVE_MIPI_8M_30FPS_12BIT:case SONY_IMX334_MIPI_8M_30FPS_12BIT:hi_memcpy(pstViDevAttr, sizeof(VI_DEV_ATTR_S), &DEV_ATTR_IMX334_8M_BASE, sizeof(VI_DEV_ATTR_S));break;case SONY_IMX334_MIPI_8M_30FPS_12BIT_WDR2TO1:hi_memcpy(pstViDevAttr, sizeof(VI_DEV_ATTR_S), &DEV_ATTR_IMX334_8M_WDR2TO1_BASE, sizeof(VI_DEV_ATTR_S));break;case SONY_IMX277_SLVS_8M_120FPS_10BIT:case SONY_IMX277_SLVS_8M_30FPS_12BIT:case SONY_IMX277_SLVS_8M_60FPS_12BIT:hi_memcpy(pstViDevAttr, sizeof(VI_DEV_ATTR_S), &DEV_ATTR_IMX277_SLVS_8M_BASE, sizeof(VI_DEV_ATTR_S));break;case SONY_IMX277_SLVS_12M_30FPS_12BIT:hi_memcpy(pstViDevAttr, sizeof(VI_DEV_ATTR_S), &DEV_ATTR_IMX277_SLVS_12M_BASE, sizeof(VI_DEV_ATTR_S));break;case SONY_IMX277_SLVS_2M_240FPS_12BIT:hi_memcpy(pstViDevAttr, sizeof(VI_DEV_ATTR_S), &DEV_ATTR_IMX277_SLVS_2M_BASE, sizeof(VI_DEV_ATTR_S));break;case FPGA_CYCLONE_LVDS_XM_XFPS_16BIT_1080P:hi_memcpy(pstViDevAttr, sizeof(VI_DEV_ATTR_S), &DEV_ATTR_FPGA_CYCLONE_1920x1080_BASE, sizeof(VI_DEV_ATTR_S));break;case FPGA_CYCLONE_LVDS_XM_XFPS_16BIT_720P:hi_memcpy(pstViDevAttr, sizeof(VI_DEV_ATTR_S), &DEV_ATTR_FPGA_CYCLONE_720x576_BASE, sizeof(VI_DEV_ATTR_S));break;default:hi_memcpy(pstViDevAttr, sizeof(VI_DEV_ATTR_S), &DEV_ATTR_IMX477_8M_BASE, sizeof(VI_DEV_ATTR_S));}return HI_SUCCESS;
}

(4)

HI_S32 SAMPLE_COMM_VI_GetPipeAttrBySns(SAMPLE_SNS_TYPE_E enSnsType, VI_PIPE_ATTR_S* pstPipeAttr)
{switch (enSnsType){SAMPLE_PRT("!!!!!!!!!!!!!!!enSnsTypeis %d!",enSnsType);case SONY_IMX477_MIPI_12M_30FPS_12BIT:hi_memcpy(pstPipeAttr, sizeof(VI_PIPE_ATTR_S), &PIPE_ATTR_4000x3000_RAW12_420_3DNR_RFR, sizeof(VI_PIPE_ATTR_S));break;case SONY_IMX477_MIPI_9M_50FPS_10BIT:hi_memcpy(pstPipeAttr, sizeof(VI_PIPE_ATTR_S), &PIPE_ATTR_3000x3000_RAW10_420_3DNR_RFR, sizeof(VI_PIPE_ATTR_S));break;case SONY_IMX477_MIPI_8M_60FPS_12BIT:hi_memcpy(pstPipeAttr, sizeof(VI_PIPE_ATTR_S), &PIPE_ATTR_3840x2160_RAW10_420_3DNR_RFR, sizeof(VI_PIPE_ATTR_S));break;case SONY_IMX477_MIPI_8M_30FPS_12BIT:hi_memcpy(pstPipeAttr, sizeof(VI_PIPE_ATTR_S), &PIPE_ATTR_3840x2160_RAW12_420_3DNR_RFR, sizeof(VI_PIPE_ATTR_S));break;case SONY_IMX290_MIPI_2M_30FPS_12BIT:hi_memcpy(pstPipeAttr, sizeof(VI_PIPE_ATTR_S), &PIPE_ATTR_1920x1080_RAW12_420_3DNR_RFR, sizeof(VI_PIPE_ATTR_S));break;case SONY_IMX290_MIPI_2M_30FPS_12BIT_WDR3TO1:hi_memcpy(pstPipeAttr, sizeof(VI_PIPE_ATTR_S), &PIPE_ATTR_1920x1080_RAW12_420_3DNR_RFR, sizeof(VI_PIPE_ATTR_S));pstPipeAttr->enPixFmt = PIXEL_FORMAT_RGB_BAYER_10BPP;pstPipeAttr->enBitWidth = DATA_BITWIDTH_10;break;case SONY_IMX334_SLAVE_MIPI_8M_30FPS_12BIT:case SONY_IMX334_MIPI_8M_30FPS_12BIT:hi_memcpy(pstPipeAttr, sizeof(VI_PIPE_ATTR_S), &PIPE_ATTR_3840x2160_RAW12_420_3DNR_RFR, sizeof(VI_PIPE_ATTR_S));break;case SONY_IMX334_MIPI_8M_30FPS_12BIT_WDR2TO1:hi_memcpy(pstPipeAttr, sizeof(VI_PIPE_ATTR_S), &PIPE_ATTR_3840x2160_RAW12_420_3DNR_RFR, sizeof(VI_PIPE_ATTR_S));break;case SONY_IMX277_SLVS_8M_120FPS_10BIT:hi_memcpy(pstPipeAttr, sizeof(VI_PIPE_ATTR_S), &PIPE_ATTR_3840x2160_RAW10_420_3DNR_RFR, sizeof(VI_PIPE_ATTR_S));break;case SONY_IMX277_SLVS_8M_30FPS_12BIT:case SONY_IMX277_SLVS_8M_60FPS_12BIT:hi_memcpy(pstPipeAttr, sizeof(VI_PIPE_ATTR_S), &PIPE_ATTR_3840x2160_RAW12_420_3DNR_RFR, sizeof(VI_PIPE_ATTR_S));break;case SONY_IMX277_SLVS_12M_30FPS_12BIT:hi_memcpy(pstPipeAttr, sizeof(VI_PIPE_ATTR_S), &PIPE_ATTR_4000x3000_RAW12_420_3DNR_RFR, sizeof(VI_PIPE_ATTR_S));break;case SONY_IMX277_SLVS_2M_240FPS_12BIT:hi_memcpy(pstPipeAttr, sizeof(VI_PIPE_ATTR_S), &PIPE_ATTR_1920x1080_RAW12_420_3DNR_RFR, sizeof(VI_PIPE_ATTR_S));break;case FPGA_CYCLONE_LVDS_XM_XFPS_16BIT_1080P:hi_memcpy(pstPipeAttr, sizeof(VI_PIPE_ATTR_S), &PIPE_FPGA_CYCLONE_ATTR_1920x1080_RAW16_422_3DNR_RFR, sizeof(VI_PIPE_ATTR_S));break;case FPGA_CYCLONE_LVDS_XM_XFPS_16BIT_720P:hi_memcpy(pstPipeAttr, sizeof(VI_PIPE_ATTR_S), &PIPE_FPGA_CYCLONE_ATTR_720x576_RAW16_422_3DNR_RFR, sizeof(VI_PIPE_ATTR_S));break;default:hi_memcpy(pstPipeAttr, sizeof(VI_PIPE_ATTR_S), &PIPE_ATTR_3840x2160_RAW12_420_3DNR_RFR, sizeof(VI_PIPE_ATTR_S));}return HI_SUCCESS;
}

(5)

HI_S32 SAMPLE_COMM_VI_GetChnAttrBySns(SAMPLE_SNS_TYPE_E enSnsType, VI_CHN_ATTR_S* pstChnAttr)
{switch (enSnsType){SAMPLE_PRT("!!!!!!!!!!!!!!!enSnsTypeis %d!",enSnsType);case SONY_IMX477_MIPI_12M_30FPS_12BIT:hi_memcpy(pstChnAttr, sizeof(VI_CHN_ATTR_S), &CHN_ATTR_4000x3000_420_SDR8_LINEAR, sizeof(VI_CHN_ATTR_S));break;case SONY_IMX477_MIPI_9M_50FPS_10BIT:hi_memcpy(pstChnAttr, sizeof(VI_CHN_ATTR_S), &CHN_ATTR_3000x3000_420_SDR8_LINEAR, sizeof(VI_CHN_ATTR_S));break;case SONY_IMX477_MIPI_8M_60FPS_12BIT:hi_memcpy(pstChnAttr, sizeof(VI_CHN_ATTR_S), &CHN_ATTR_3840x2160_420_SDR8_LINEAR, sizeof(VI_CHN_ATTR_S));break;case SONY_IMX477_MIPI_8M_30FPS_12BIT:hi_memcpy(pstChnAttr, sizeof(VI_CHN_ATTR_S), &CHN_ATTR_3840x2160_420_SDR8_LINEAR, sizeof(VI_CHN_ATTR_S));break;case SONY_IMX290_MIPI_2M_30FPS_12BIT:hi_memcpy(pstChnAttr, sizeof(VI_CHN_ATTR_S), &CHN_ATTR_1920x1080_420_SDR8_LINEAR, sizeof(VI_CHN_ATTR_S));break;case SONY_IMX290_MIPI_2M_30FPS_12BIT_WDR3TO1:hi_memcpy(pstChnAttr, sizeof(VI_CHN_ATTR_S), &CHN_ATTR_1920x1080_420_SDR8_LINEAR, sizeof(VI_CHN_ATTR_S));break;case SONY_IMX334_SLAVE_MIPI_8M_30FPS_12BIT:case SONY_IMX334_MIPI_8M_30FPS_12BIT:hi_memcpy(pstChnAttr, sizeof(VI_CHN_ATTR_S), &CHN_ATTR_3840x2160_420_SDR8_LINEAR, sizeof(VI_CHN_ATTR_S));break;case SONY_IMX334_MIPI_8M_30FPS_12BIT_WDR2TO1:hi_memcpy(pstChnAttr, sizeof(VI_CHN_ATTR_S), &CHN_ATTR_3840x2160_420_SDR8_LINEAR, sizeof(VI_CHN_ATTR_S));break;case SONY_IMX277_SLVS_8M_120FPS_10BIT:case SONY_IMX277_SLVS_8M_30FPS_12BIT:case SONY_IMX277_SLVS_8M_60FPS_12BIT:hi_memcpy(pstChnAttr, sizeof(VI_CHN_ATTR_S), &CHN_ATTR_3840x2160_420_SDR8_LINEAR, sizeof(VI_CHN_ATTR_S));break;case SONY_IMX277_SLVS_12M_30FPS_12BIT:hi_memcpy(pstChnAttr, sizeof(VI_CHN_ATTR_S), &CHN_ATTR_4000x3000_420_SDR8_LINEAR, sizeof(VI_CHN_ATTR_S));break;case SONY_IMX277_SLVS_2M_240FPS_12BIT:hi_memcpy(pstChnAttr, sizeof(VI_CHN_ATTR_S), &CHN_ATTR_1920x1080_420_SDR8_LINEAR, sizeof(VI_CHN_ATTR_S));break;case FPGA_CYCLONE_LVDS_XM_XFPS_16BIT_1080P:hi_memcpy(pstChnAttr, sizeof(VI_CHN_ATTR_S), &CHN_FPGA_ATTR_1920x1080_420_SDR8_LINEAR, sizeof(VI_CHN_ATTR_S));break;case FPGA_CYCLONE_LVDS_XM_XFPS_16BIT_720P:hi_memcpy(pstChnAttr, sizeof(VI_CHN_ATTR_S), &CHN_FPGA_ATTR_720x576_420_SDR8_LINEAR, sizeof(VI_CHN_ATTR_S));break;default:hi_memcpy(pstChnAttr, sizeof(VI_CHN_ATTR_S), &CHN_ATTR_3840x2160_420_SDR8_LINEAR, sizeof(VI_CHN_ATTR_S));}return HI_SUCCESS;
}

(6)

HI_S32 SAMPLE_COMM_VI_GetSizeBySensor(SAMPLE_SNS_TYPE_E enMode, PIC_SIZE_E* penSize)
{HI_S32 s32Ret = HI_SUCCESS;if (!penSize){return HI_FAILURE;}switch (enMode){SAMPLE_PRT("!!!!!!!!!!!!!!!enMode %d!",enMode);case SONY_IMX477_MIPI_12M_30FPS_12BIT:*penSize = PIC_4000x3000;break;case SONY_IMX477_MIPI_9M_50FPS_10BIT:*penSize = PIC_3000x3000;break;case SONY_IMX477_MIPI_8M_60FPS_12BIT:*penSize = PIC_3840x2160;break;case SONY_IMX477_MIPI_8M_30FPS_12BIT:*penSize = PIC_3840x2160;break;case SONY_IMX290_MIPI_2M_30FPS_12BIT:case SONY_IMX290_MIPI_2M_30FPS_12BIT_WDR3TO1:*penSize = PIC_1080P;break;case SONY_IMX334_SLAVE_MIPI_8M_30FPS_12BIT:case SONY_IMX334_MIPI_8M_30FPS_12BIT:case SONY_IMX334_MIPI_8M_30FPS_12BIT_WDR2TO1:*penSize = PIC_3840x2160;break;case SONY_IMX277_SLVS_8M_120FPS_10BIT:case SONY_IMX277_SLVS_8M_30FPS_12BIT:case SONY_IMX277_SLVS_8M_60FPS_12BIT:*penSize = PIC_3840x2160;break;case SONY_IMX277_SLVS_12M_30FPS_12BIT:*penSize = PIC_4000x3000;break;case SONY_IMX277_SLVS_2M_240FPS_12BIT:*penSize = PIC_1080P;break;case FPGA_CYCLONE_LVDS_XM_XFPS_16BIT_1080P:*penSize=PIC_1080P;break;case FPGA_CYCLONE_LVDS_XM_XFPS_16BIT_720P:*penSize=PIC_D1_PAL;break;default:*penSize = PIC_3840x2160;break;}return s32Ret;
}

(7)

combo_dev_t SAMPLE_COMM_VI_GetComboDevBySensor(SAMPLE_SNS_TYPE_E enMode, HI_S32 s32SnsIdx)
{combo_dev_t dev = 0;switch (enMode){SAMPLE_PRT("!!!!!!!!!!!!!!!enMode %d!",enMode);case SONY_IMX477_MIPI_12M_30FPS_12BIT:case SONY_IMX477_MIPI_9M_50FPS_10BIT:case SONY_IMX477_MIPI_8M_60FPS_12BIT:case SONY_IMX477_MIPI_8M_30FPS_12BIT:case SONY_IMX290_MIPI_2M_30FPS_12BIT:case SONY_IMX290_MIPI_2M_30FPS_12BIT_WDR3TO1:case SONY_IMX334_SLAVE_MIPI_8M_30FPS_12BIT:case SONY_IMX334_MIPI_8M_30FPS_12BIT:case SONY_IMX334_MIPI_8M_30FPS_12BIT_WDR2TO1:if(0 == s32SnsIdx){dev= 0;}else if(1 == s32SnsIdx){dev= 2;}else if(2 == s32SnsIdx){dev= 4;}else if(3 == s32SnsIdx){dev= 6;}break;case FPGA_CYCLONE_LVDS_XM_XFPS_16BIT_1080P:dev= 0;break;case FPGA_CYCLONE_LVDS_XM_XFPS_16BIT_720P:dev= 2;break;case SONY_IMX277_SLVS_8M_120FPS_10BIT:case SONY_IMX277_SLVS_8M_30FPS_12BIT:case SONY_IMX277_SLVS_8M_60FPS_12BIT:case SONY_IMX277_SLVS_12M_30FPS_12BIT:case SONY_IMX277_SLVS_2M_240FPS_12BIT:if(0 == s32SnsIdx){dev= 0;}else if(1 == s32SnsIdx){dev= 2; //8;}break;default:dev= 0;break;}return dev;
}

/* xin.han add fpgaDEV配置 参考FAQ3.3.5.2*/

VI_DEV_ATTR_S DEV_ATTR_FPGA_CYCLONE_1920x1080_BASE =
{VI_MODE_LVDS,VI_WORK_MODE_1Multiplex,{0xFF000000,    0x00FF0000},VI_SCAN_PROGRESSIVE,{-1, -1, -1, -1},VI_DATA_SEQ_UYVY,{/*port_vsync   port_vsync_neg     port_hsync        port_hsync_neg        */VI_VSYNC_PULSE, VI_VSYNC_NEG_LOW, VI_HSYNC_VALID_SINGNAL,VI_HSYNC_NEG_HIGH,VI_VSYNC_VALID_SINGAL,VI_VSYNC_VALID_NEG_HIGH,/*hsync_hfb    hsync_act    hsync_hhb*/{0,            1920,        0,/*vsync0_vhb vsync0_act vsync0_hhb*/0,            1080,        0,/*vsync1_vhb vsync1_act vsync1_hhb*/0,            0,            0}},VI_DATA_TYPE_YUV,HI_FALSE,{1920 , 1080},{{{1920 , 1080},},{VI_REPHASE_MODE_NONE,VI_REPHASE_MODE_NONE}},{WDR_MODE_NONE,1080},DATA_RATE_X1
};//fpga
VI_DEV_ATTR_S DEV_ATTR_FPGA_CYCLONE_720x576_BASE =
{VI_MODE_LVDS,VI_WORK_MODE_1Multiplex,{0xFF000000,    0x00FF0000},VI_SCAN_PROGRESSIVE,{-1, -1, -1, -1},VI_DATA_SEQ_UYVY,{/*port_vsync   port_vsync_neg     port_hsync        port_hsync_neg        */VI_VSYNC_PULSE, VI_VSYNC_NEG_LOW, VI_HSYNC_VALID_SINGNAL,VI_HSYNC_NEG_HIGH,VI_VSYNC_VALID_SINGAL,VI_VSYNC_VALID_NEG_HIGH,/*hsync_hfb    hsync_act    hsync_hhb*/{0,            720,        0,/*vsync0_vhb vsync0_act vsync0_hhb*/0,            288,        0,/*vsync1_vhb vsync1_act vsync1_hhb*/0,            0,            0}},VI_DATA_TYPE_YUV,HI_FALSE,{720 , 288},{{{720 , 288},},{VI_REPHASE_MODE_NONE,VI_REPHASE_MODE_NONE}},{WDR_MODE_NONE,288},DATA_RATE_X1
};

/* xin.han add fpga LVDS配置 参考FAQ3.3.5.1*/

combo_dev_attr_t LVDS_4lane_CHN0_FPGA_CYCLONE_16BIT_xM_1080P_NOWDR_ATTR =
{.devno = 0,.input_mode = INPUT_MODE_LVDS,.data_rate  = MIPI_DATA_RATE_X1,.img_rect   = {0, 0, 1920, 1080},.lvds_attr ={.input_data_type   = DATA_TYPE_RAW_16BIT,//pay attention to this.wdr_mode          = HI_WDR_MODE_NONE,.sync_mode         = LVDS_SYNC_MODE_SAV,.vsync_attr        = {LVDS_VSYNC_NORMAL, 0, 0},.fid_attr          = {LVDS_FID_NONE, HI_TRUE},.data_endian       = LVDS_ENDIAN_BIG,.sync_code_endian  = LVDS_ENDIAN_BIG,.lane_id = {0, 1, 2, 3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},.sync_code = {#if 1{{0xAB00, 0xB600, 0x8000, 0x9D00},      // lane 0{0xAB00, 0xB600, 0x8000, 0x9D00},{0xAB00, 0xB600, 0x8000, 0x9D00},{0xAB00, 0xB600, 0x8000, 0x9D00},},{{0xAB00, 0xB600, 0x8000, 0x9D00},      // lane 1{0xAB00, 0xB600, 0x8000, 0x9D00},{0xAB00, 0xB600, 0x8000, 0x9D00},{0xAB00, 0xB600, 0x8000, 0x9D00},},{{0xAB00, 0xB600, 0x8000, 0x9D00},      // lane 2{0xAB00, 0xB600, 0x8000, 0x9D00},{0xAB00, 0xB600, 0x8000, 0x9D00},{0xAB00, 0xB600, 0x8000, 0x9D00},},{{0xAB00, 0xB600, 0x8000, 0x9D00},      // lane 3{0xAB00, 0xB600, 0x8000, 0x9D00},{0xAB00, 0xB600, 0x8000, 0x9D00},{0xAB00, 0xB600, 0x8000, 0x9D00},},#else{{0xAC00, 0xB600, 0x8000, 0x9D00},      // lane 0{0xAC00, 0xB600, 0x8000, 0x9D00},{0xAC00, 0xB600, 0x8000, 0x9D00},{0xAC00, 0xB600, 0x8000, 0x9D00},},{{0xAC00, 0xB600, 0x8000, 0x9D00},      // lane 1{0xAC00, 0xB600, 0x8000, 0x9D00},{0xAC00, 0xB600, 0x8000, 0x9D00},{0xAC00, 0xB600, 0x8000, 0x9D00},},{{0xAC00, 0xB600, 0x8000, 0x9D00},      // lane 2{0xAC00, 0xB600, 0x8000, 0x9D00},{0xAC00, 0xB600, 0x8000, 0x9D00},{0xAC00, 0xB600, 0x8000, 0x9D00},},{{0xAC00, 0xB600, 0x8000, 0x9D00},      // lane 3{0xAC00, 0xB600, 0x8000, 0x9D00},{0xAC00, 0xB600, 0x8000, 0x9D00},{0xAC00, 0xB600, 0x8000, 0x9D00},},#endif}}
};combo_dev_attr_t LVDS_4lane_CHN1_FPGA_CYCLONE_16BIT_xM_720P_NOWDR_ATTR =
{.devno = 2,.input_mode = INPUT_MODE_LVDS,.data_rate  = MIPI_DATA_RATE_X1,.img_rect   = {0, 0, 720, 288},.lvds_attr ={.input_data_type   = DATA_TYPE_RAW_16BIT,//pay attention to this.wdr_mode          = HI_WDR_MODE_NONE,.sync_mode         = LVDS_SYNC_MODE_SAV,.vsync_attr        = {LVDS_VSYNC_NORMAL, 0, 0},.fid_attr          = {LVDS_FID_NONE, HI_TRUE},.data_endian       = LVDS_ENDIAN_BIG,.sync_code_endian  = LVDS_ENDIAN_BIG,.lane_id = {4, 5, 6, 7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},.sync_code = {#if 1{{0xAB00, 0xB600, 0x8000, 0x9D00},      // lane 0{0xAB00, 0xB600, 0x8000, 0x9D00},{0xAB00, 0xB600, 0x8000, 0x9D00},{0xAB00, 0xB600, 0x8000, 0x9D00},},{{0xAB00, 0xB600, 0x8000, 0x9D00},      // lane 1{0xAB00, 0xB600, 0x8000, 0x9D00},{0xAB00, 0xB600, 0x8000, 0x9D00},{0xAB00, 0xB600, 0x8000, 0x9D00},},{{0xAB00, 0xB600, 0x8000, 0x9D00},      // lane 2{0xAB00, 0xB600, 0x8000, 0x9D00},{0xAB00, 0xB600, 0x8000, 0x9D00},{0xAB00, 0xB600, 0x8000, 0x9D00},},{{0xAB00, 0xB600, 0x8000, 0x9D00},      // lane 3{0xAB00, 0xB600, 0x8000, 0x9D00},{0xAB00, 0xB600, 0x8000, 0x9D00},{0xAB00, 0xB600, 0x8000, 0x9D00},},#endif}}
};

/* xin.han add fpga pipe设置,参考FAQ3.3.5.3*/

VI_PIPE_ATTR_S PIPE_FPGA_CYCLONE_ATTR_1920x1080_RAW16_422_3DNR_RFR =
{VI_PIPE_BYPASS_NONE, HI_TRUE, HI_TRUE,1920, 1080,PIXEL_FORMAT_YVU_SEMIPLANAR_420,COMPRESS_MODE_NONE,DATA_BITWIDTH_8,HI_FALSE,{PIXEL_FORMAT_YVU_SEMIPLANAR_422,DATA_BITWIDTH_8,VI_NR_REF_FROM_RFR,COMPRESS_MODE_NONE},HI_FALSE,{ -1, -1}
};//fpga lvds input
VI_PIPE_ATTR_S PIPE_FPGA_CYCLONE_ATTR_720x576_RAW16_422_3DNR_RFR =
{VI_PIPE_BYPASS_NONE, HI_TRUE, HI_TRUE,720, 288,PIXEL_FORMAT_YVU_SEMIPLANAR_420,COMPRESS_MODE_NONE,DATA_BITWIDTH_8,HI_FALSE,{PIXEL_FORMAT_YVU_SEMIPLANAR_422,DATA_BITWIDTH_8,VI_NR_REF_FROM_RFR,COMPRESS_MODE_NONE},HI_FALSE,{ -1, -1}
};

/* xin.han add fpga*/

VI_CHN_ATTR_S CHN_FPGA_ATTR_1920x1080_420_SDR8_LINEAR =
{{1920, 1080},PIXEL_FORMAT_YVU_SEMIPLANAR_420,DYNAMIC_RANGE_SDR8,VIDEO_FORMAT_LINEAR,COMPRESS_MODE_NONE,0,      0,0,{ -1, -1}
};//cyclone fpga lvds input
VI_CHN_ATTR_S CHN_FPGA_ATTR_720x576_420_SDR8_LINEAR =
{{720, 288},PIXEL_FORMAT_YVU_SEMIPLANAR_420,DYNAMIC_RANGE_SDR8,VIDEO_FORMAT_LINEAR,COMPRESS_MODE_NONE,0,      0,0,{ -1, -1}
};

/* xin.han add fpga */

ISP_PUB_ATTR_S ISP_PUB_ATTR_FPGA_LVDS_xM_xFPS_1080P =
{{0, 0, 1920, 1080},{1920, 1080},30,BAYER_GRBG,WDR_MODE_NONE,0,
};//fpga lvds data
ISP_PUB_ATTR_S ISP_PUB_ATTR_FPGA_LVDS_xM_xFPS_720P =
{{0, 0, 720, 288},{720, 288},30,BAYER_GRBG,WDR_MODE_NONE,0,
};

6.sample/common路径下的sampl_comm_isp.c增加sensor类型

(1)

HI_S32 SAMPLE_COMM_ISP_GetIspAttrBySns(SAMPLE_SNS_TYPE_E enSnsType, ISP_PUB_ATTR_S* pstPubAttr)
{switch (enSnsType){case SONY_IMX477_MIPI_12M_30FPS_12BIT:memcpy(pstPubAttr, &ISP_PUB_ATTR_IMX477_12M_30FPS, sizeof(ISP_PUB_ATTR_S));break;case SONY_IMX477_MIPI_9M_50FPS_10BIT:memcpy(pstPubAttr, &ISP_PUB_ATTR_IMX477_9M_50FPS, sizeof(ISP_PUB_ATTR_S));break;case SONY_IMX477_MIPI_8M_60FPS_12BIT:memcpy(pstPubAttr, &ISP_PUB_ATTR_IMX477_8M_60FPS, sizeof(ISP_PUB_ATTR_S));break;case SONY_IMX477_MIPI_8M_30FPS_12BIT:memcpy(pstPubAttr, &ISP_PUB_ATTR_IMX477_8M_30FPS, sizeof(ISP_PUB_ATTR_S));break;case SONY_IMX290_MIPI_2M_30FPS_12BIT:memcpy(pstPubAttr, &ISP_PUB_ATTR_IMX290_2M_30FPS, sizeof(ISP_PUB_ATTR_S));break;case SONY_IMX290_MIPI_2M_30FPS_12BIT_WDR3TO1:memcpy(pstPubAttr, &ISP_PUB_ATTR_IMX290_MIPI_2M_30FPS_WDR3TO1_LINE, sizeof(ISP_PUB_ATTR_S));break;case SONY_IMX334_SLAVE_MIPI_8M_30FPS_12BIT:case SONY_IMX334_MIPI_8M_30FPS_12BIT:memcpy(pstPubAttr, &ISP_PUB_ATTR_IMX334_4K_30FPS, sizeof(ISP_PUB_ATTR_S));break;case SONY_IMX334_MIPI_8M_30FPS_12BIT_WDR2TO1:memcpy(pstPubAttr, &ISP_PUB_ATTR_IMX334_4K_30FPS_WDR2TO1_LINE, sizeof(ISP_PUB_ATTR_S));break;case SONY_IMX277_SLVS_8M_120FPS_10BIT:memcpy(pstPubAttr, &ISP_PUB_ATTR_IMX277_SLVS_8M_120FPS, sizeof(ISP_PUB_ATTR_S));break;case SONY_IMX277_SLVS_8M_30FPS_12BIT:memcpy(pstPubAttr, &ISP_PUB_ATTR_IMX277_SLVS_8M_30FPS, sizeof(ISP_PUB_ATTR_S));break;case SONY_IMX277_SLVS_8M_60FPS_12BIT:memcpy(pstPubAttr, &ISP_PUB_ATTR_IMX277_SLVS_8M_60FPS, sizeof(ISP_PUB_ATTR_S));break;case SONY_IMX277_SLVS_12M_30FPS_12BIT:memcpy(pstPubAttr, &ISP_PUB_ATTR_IMX277_SLVS_12M_30FPS, sizeof(ISP_PUB_ATTR_S));break;case SONY_IMX277_SLVS_2M_240FPS_12BIT:memcpy(pstPubAttr, &ISP_PUB_ATTR_IMX277_SLVS_2M_240FPS, sizeof(ISP_PUB_ATTR_S));break;case FPGA_CYCLONE_LVDS_XM_XFPS_16BIT_1080P:memcpy(pstPubAttr, &ISP_PUB_ATTR_FPGA_LVDS_xM_xFPS_1080P, sizeof(ISP_PUB_ATTR_S));break;case FPGA_CYCLONE_LVDS_XM_XFPS_16BIT_720P:memcpy(pstPubAttr, &ISP_PUB_ATTR_FPGA_LVDS_xM_xFPS_720P, sizeof(ISP_PUB_ATTR_S));break;default:memcpy(pstPubAttr, &ISP_PUB_ATTR_IMX477_8M_30FPS, sizeof(ISP_PUB_ATTR_S));break;}return HI_SUCCESS;
}

(2)

ISP_SNS_OBJ_S* SAMPLE_COMM_ISP_GetSnsObj(HI_U32 u32SnsId)
{SAMPLE_SNS_TYPE_E enSnsType;enSnsType = g_enSnsType[u32SnsId];switch (enSnsType){// printf("!!!!!!!!!!!!!!!enSnsTypeis %d!",enSnsType);case SONY_IMX477_MIPI_12M_30FPS_12BIT:case SONY_IMX477_MIPI_9M_50FPS_10BIT:case SONY_IMX477_MIPI_8M_60FPS_12BIT:case SONY_IMX477_MIPI_8M_30FPS_12BIT:return &stSnsImx477Obj;case SONY_IMX290_MIPI_2M_30FPS_12BIT:case SONY_IMX290_MIPI_2M_30FPS_12BIT_WDR3TO1:return &stSnsImx290Obj;case SONY_IMX334_SLAVE_MIPI_8M_30FPS_12BIT:return &stSnsImx334SlaveObj;case SONY_IMX334_MIPI_8M_30FPS_12BIT:case SONY_IMX334_MIPI_8M_30FPS_12BIT_WDR2TO1:return &stSnsImx334Obj;case SONY_IMX277_SLVS_8M_120FPS_10BIT:case SONY_IMX277_SLVS_8M_30FPS_12BIT:case SONY_IMX277_SLVS_8M_60FPS_12BIT:case SONY_IMX277_SLVS_12M_30FPS_12BIT:case SONY_IMX277_SLVS_2M_240FPS_12BIT:return &stSnsImx277SlvsObj;case FPGA_CYCLONE_LVDS_XM_XFPS_16BIT_1080P:return &stSnsLVDS0Obj;// return &stSnsImx477Obj;case FPGA_CYCLONE_LVDS_XM_XFPS_16BIT_720P:return &stSnsLVDS1Obj;// return &stSnsImx477Obj;default:return HI_NULL;}
}

7.component/isp/user/3a/include路径下的hi_awb_comm.h增加结构体(out/linux/multi-core/include)

typedef struct hiAWB_SENSOR_DEFAULT_S {HI_U16  u16WbRefTemp;       /* RW;reference color temperature for WB  */HI_U16  au16GainOffset[ISP_BAYER_CHN_NUM];  /* RW; gain offset for white balance */HI_S32  as32WbPara[AWB_CURVE_PARA_NUM];      /* RW; parameter for wb curve,p1,p2,q1,a1,b1,c1 */HI_U16  u16GoldenRgain;      /* Rgain for the golden sample */HI_U16  u16GoldenBgain;      /* Bgain for the golden sample */HI_U16  u16SampleRgain;      /* Rgain for the current sample */HI_U16  u16SampleBgain;      /* Bgain for the current sample */AWB_AGC_TABLE_S stAgcTbl;AWB_CCM_S stCcm;HI_U16    u16InitRgain;           /* Init WB gain */HI_U16    u16InitGgain;HI_U16    u16InitBgain;HI_U8     u8AWBRunInterval;       /* RW;AWB Run Interval */HI_U16    au16InitCCM[CCM_MATRIX_SIZE];ISP_SPECAWB_ATTR_S  stSpecAwbAttrs;ISP_SPECAWB_CAA_CONTROl_S stCaaControl;
} AWB_SENSOR_DEFAULT_S;

8. component/isp/include/arch/hi3559av100/include(out/linux/multi-core/include)下hi_comm_sns.h,注意类型

typedef struct hiISP_CMOS_DEFAULT_S {ISP_CMOS_ALG_KEY_U               unKey;const ISP_CMOS_DRC_S             *pstDrc;const ISP_CMOS_DEMOSAIC_S        *pstDemosaic;const ISP_CMOS_PREGAMMA_S        *pstPreGamma;const ISP_CMOS_GAMMA_S           *pstGamma;const ISP_CMOS_SHARPEN_S         *pstSharpen;const ISP_CMOS_EDGEMARK_S        *pstEdgeMark;const ISP_CMOS_LDCI_S            *pstLdci;const ISP_CMOS_DPC_S             *pstDpc;const ISP_CMOS_LSC_S             *pstLsc;const ISP_CMOS_RLSC_S            *pstRLsc;const ISP_CMOS_GE_S              *pstGe;const ISP_CMOS_ANTIFALSECOLOR_S  *pstAntiFalseColor;const ISP_CMOS_BAYERNR_S         *pstBayerNr;const ISP_CMOS_SPLIT_S           *pstSplit;const ISP_CMOS_CA_S              *pstCa;const ISP_CMOS_CLUT_S            *pstClut;const ISP_CMOS_LOGLUT_S          *pstLogLUT;const ISP_CMOS_PRELOGLUT_S       *pstPreLogLUT;const ISP_CMOS_WDR_S             *pstWdr;ISP_CMOS_NOISE_CALIBRATION_S     stNoiseCalibration;ISP_CMOS_SENSOR_MAX_RESOLUTION_S stSensorMaxResolution;ISP_CMOS_SENSOR_MODE_S           stSensorMode;ISP_CMOS_DNG_COLORPARAM_S        stDngColorParam;ISP_CMOS_WDR_SWITCH_ATTR_S       stWdrSwitchAttr;ISP_CMOS_AWB_ATTR_S              stAwbAttr;
} ISP_CMOS_DEFAULT_S;
需要在isp添加的源码文件中对应修改

9. component/isp/include/arch/hi3559av100/include(out/linux/multi-core/include)下hi_comm_sns.h,注意类型

typedef struct hiISP_CMOS_EDGEMARK_S {HI_BOOL bValid;HI_BOOL bEnable;               /* RW; Range:[0, 1]; Format:1.0;Enable/Disable Edge Mark */HI_U8   u8Threshold;           /* RW; range: [0, 255];  Format:8.0; */HI_U32  u32Color;              /* RW; range: [0, 0xFFFFFF];  Format:32.0; */
} ISP_CMOS_EDGEMARK_S;

10.sample/venc路径下的config.c增加sensor类型

(1)

HI_S32 PLATFORM_VI_GetSizeBySensor(SAMPLE_SNS_TYPE_E enMode, PIC_SIZE_E* penSize)
{HI_S32 s32Ret = HI_SUCCESS;if (!penSize){return HI_FAILURE;}switch (enMode){SAMPLE_PRT("!!!!!!!!!!!!!!!enMode %d!",enMode);case SONY_IMX477_MIPI_12M_30FPS_12BIT:*penSize = PIC_4000x3000;break;case SONY_IMX477_MIPI_9M_50FPS_10BIT:*penSize = PIC_3000x3000;break;case SONY_IMX477_MIPI_8M_60FPS_12BIT:*penSize = PIC_3840x2160;break;case SONY_IMX477_MIPI_8M_30FPS_12BIT:*penSize = PIC_3840x2160;break;case SONY_IMX290_MIPI_2M_30FPS_12BIT:case SONY_IMX290_MIPI_2M_30FPS_12BIT_WDR3TO1:*penSize = PIC_1080P;break;case SONY_IMX334_SLAVE_MIPI_8M_30FPS_12BIT:case SONY_IMX334_MIPI_8M_30FPS_12BIT:case SONY_IMX334_MIPI_8M_30FPS_12BIT_WDR2TO1:*penSize = PIC_3840x2160;break;case SONY_IMX277_SLVS_8M_120FPS_10BIT:case SONY_IMX277_SLVS_8M_30FPS_12BIT:case SONY_IMX277_SLVS_8M_60FPS_12BIT:*penSize = PIC_3840x2160;break;case SONY_IMX277_SLVS_12M_30FPS_12BIT:*penSize = PIC_4000x3000;break;case SONY_IMX277_SLVS_2M_240FPS_12BIT:*penSize = PIC_1080P;break;case FPGA_CYCLONE_LVDS_XM_XFPS_16BIT_1080P:*penSize=PIC_1080P;break;case FPGA_CYCLONE_LVDS_XM_XFPS_16BIT_720P:*penSize=PIC_D1_PAL;break;default:*penSize = PIC_3840x2160;break;}return s32Ret;
}

(2)

combo_dev_t PLATFORM_VI_GetComboDevBySensor(SAMPLE_SNS_TYPE_E enMode, HI_S32 s32SnsIdx)
{combo_dev_t dev = 0;switch (enMode){SAMPLE_PRT("!!!!!!!!!!!!!!!enMode %d!",enMode);case SONY_IMX477_MIPI_12M_30FPS_12BIT:case SONY_IMX477_MIPI_9M_50FPS_10BIT:case SONY_IMX477_MIPI_8M_60FPS_12BIT:case SONY_IMX477_MIPI_8M_30FPS_12BIT:case SONY_IMX290_MIPI_2M_30FPS_12BIT:case SONY_IMX290_MIPI_2M_30FPS_12BIT_WDR3TO1:case SONY_IMX334_SLAVE_MIPI_8M_30FPS_12BIT:case SONY_IMX334_MIPI_8M_30FPS_12BIT:case SONY_IMX334_MIPI_8M_30FPS_12BIT_WDR2TO1:if(0 == s32SnsIdx){dev= 0;}else if(1 == s32SnsIdx){dev= 2;}else if(2 == s32SnsIdx){dev= 4;}else if(3 == s32SnsIdx){dev= 6;}break;case FPGA_CYCLONE_LVDS_XM_XFPS_16BIT_1080P:dev= 0;break;case FPGA_CYCLONE_LVDS_XM_XFPS_16BIT_720P:dev= 2;break;case SONY_IMX277_SLVS_8M_120FPS_10BIT:case SONY_IMX277_SLVS_8M_30FPS_12BIT:case SONY_IMX277_SLVS_8M_60FPS_12BIT:case SONY_IMX277_SLVS_12M_30FPS_12BIT:case SONY_IMX277_SLVS_2M_240FPS_12BIT:if(0 == s32SnsIdx){dev= 0;}else if(1 == s32SnsIdx){dev= 2; //8;}break;default:dev= 0;break;}return dev;
}

海思3559万能平台搭建:添加一个新的sensor相关推荐

  1. 海思3559万能平台搭建:DDR移植的一些问题

    前言:   开发板是绝对无误的硬件环境,但是我们平时的开发肯定会接触自己搭建的硬件环境,难免会有这样那样的小问题,这里给出一次DDR的调试过程 问题描述   海思3559开发板可以用默认配置表格生成的 ...

  2. 海思3559万能平台搭建:串口编程

    前言   平常的工作使用中,总是免不了要和串口打交道,协议的收发也经常通过串口来实现,海思3559下的串口和标准的linux下串口大同小异,可以参考之前zynq的串口编程,也可以直接阅读本文 使能串口 ...

  3. 海思3559万能平台搭建:OSD实时叠加的支持1SDL库 FREETYPE库 SDL_TTF库的移植

    前言   万能平台字符叠加的功能自然少不了,但海思默认支持的都是静态位图,如果实时刷新或者我们向在屏幕上显示一些中文信息就捉襟见肘了,所以这里需要参考移植开源项目SDL的库来帮我们实现这一想法   网 ...

  4. 海思3559万能平台搭建:获取数据帧修改后编码

    前言   有了这么长的铺垫和反复的啃sample,现在开始搭建自己的平台就底气多了,倒也不至于万能平台哈哈,只是在完成配置文件的功能后,可以不用改代码重新编译,就可以实现多场景多平台多功能下的使用了 ...

  5. 海思3559万能平台搭建:在截获的YUV图像上画框

    前言   万里长征第二步,YUV的认识和编码还在进行中,熟悉了YUV格式的原理和储存方式后,我们就可以结合第一步中从vpss通道截获的YUV图像上尝试修改,叠加自己的算法,先简单粗暴的改改,后续在替换 ...

  6. 海思3559万能平台搭建:OSD功能的优化

    前言:   功能测试的OSD使用还是比较简单的,随便找个位置做个时间戳,背景还是黑色,且只能显示一行,很明显效果并不是那么理想,这里做一个升级,对海思区域叠加的配置以及osd窗口的创建等都在本文一并写 ...

  7. 海思3559万能平台搭建:OSD的自动反色

    前言   OSD功能在之前两篇中已经满足了大部分的应用场景,为了进一步提升效率和自适应环境亮度和反色,这里介绍改进方法 效率提升   我们之前整体的流程框架是这样的:TTF初始化,打开字体,区域初始化 ...

  8. 海思3559万能平台:VGS的画线处理

    前言   海思的OSD功能除了之前提到的第三方库,自己的VGS也可以做到一些简单的诸如画线之类的操作,这里介绍下假如类似识别时需要画矩形框的时候可以的一种做法 海思VGS简介   海思的VGS 是视频 ...

  9. (1)海思Hi3531DV100开发环境搭建

    海思Hi3531DV100开发环境搭建(1) (本方案在linkpi开发板Hi3531Dv100上测试) 一 安装SDK 1.Hi3531DV100 SDK包位置 在"Hi3531DV100 ...

最新文章

  1. ACMNO.30 C语言-宏交换 定义一个带参的宏,使两个参数的值互换,并写出程序,输入两个数作为使用宏时的实参。输出已交换后的两个值。
  2. MySQL优化篇:SHOW语法
  3. mysql中的EXPLAIN
  4. AndoridSQLite数据库开发基础教程(10)
  5. 一个极好的ALV例子
  6. Rust初步(三):使用atom搭配racer进行rust编程
  7. 使用rabbitMQ实现数据同步
  8. mysql ehcache_MyBatis使用Ehcache作为二级缓存
  9. mipony linux客户端,Mipony网盘下载工具
  10. Atitit.输入法配置说明v1 q229
  11. “请给我一个女朋友”“我给你一个大嘴巴子”,微信官方真给人实现愿望了...
  12. MAC使用find命令的正确办法
  13. Flutter6,移动设备开发网易云音乐app开发说明
  14. C6678信号处理板学习资料:基于6U VPX TMS320C6678+XC7K325T 的信号处理板
  15. WeUI—微信官方UI库
  16. 支付产品理解第一篇——使用第三方支付的信息流与资金流
  17. 谈谈我做拼音搜索的一点经验
  18. 文件服务器审计---首选Netwrix文件服务器审计工具
  19. python基础语言与应用第五章_《Python基础教程》 读书笔记 第五章(下)条件语句...
  20. 中标麒麟兆芯版7.0

热门文章

  1. 使用SAF Spectrum Compact频谱仪进行空闲信道评估
  2. 硬件采集数据怎么上传服务器,如何使用4G蓝牙网关进行数据采集和数据上传
  3. linux网络测试速度工具(更新)
  4. STM32入门笔记04_TIM定时器+案例:TIM定时器定时中断、定时器外部时钟
  5. java web html 的th是什么意思呢?
  6. 钉钉软件对计算机硬件的要求,钉钉部署需要什么前提
  7. RF化合物半导体市场规模将在2021年达到110亿美元
  8. 泊车收费管理系统-JAVA【数据库设计、源码、开题报告】
  9. 2. Antlr 的快速使用
  10. c语言中怎么随机字母,C ++程序生成随机字母