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支持的绑定模式¶
-
frame mode
占用多张yuv内存。(由depth设置决定),可以bind多个后级模块。
-
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)。
-
-
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支持的绑定模式¶
-
frame mode
占用多张yuv内存(由depth设置决定),可以bind多个后级模块。所有vpe port和divp都支持。
-
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
注意:
-
LDC支持OSD,可以attach直接画RGN
-
Vpe port0/½/3,都支持bind LDC channel。
-
代码参考
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内存,导致产生过多内存碎片。
注意:
-
不再需要private pool机制;
-
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使用场景¶
-
Snr0接4lane MIPI,Snr1接4lane MIPI场景
串接方式如下:
sensor(pad0)->vif(dev=0,chn=0,port=0)->vpe(eBindSensorId = E_MI_VPE_SENSOR0)->venc sensor(pad1)->vif(dev=2,chn=8,port=0)->vpe(eBindSensorId = 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
-
Snr0接两组2lane MIPI场景
-
Snr0接两组2lane MIPI场景
改用infinity6e-ssc013a-s01a-2+2mipi.dts配置管脚复用
串接方式如下:
sensor(pad0)->vif(dev=0,chn=0,port=0)->vpe(eBindSensorId = E_MI_VPE_SENSOR0)->venc sensor(pad2)->vif(dev=1,chn=4,port=0)->vpe(eBindSensorId = 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功能。