Ispahan与Padding平台软件开发差异


1. VPE场景差异


1.1. Ispahan典型场景

VPE 4个port的区别:

  • Port 0:既支持frame mode,也支持不占用内存的Realtime mode。

  • Port 1:既支持frame mode,也支持比较省内存的ring mode。

  • Port 2:只支持frame mode。

  • Port 3:虚拟Port(分辨率由Port2决定),后面必须通过Realtime mode绑定DIVP。

除了Port 3,其他Port之后都可以同时bind多个其他模块,DIVP/VENC/VDF 或者 出YUV数据。


1.2. Ispahan支持的绑定模式

  1. frame mode

    占用多张yuv内存。(由depth设置决定),可以bind多个后级模块。

  2. Realtime mode

    • 只支持port 0/3。

    • 当port 0做Realtime mode时,只支持bind JPEG(hardward限制,帧率最高只有sensor的一半)建议port 0出YUV422(E_MI_SYS_PIXEL_FRAME_YUV422_YUYV),此时不占DRAM内存,而是占用SRAM。独占JPEG(不能再创建其他JPEG)。

    • 当Port 3做Realtime mode时,只支持bind divp,并且port 3独占DVIP(不能再创建其他DIVP)。

  3. ring mode

    • 只支持port 1。

    • 当Port 1做ring mode时,只支持 bind H264/H265。

    • 只占用半张或者一张yuv的内存。

    • Bind 之前需要调用MI_VENC_SetInputSourceConfig()将VENC设置成E_MI_VENC_INPUT_MODE_RING_HALF_FRM or E_MI_VENC_INPUT_MODE_RING_ONE_FRM


1.3. Pudding典型场景

VPE 5个port的区别:

  • Port 0/½:既支持frame mode,也支持不占用内存的Realtime mode。

  • Port 1:输出YUV420时最大分辨率宽2688 以下,输出YUV422时则没限制(4096)。

  • Port 2:不带OSD,需要中间接DIVP才支持画OSD。

  • Port 3:不带OSD,不支持scale,因此只能输出sensor resolution(chn crop off)或者chn crop resolution(chn crop on)。

  • Port 4:一般不推荐使用,接RGBIR sensor时用于输出W/2 * H/2 的YUV420数据(IR数据填到Y,UV补0)。


1.4. Pudding支持的绑定模式

  1. frame mode

    占用多张yuv内存(由depth设置决定),可以bind多个后级模块。所有vpe port和divp都支持。

  2. Realtime mode

    • 只有jpeg支持,建议编码输入格式建议为YUV422(E_MI_SYS_PIXEL_FRAME_YUV422_YUYV),此时不占DRAM内存 。

    • 独占JPEG(不能再创建其他JPEG),独占vpe port(port后面不能再bind其他模块)。如果场景需要多个jpeg,则只能用frame mode。

    • 因为vpe port1有限制输出YUV420时最大分辨率宽2688 以下,输出YUV422则没限制。因此建议用port1做抓拍。


2. 新增LDC功能


2.1. LDC典型应用

以下为LDC典型应用之一鱼眼校正

图2-1 鱼眼校正前

图2-2 鱼眼校正后


2.2. VPE内部LDC

VPE内部LDC在多个port output生效。

图2-3 VPE内部LDC

流程:

MI_VPE_CreateChannel -> MI_VPE_LDCBegViewConfig -> MI_VPE_LDCSetViewConfig -> MI_VPE_LDCEndViewConfig -> MI_VPE_StartChannel

代码参考st_main_vpe.cpp


2.3. 外部bind LDC

外部bind LDC在单个port output生效。

图2-4 外部bind LDC

注意:

  1. LDC支持OSD,可以attach直接画RGN

  2. Vpe port0/½/3,都支持bind LDC channel。

  3. 代码参考st_main_ldc.cpp


2.4. LDC依赖文件

libmi_ldc.so/.a/.h:LDC的MI接口。

libeptz.a/mi_eptz.h:LDC的算法实现。

ldc_out.bin:调用接口加载LDC校正效果。


2.5. LDC bin文件制作

参考《镜头畸变校正LDC使用开发参考


2.6. 名词解释

EPTZ mode: equiangle rectilinear projection (直线投影)

ERP mode:equirectangular projection (等量矩形投影)

Donut mode:只支持 桌面/天花板 模式;只支持 1P/2P mode

P: pan 设备左右运动的角度。

T: tile 设备上下运动的角度

Z: zoom 放大缩小的倍数

Wall mode: 墙上模式

Ceiling mode: 天花板模式

Dest mode :桌面模式,与ceiling mode 刚好180 度相反


3. 新增MMU模块

Pudding对mma多加了一层HW_MMU,用来优化管理mma内存,避免长时间运行时,频繁申请释放mma内存,导致产生过多内存碎片。

注意:

  1. 不再需要private pool机制;

  2. cat /proc/mi_modules/mi_sys_mma/mma_heap_name0 里看到的是MMU的长度256M(但是实际被映射的mma空间一般没有这么大)。

若没开MMU,将mma用chunk表示挂在list下。

开了MMU,chunk表示256M vpa挂在list下。


4. 新增DLA深度学习模块


4.1. 网络模型转换成板端离线模型

请参考《DLA_SDK_User_Manual.pdf》、《DLA介绍.pdf》、《DLA介绍视频.mp4》。

4.2. 应用通过MI_IPU接口运行离线模型

以公板fdfr(人脸识别网络模型)为例: 提供sample code:mi_demo/dla_fdfr_vpe。


5. 双CPU核的使用

对于普通的应用,操作系统的默认调度机制是没有问题的。但是,当某个进程需要较高的运行效率时,就有必要考虑将其绑定到单独的核上运行,以减小由于在不同的核上调度造成的开销。Pudding SDK没有线程要求指定使用CPU核,可以根据产品实际功能自行设置。


5.1. 线程绑定指定的CPU

sched_setaffinity 指定线程运行在CPU0

sched_getaffinity 查线程绑定了哪个CPU


5.2. 中断绑定指定的CPU

查询中断信息:cat /proc/interrupts

查中断绑定了哪个CPU:cat /proc/irq/#IRQ/smp_affinity

CPU掩码(bitmask),例如绑定到CPU0,值为2的0次方(1);绑定到CPU1,值为2的1次方(2)。

设置中断绑定在CPU1:echo 2 > /proc/irq/#IRQ/smp_affinity


6. 支持多sensor出流


6.1. 多sensor使用场景

  1. Snr0接4lane MIPI,Snr1接4lane MIPI场景

    串接方式如下:

    sensor(pad0)->vif(dev=0,chn=0,port=0)->vpeeBindSensorId = E_MI_VPE_SENSOR0->venc
    
    sensor(pad1)->vif(dev=2,chn=8,port=0)->vpeeBindSensorId = E_MI_VPE_SENSOR1->venc
    

    insmod sensor驱动的时候, 需要注意:

    insmod /customer/imx291_MIPI.ko chmap=1 (对应pad0
    
    insmod /customer/imx307_MIPI.ko chmap=2 (对应pad1
    

    Sample code:

    sdk\verify\mi_demo\source\dualsensor
    
  2. Snr0接两组2lane MIPI场景

  3. Snr0接两组2lane MIPI场景

    改用infinity6e-ssc013a-s01a-2+2mipi.dts配置管脚复用

    串接方式如下:

    sensor(pad0)->vif(dev=0,chn=0,port=0)->vpeeBindSensorId = E_MI_VPE_SENSOR0->venc
    
    sensor(pad2)->vif(dev=1,chn=4,port=0)->vpeeBindSensorId = E_MI_VPE_SENSOR2->venc
    

    insmod sensor驱动的时候, 需要注意:

    insmod /customer/imx291_MIPI.ko chmap=1 (对应pad0
    
    insmod /customer/imx307_MIPI.ko chmap=4 (对应pad2
    

    需要设置vif dev和sensor pad对应关系

    stDev2SnrPad[0].eSensorPadID = E_MI_VIF_SNRPAD_ID_0;
    
    stDev2SnrPad[0].u32PlaneID = 0xff;
    
    stDev2SnrPad[1].eSensorPadID = E_MI_VIF_SNRPAD_ID_2;
    
    stDev2SnrPad[1].u32PlaneID = 0xff;
    
    stDev2SnrPad[2].eSensorPadID = E_MI_VIF_SNRPAD_ID_1;
    
    stDev2SnrPad[2].u32PlaneID = 0xff;
    
    MI_VIF_SetDev2SnrPadMux(stDev2SnrPad, 4);
    

    Sample code:

    sdk\verify\mi_demo\source\dualsensor
    

6.2. 硬件性能支持

QFN封装只有一组SR0,只支持2个2lane sensor;BGA封装有两组SR0和SR1,即支持2个lane sensor,也可以接2个4lane sensor;

一个isp硬件,sensor数据给isp 进行图像处理,需要进行分时复用;

只支持一路sensor开hdr功能。