PYM(Pyramid),又名图像金字塔处理单元,主要用于对图像数据预处理后输出多通道数据,其中包括原图、高斯、线性变换、Downscale、Upscale操作等。
1. 硬件特性

PYM0/1、2模块差异:
模块特征 | 原图 | US ROI | 高斯 | 双线性 | DS ROI | Input Mode | Shadow Register |
|---|---|---|---|---|---|---|---|
PYM 0/1 | 1 | 1 | 5 | 5 | 6 | online/offline | 8组 |
PYM2 LITE | 1 | 1 | 1 | 5 | / | 3 (0-2) | 1组 |
PYM模块规格如下:
Online输入图像格式YUV422/YUV420
Offline输入图像格式YUV420 semi-planar,支持输入stride
输出图像格式YUV420 semi-planar
支持帧率:3840*2160@30fps
原图输出:
Y和UV可单独使能
可crop输出
有输出stride
双线性下采样基础层:
层数:5层
每层缩放图像支持输出可单独使能,Y和UV可单独使能
可crop 输出
有输出stride
高斯下采样基础层:
层数:5层
每层缩放图像支持输出可单独使能,Y和UV可单独使能
支持可配置垂直5x1和水平1x5的6-bit signed滤波系数模板
可crop输出
有输出stride
边界padding方式:mirror_101
DownScale ROI :
层数:6层
每层缩放图像支持输出可单独使能,Y和UV可单独使能
可crop输出,
有输出 stride
缩放范围[1/2,1]
可配置水平和垂直的初始相位[0~65535]
UpScale :
层数:1层
最大输出宽度2048
最大输出高度2048
每层缩放图像支持输出可单独使能,Y和UV可单独使能
可crop输入(roi)
输出stride
水平和垂直缩放范围[1,4].
可配置水平和垂直的初始相位[-65536~65535][-1,1)精度1/65535
输出中断
输入8个水位监测中断
frame_start、frame_done
数据溢出中断
Size error
Time out
2. 功能描述
PYM模块为VPS模块的子模块,可片内总线直连接收来自CIM/ISP模块的图像数据,也可以通过DDR接收来自CIM DMA/ISP模块的图像数据。
PYM模块支持五种数据处理模式:
序号
处理模式
1
原图
2
高斯变化
3
线性变换
4
Downscale
5
Upscale
PYM卷积参数使用说明:
序号
卷积参数说明
1
BL层输出没有参数可配,是固化的参数
2
GS 层可以配置参数(配置文件中对应的GS层卷积核参数), 默认寄存器参数就是高斯模版;如果参数使用线性模版参数 GS层输出就变成了双线性(目前默认的配置文件中配置是线性输出,GS输出的实际是双线性)
3
目前卷积核配置参数由DE提供模板参数,暂不推荐其他参数。
4
Coeff 值范围(-32 ~ 31)Shitf值范围 (0~15)
5
卷积参数配置规则:y_v [0,1,2,3,4] * y_h [0,1,2,3,4] = 2 ^ y_shift (依赖规则4)
列表项PYM卷积参数模板(推荐):
coeff0
coeff1
coeff2
coeff3
coeff4
right shift
说明
0
0
1
0
0
0
-
0
1
0
1
0
2
-
0
1
2
1
0
4
-
1
2
2
2
1
6
-
1
4
6
4
1
8
高斯(默认配置参数)
3
6
14
6
3
10
-
8
14
20
14
8
12
-
23
26
30
26
23
14
-
1
-5
9
-5
1
0
-
1
-7
14
-7
1
2
-
-10
3
18
3
-10
4
-
-14
5
26
5
-14
6
-
10
-17
30
-17
10
8
-
26
-22
24
-22
26
10
-
28
-11
30
-11
28
12
-
24
26
28
26
24
14
-
0
3
10
3
0
8
-
0
0
1
1
0
2
双线性配置参数
u3000u3000
3. 模块使用说明
- 工作模式
使用PYM之前必须根据应用场景的特点选择合适工作模式。工作模式
模式说明
离线模式
回灌模式使用。输入:YUV420SP,输出:YUV420SP
单路Online
ISP-PYM硬件直连模式.。只能在单路ISP PASS_THRU模式或者 CIM直连PYM使用
Junction 模式
驱动底层链接CIM DMA数据,YUV数据可用
ISP TDMF联动模式
限定使用:多路场景下ISP 设置TDMF ,并且多路的PYM 输入输出分辨率设置都相同,"isp_stream_output_format": 1 需使能;
注:不是多路场景首选项ISP Manual联动模式
单路或者多路可选。ISP-PYM协同切换配置,支持每个数据通道不同输出尺寸
注:多路首选配置
4. 配置参数说明
- PYM工作参数配置集成在VPM模块配置文件中,共有pym_config、pym_ctrl两个配置节点:
名称
类型
最小值
最大值
默认值
描述
备注
pym_config
node
-
-
-
pym模块通用配置
-
pym_ctrl
node
-
-
-
pym输出配置
-
pym_config配置说明
名称
类型
最小值
最大值
默认值
描述
备注
pym_hw_id
number
0
1
0
pym硬件id号
通路配置使用的pym硬件id; 必须显式配置;
pym_mode
number
0
4
0
pym工作模式
0: 离线模式(输入:YUV420SP, 输出:YUV420SP);回灌模式使用;
1: 单路Online(cim-pym硬件直连,isp(paththrough模式)-pym)模式,
2: Junction mode(驱动底层链接cim dma数据)。
3:特殊模式,限定使用:isp设置Tdmf模式时使用,并且多路的isp和pym输入输出分辨率设置都需要相同;"isp_stream_output_format": 1 需使能;
4: 特殊模式,限定使用,isp设置 Manual模式时使用,多路可支持isp和pym设置不同尺寸;"isp_stream_output_format": 1 需使能;
必须显式配置;output_buf_num
number
0
32/64
0
pym输出buf个数
配置pym输出buf数目;
当pym离线模式时,回灌src buf数目也按照该数目默认分配;
配合isp非tdmf模式下最多配置32个;
配合isp tdmf模式下最多配置64个;
注: 配合isp tdmf模式下配置buf实际是多路平分;
Eg:四路数据使用isp0 tdmf 以及pym0. 配置数目64(每路都需要配置64),每路可用pym数目64/4。
必须显式配置。pingpong_ring
number
0
1
0
pym驱动底层强制预留轮转使能
0: 默认底层不留buf,用户可以获取所有buf;
1: 底层留2块buf做轮转,用户最多能拿N-2帧(N为配置的输出buf数目);
注:在用户拿到数据需要处理很久但又不返还buf给硬件时,该模式能确保用户再次开始循环获取数据时能得到尽量新的数据帧;
可以不显式配置,使用默认值。in_buf_noclean
number
0
1
0
pym输入内存cache刷新使能
0: 模块输入buf内部会执行flush cache操作;
1: 模块输入buf内部不会执行flush cache操作;
可以不显式配置,使用默认值。
注:如果不配置该项,用户使用回灌时,如果内存是cache类型且进行了cpu参与的操作,需要用户使用hbmem对应接口刷新。out_buf_noinvalid
number
0
1
0
pym输出内存cache刷新使能
0: 模块输出buf内部会执行invaild cache操作;
1: 模块输出buf内部不会执行invaild cache操作;
可以不显式配置,使用默认值。
注:如果不配置该项,用户拿到图像内存时,如果内存是cache类型且需要进行cpu参与的操作,需要用户使用hbmem对应接口刷新。in_buf_noncached
number
0
1
0
pym输入内存分配类型
0: 模块输入buf(一般回灌buf)不使能 non-cache内存分配,实际类型为cache;
1: 模块输入buf使能non-cache内存分配,实际类型为non-cache;
可以不显式配置,使用默认值。out_buf_noncached
number
0
1
0
pym输出内存分配类型
0: 模块输出buf不使能 non-cache 内存分配,实际类型为cache;
1: 模块输出buf使能 non-cache内存分配,实际类型为non-cache;
可以不显式配置,使用默认值。time_out
number
1
10000
4000
获取pym数据超时配置(单位ms)
使用接口获取pym数据时生效;
若设置超时时间为0,内部使用默认超时时间;
可以不显式配置,使用默认值。y_hor_coeff
number
0
255
0
y分量水平卷积参数
表示 0~4 序号;
需要满足参数条件,参考前述pym卷积核参数;
不建议改动;
必须显式配置。y_ver_coeff
number
0
255
0
y分量纵向卷积参数
表示 0~4 序号;
需要满足参数条件,参考前述pym卷积核参数;
不建议改动;
必须显式配置。c_hor_coeff
number
0
255
0
c(uv)分量水平卷积参数
表示 0~4 序号;
需要满足参数条件,参考前述 pym卷积核参数;
不建议改动;
必须显式配置。c_ver_coeff
number
0
255
0
c(uv)分量纵向卷积参数
表示 0~4 序号;
需要满足参数条件,参考前述 pym卷积核参数;
不建议改动;
必须显式配置。y_right_shift
number
0
max ~ (uint32)
0
y分量偏移参数
需要满足参数条件,参考前述 pym卷积核参数;
不建议改动;
必须显式配置。c_right_shift
number
0
max ~ (uint32)
0
c(uv)分量偏移参数
需要满足参数条件,参考前述 pym卷积核参数;
不建议改动;
必须显式配置。pym_ctrl配置 说明
名称
类型
最小值
最大值
默认值
描述
备注
source_en
number
0
1
0
原图输出使能
必须显式配置。
src_uv_bypass
number
0
1
0
原图UV bypass使能
必须显式配置。
src_in_width
number
32
4096
0
原图输入宽度
偶数要求;
必须显式配置。src_in_height
number
32
4096
0
原图输入高度
偶数要求;
必须显式配置。src_in_stride_y
number
32
4096
0
y分量输入stride
要求16对齐;
必须显式配置。src_in_stride_uv
number
32
4096
0
uv分量输入stride
要求16对齐;
必须显式配置。src_start_top
number
0
4096
0
原图roi起始行坐标
src_start_top + src_region_height <= src_in_height;
必须显式配置。src_start_left
number
0
4096
0
原图roi起始列坐标
src_start_left+ src_region_width <= src_in_width;
必须显式配置。src_region_width
number
32
4096
0
原图roi宽度
偶数要求;
src_start_left+ src_region_width <= src_in_width;
必须显式配置。src_region_height
number
32
4096
0
原图roi高度
偶数要求;
src_start_top + src_region_height <= src_in_height;
必须显式配置。src_out_stride_y
number
0
4096
0
y分量输出stride
要求16对齐;
必须大于src_region_width;
必须显式配置。src_out_stride_uv
number
0
4096
0
uv分量输出stride
要求16对齐;
必须大于src_region_width;
必须显式配置。suffix_hb_val
number
0
152
60
输入图像整形HBLANK 后半部参数
推荐[60,152];
配置文件默认显式配置68;
必须显式配置。prefix_hb_val
number
2
2
2
输入图像整形HBLANK 前半部参数
推荐[2];
硬件参数,不建议改动;
配置文件默认显式配置2;
必须显式配置。suffix_vb_val
number
0
20
20
输入图像整形VBLANK 后半部参数
推荐[13,20];
硬件参数,不建议改动;
配置文件默认显式配置20;
必须显式配置。prefix_vb_val
number
0
2
2
输入图像整形VBLANK 前半部参数
推荐[1,2];
硬件参数,不建议改动;
配置文件默认显式配置2;
必须显式配置。pixel_num_before_sol
number
0
500
16
开始一行需要积累的像素个数,配置的数值小于等于(一行的宽度/8)-2, 上限500
硬件参数,不建议改动;
必须显式配置。gs_max_layer_en
number
0
5
0
高斯硬件基础层数使能
硬件层工作使能;
设置3则使能硬件0,1,2层;按顺序递增使能;
必须显式配置。gs_en
number
0
31
0
高斯层软件输出使能
按bit 位设置使能对应层,对应为设置为1则打开该层输出。
Eg:bit 0 位对应 第一层 gs, 设置1 则只使能gs0;
要输出gs4则需要配置gs_max_layer_en为5;
必须显式配置。gs_uv_bypass
number
0
31
0
高斯uv bypass使能
按bit 位设置控制对应层,对应为设置为1 则该层uv不输出;
必须显式配置。gauss_info
node
-
-
-
高斯层输出配置组
共五组,详细图层配置请参考卷积参数模板
bl_max_layer_en
number
0
5
0
线性硬件基础层数使能
硬件层工作使能;
设置3则使能硬件0,1,2层;按顺序递增使能;
必须显式配置。bl_en
number
0
31
0
线性基础层使能
按bit 位设置使能对应层,对应为设置为1则打开该层输出;
要输出bl4则需要配置bl_max_layer_en为5;
必须显式配置。bl_uv_bypass
number
0
31
0
线性uv bypass使能
按bit 位设置使能对应层,对应为设置为1则该层uv不输出;
必须显式配置。bilinear_info
node
-
-
-
线性基础层输出配置
共五组,详细图层配置请参考卷积参数模板
upscale_roi_en
number
0
1
0
Upscale层使能
必须显式配置。
us_roi_uv_bypass
number
0
1
0
Upscale层uv bypass使能
必须显式配置。
us_roi_start_top
number
0
4096
0
Upscale层ROI 起始行坐标
us以原图为基准输入;
us_roi_start_top + us_roi_region_height <= src_in_height;
必须显式配置。us_roi_start_left
number
0
4096
0
Upscale层ROI 起始列坐标
us以原图为基准输入;
us_roi_start_left+ us_roi_region_width <= src_in_width;
必须显式配置。us_roi_region_width
number
32
2048
0
Upscale层ROI区域宽度
要求偶数;
小于等于us_roi_out_width;
必须显式配置。us_roi_region_height
number
32
2048
0
Upscale层ROI区域高度
要求偶数;
小于等于us_roi_out_height;
必须显式配置。us_roi_out_width
number
32
2048
0
Upscale层输出宽度
要求偶数;
放大倍数基于us_roi_region_width [1,4];
允许设置跟源数据一样大小,设置同尺寸时,其实硬件内部参数有微小放大(65536/65535)
必须显式配置。us_roi_out_height
number
32
2048
0
Upscale层输出高度
要求偶数;
放大倍数基于us_roi_region_height[1,4];
许设置跟源数据一样大小,设置同尺寸时,其实硬件内部参数有微小放大(65536/65535)
必须显式配置。us_roi_stride_y
number
32
4096
0
Upscale层ROI区域y stride
要求16 对齐,且不能小于us_roi_region_width;
必须显式配置。us_roi_stride_uv
number
32
4096
0
Upscale层ROI区域uv stride
要求16 对齐,且不能小于us_roi_region_width;
ds_roi_en
number
0
63
0
Downscale层输出使能
按bit位使能,一共6个downscale层;
必须显式配置。ds_roi_uv_bypass
number
0
63
0
Downscale层uv bypass使能
按bit位使能,对应为设置为1则该层uv不输出;
必须显式配置。ds_roi
node
-
-
-
Downscale层输出配置
共五组,详细图层配置请参考卷积参数模板
pre_line_int_set
number
0
4096
0
水位中断行数
表示“0~7”最多可设置8个水位中断;
注:当收到设置行数,硬件收到对应数据量图像后立即上报中断,pym数据获取接口可以拿到该水位下的图像(非完整帧)。
此处建议只设置一级,不建议设置多级,如二分之一行数 1080;
必须显式配置。- PYM多图层输出配置
pym_ctrl中包含了pym输出的单通道配置以及以下多图层输出配置组。名称
类型
最小值
最大值
默认值
描述
备注
gauss_info
node
-
-
-
配置节点
高斯金字塔层配置,共五组
bilinear_info
node
-
-
-
配置节点
双线性金字塔层配置,共五组
ds_roi
node
-
-
-
配置节点
Downscale层,共六层
GS/BL/DS配置
名称
类型
最小值
最大值
默认值
描述
备注
gauss_info
node
-
-
-
配置节点
高斯金字塔层配置,共五组;
每一层gs层默认处理源输入对应原图层1/2,以此倍减(与原图层DDR输出使能与否无关);
Eg: gs0层硬件处理输入为src_in_width/2,src_in_height/2;
gs1层硬件输入为src_in_width/4,src_in_height/4;
以此类推;gs_start_top
number
0
4096
0
gs层roi 起始行坐标
gs_start_top + gs_region_height <= 对应层硬件输入height;
必须显式配置。gs_start_left
number
0
4096
0
gs层roi 起始列坐标
gs_start_left+ gs_region_width <= 对应层硬件输入width;
必须显式配置。gs_region_width
number
32
4096
0
gs层输出宽度
要求偶数;
gs_start_left+ gs_region_width <= 对应层硬件输入width;
必须显式配置。gs_region_height
number
32
4096
0
gs层输出高度
要求偶数;
gs_start_top + gs_region_height <= 对应层硬件输入height;
必须显式配置。gs_stride_y
number
32
4096
0
gs层输出y分量stride
要求16 对齐,且不能小于gs_region_width;
必须显式配置。gs_stride_uv
number
32
4096
0
gs层输出uv分量stride
要求16 对齐,且不能小于gs_region_width;
必须显式配置。bilinear_info
node
-
-
-
配置节点
双线性金字塔层配置,共五组;
每一层bl层默认处理源输入对应原图层1/2,以此倍减(与原图层DDR输出使能与否无关);
Eg: bl0层硬件处理输入为src_in_width/2,src_in_height/2;
bl1层硬件输入为src_in_width/4,src_in_height/4;
以此类推;
注:pym2不支持bl层输出bl_start_top
number
0
4096
0
bl层roi 起始行坐标
bl_start_top + bl_region_height <= 对应层硬件输入height;
必须显式配置。bl_start_left
number
0
4096
0
bl层roi 起始列坐标
bl_start_left+ bl_region_width<= 对应层硬件输入width;
必须显式配置。bl_region_width
number
32
4096
0
bl层输出宽度
要求偶数;
bl_start_left+ bl_region_width<= 对应层硬件输入width;
必须显式配置。bl_region_height
number
32
4096
0
gs层输出宽度
要求偶数;
bl_start_top + bl_region_height <= 对应层硬件输入height;
必须显式配置。bl_stride_y
number
32
4096
0
bl层输出y分量stride
要求16 对齐,且不能小于bl_region_width;
必须显式配置。bl_stride_uv
number
32
4096
0
bl层输出uv分量stride
要求16 对齐,且不能小于bl_region_width;
必须显式配置。ds_roi
node
-
-
-
配置节点
Downscale层,共六层,
Downscale每层可以选择从原图层或者gs,bl中的某一层输入源作为该层处理源数据然后进行roi以及downscale处理。
注:pym2 不支持 ds3~ds5;
pym2不支持选择bl作为处理源数据。ds_roi_layer
number
0
5
0
选择donwscale层的源数据来源
选择源图层数据来源,layer index for bl or gs;
选原图层则不用关注;
必须显式配置。ds_roi_sel
number
0
2
0
源图像类型选择
原图层:0
bl层 :1
gs层:2
注:选bl或者gs层还需要指定ds_roi_layer,并且确保对应的硬件层使能;
必须显式配置。ds_roi_start_top
number
0
4096
0
ds层roi 起始行坐标
选原图层:
ds_roi_start_top + ds_roi_region_height <= src_in_height;
选bl或gs层:
ds_roi_start_top + ds_roi_region_height <= 选中对应层的输入源height;
必须显式配置。ds_roi_start_left
number
0
4096
0
ds层roi 起始列坐标
选原图层:
ds_roi_start_left + ds_roi_region_width <= src_in_width;
选bl或gs层:
ds_roi_start_left + ds_roi_region_width <= 选中对应层的输入源width;
必须显式配置。ds_roi_region_height
number
32
4096
0
ds层roi宽度
要求偶数;
选原图层:
ds_roi_start_top + ds_roi_region_height <= src_in_height;
选bl或gs层:
ds_roi_start_top + ds_roi_region_height <= 选中对应层的输入源height;
必须显式配置。ds_roi_region_width
number
32
4096
0
ds层roi高度
要求偶数;
选原图层:
ds_roi_start_left + ds_roi_region_width <= src_in_width;
选bl或gs层:
ds_roi_start_left + ds_roi_region_width <= 选中对应层的输入源width;
必须显式配置。ds_roi_stride_y
number
32
4096
0
ds层y分量stride
要求16 对齐,且不能小于对应ds_roi_region_width;
必须显式配置。ds_roi_stride_uv
number
32
4096
0
ds层uv分量stride
要求16 对齐,且不能小于对应ds_roi_region_width;
必须显式配置。ds_roi_out_width
number
32
4096
0
ds层输出宽度
要求偶数;
缩小倍率为 ds_roi_region_width的[1,1/2)
必须显式配置。ds_roi_out_height
number
32
4096
0
ds层输出高度
要求偶数;
缩小倍率为 ds_roi_region_height的[1,1/2)
必须显式配置。- 模块关联配置
PYM模块与其它模块存在一些关联配置逻辑,参考以下说明:关联模块
配置说明
CIM
CIM在配置文件中可选择直连到PYM0或者1(YUV格式)
CIM DMA
CIMDMA数据可以通过PYM模式配置后,从驱动中将CIMDMA收到的数据直接送给PYM处理,PYM模式配置为2(Junction mode)
ISP
配置多路ISP TDMF直连PYM模式,每路PYM输出BUF数,以及输入输出的设置需要一致。
注:驱动按第一个初始化的用户buf数目初始化底层队列深度,多用户共用buf队列,如果数目不一致,可能出现的情况是拿到超出自己设定的buf数目大小的BUF index(第一个用户设置了大的buf数,其他用户设置的比较小)。ISP
关于硬件直连(OTF),ISP0只能直连到PYM0,ISP1只能直连到PYM1,硬件限定不可配。
4. 接口使用说明
接口函数列表
- hb_vio_run_pym
【函数声明】
int hb_vio_run_pym(uint32_t pipeline_id, hb_vio_buffer_t * src_img_info)【功能描述】
设置对应 pipeline 的 pym 模块,并使能 pym 处理传入的 src 数据;【参数描述】
参数名称
描述
输入/输出
uint32_t pipeline_id
表示要设置的软件数据通路,需要是已经初始化并使能的通路
输入
hb_vio_buffer_t * src_img_info
表示需要 pym 处理的原图信息。
输入
【返回值】
成功:正常为 HB_VIO_NO_ERR 0
失败:异常为负值错误码,参考 1.4.1 VIO 返回码说明。【兼容性】
系统版本 1.0 及以上 - hb_vio_free_pymbuf
【函数声明】
int32_t hb_vio_free_pymbuf(uint32_t pipeline_id, VIO_DATA_TYPE_E data_type, void *img_info)【功能描述】
释放对应 pipeline_id pym 通过 hb_vio_get_data 获取的 buffer 信息。【参数描述】
参数名称
描述
输入/输出
uint32_t pipeline_id
表示要设置的软件数据通路,需要是已经初始化并使能的通路
输入
VIO_DATA_TYPE_E data_type
表示需要释放的信息类型(类型说明同 hb_vio_get_data)
输入
hb_vio_buffer_t *img_info
需要释放的 pym 结果,和 hb_vio_get_data 获取的结果对应;
输入
【返回值】
成功:正常为 HB_VIO_NO_ERR 0
失败:异常为负值错误码,参考 1.4.1 VIO 返回码说明。【兼容性】
系统版本 1.0 及以上
错误返回值说明
返回值 | 返回值定义 | 错误码说明 |
|---|---|---|
6000 | HB_VIO_PYM_OPEN_DEV_FAIL | |
6001 | HB_VIO_PYM_INIT_FAIL | |
6002 | HB_VIO_PYM_DEINIT_FAIL | |
6003 | HB_VIO_PYM_UPDATE_FAIL | |
6004 | HB_VIO_PYM_STOP_FAIL | |
6005 | HB_VIO_PYM_START_FAIL | |
6006 | HB_VIO_PYM_PARSER_FAIL | |
6007 | HB_VIO_PYM_IS_BUSY | |
6008 | HB_VIO_PYM_EPOLL_CREATE_FAIL | |
6009 | HB_VIO_PYM_EPOLL_CTL_FAIL | |
6010 | HB_VIO_PYM_EPOLL_WAIT_FAIL | |
6011 | HB_VIO_PYM_STOP_WORKING | |
6012 | HB_VIO_PYM_BAD_VALUE | |
6013 | HB_VIO_PYM_TIME_OUT | |
6014 | HB_VIO_PYM_INVALID_OPERATION | |
6015 | HB_VIO_PYM_INVALID_CONFIG | |
6016 | HB_VIO_PYM_NULL_POINTER | |
6017 | HB_VIO_PYM_BUF_MGR_FAIL | |
6018 | HB_VIO_PYM_OPEN_NODE_FAIL | |
6019 | HB_VIO_PYM_BUF_MGR_NULL | |
6020 | HB_VIO_PYM_ALLOC_BUF_FAIL | |
6021 | HB_VIO_PYM_BUF_MAP_FAIL | |
6022 | HB_VIO_PYM_FREE_DATA_INPUT_BUF_NULL | |
6023 | HB_VIO_PYM_GET_DATA_INPUT_BUF_NULL | |
6024 | HB_VIO_PYM_RUN_BUF_NULL | |
6025 | HB_VIO_PYM_RUN_INVALID_BUF | |
6026 | HB_VIO_PYM_RUN_WRONGSTATE | |
6027 | HB_VIO_PYM_FRAME_DROP | |
6028 | HB_VIO_PYM_GET_BUF_FAIL | |
6029 | HB_VIO_PYM_FREE_BUF_FAIL | |
6030 | HB_VIO_PYM_SET_PARAMETER_FAIL | |
6031 | HB_VIO_PYM_FLUSH_BUF_FAIL | |
6032 | HB_VIO_PYM_INVALID_CACHE_FAIL | |
6033 | HB_VIO_PYM_INVALID_DATATYPE |
5. 调试方法
调试手段
- 用户态调试信息控制
VPM相关库的打印信息只会通过logcat 进行打印,可在运行调试程序之前在开发板执行logcat命令查看相关运行打印。注意export 的环境变量LOGLEVEL只在当前shell 窗口生效,后台执行或者其他shell 窗口执行,环境变量不生效。
- 内核调试信息控制
打开PYM调试信息:
echo "file hobot_dev_pym.c -p" >/sys/kernel/debug/dynamic_debug/control
查看运行中PYM硬件Buf轮转状态
cat /sys/devices/platform/soc/47010000.cam_sys/470e0000.pym/pym_stat
cat /sys/devices/platform/soc/47010000.cam_sys/47130000.pym/pym_stat
cat /sys/devices/platform/soc/47010000.cam_sys/47190000.pym/pym_stat

参数描述:
参数 | 参数描述 |
|---|---|
pym_mode | 配置文件中设置的Pym mode |
input_width | 输入宽 |
input_height | 输入高 |
hw drop count | PYM硬件丢帧 |
sw drop count | PYM软件掉帧 |
isp drop count | ISP出现丢帧 |
alloc capture buffer count | 配置文件中设置的 output_buf_num |
Request/Process /Complete /User | 各状态buff 数 |
查看运行中PYM硬件fps
PYM0
cat /sys/devices/platform/soc/47010000.cam_sys/470e0000.pym/fpsPYM1
cat /sys/devices/platform/soc/47010000.cam_sys/47130000.pym/fpsPYM2
cat /sys/devices/platform/soc/47010000.cam_sys/47190000.pym/fps查看模块处理时间
cat /sys/devices/platform/soc/47010000.cam_sys/47060000.cim/vio_delay
每一个模块的每一帧,FX000xx为实际帧号;
统计FE frame end时间,和FS frame start时间;FE减去FS时间就是这一帧的模块处理时间。
一般可对这些数据进行多次采样,计算出平均值。下面给出一组值作为参考:
- 调试步骤
确保硬件系统能正常出图,相关出图配置文件已完备。工作模式确认:参考2.1节说明,确认PYM工作模式。
关联配置确认:参考2.2.5节说明,修改关联模块配置。
PYM CONFIG配置:参考2.2.1节说明,修改pym_config节点,重点关注pym_hw_id、pym_mode、output_buf_num配置项。
PYM CTRL 配置:参考2.2.2节说明,配置PYM模块输入图像参数。根据后端算法输入要求,选择合适输出通道并enable 对应输出通道。
输出通道属性配置:根据步骤4确认的输出通道数,按照算法要求完成GS、BL、DS、US等图像数据变换配置。
指定修改后的VPS配置文件,正常运行程序。
6. 验证步骤
检查PYM 模块状态,确认PYM配置已生效。
检查PYM模块帧率,确认与摄像头模组输出帧率匹配。
实时观测PYM输出图像或者dump PYM输出为图片,检查图像是否正常。
以上操作如有异常,打开用户态和内核调试信息,检查是否有打印异常。
7. Sample Code
PYM回灌一般用作功能验证、采集回灌等,由于PYM处理需要nv12/nv21 格式数据,所以回灌的数据格式只能是 nv12/nv21;
- 数据流

- 配置说明
配置文件说明仅抽取部分关键参数,其中需要注意pym_mode 需要配置为 0 (配置参数详细解释可参考 vio 配置文档).
VPM CFG: vpm_config.json - 参考代码
参考代码仅说明vps相关接口调用示例,用户可参考示例编写用例。
(参考路径 plantform_sdk: unittest/testapp/j5_vio_test/vio_test/sample_code/scenario/pym_feedback.c)
8. 常见问题
序号 | 问题描述 | 解决方案 |
|---|---|---|
1 | gs,bl的处理尺寸是按照原图输入的大小还是原图进行roi之后的进行处理? | gs,bl 每个层是按照原图输入大小进行处理(gs,bl对应层内部会变为1/2,1/4大小等); src模块送给其他层处理跟自己的crop模块输出是两个独立的通道,互不影响。 |
2 | gs,bl的crop功能可以单独控制么? 是否关闭crop后不用设置输出尺寸,直接按照每层1/2的规则从输入进行处理后输出? | crop 不能单独控制(指不做crop就无法输出到DDR),每个基础层实际到DDR的尺寸就是由crop 的设置决定的,就算要输出1/2,1/4也要对应设置尺寸,不然寄存器会有默认值设置输出。 |
3 | ds,us的输入是src crop之后还是原图输入? 如果是从gs,bl 过来是否是crop之后作为输入(承接以上的问题) | 直接从原图数据接入处理;是从gs, bl未经过crop的数据作为输入,例如选gs0, 则为1/2 src_w, 1/2 src_h。 |
4 | gs,bl如果设置了uv bypass,后续的ds,us旋转 了该层作为源后,是否也需要同时设置uv bypass? | 没有关联关系,ds,us是从源头的图像(1/2,1/4,1/8等的数据)接入进行处理。 |
5 | gs,bl各自各层之间有依赖关系么? | gs,bl 各自内部是有依赖关系的,所以MAX Layer的设置是要按顺序的,比如想输出第三层,必须使能max layer 3;想输出第五层,必须使能max layer 5。 |
6 | ISP与PYM的连接上有什么要注意的? | 关于硬件直连,ISP 0 只能直连到PYM 0, ISP 1 只能直连到PYM 1,硬件限定。 |
7 | 输出stride与width的设置关系,stride(SPEC要求16对齐,宽度只是偶数要求)可以小于宽度么?(目前实际内存按照stride来进行分配) | 内存按照stride来分配(16对齐),width偶数限制。 实际工作硬件: 1)w< stride 时,实际图像填不满每一行,每行内存后面会有空白(stride-w)。 2)w>stride时,硬件不允许该设置。 |
8 | PYM2有什么特别的特性么? | PYM2只有GS输出没有BL输出;DS层只有0 |
9 | PYM BUF配置有什么特殊情况么? | PYM的BUF数目,在配合ISPTDMF模式工作时,同一PYM硬件模块的不同PIPE是公共一起使用的,例如PYM0有三个PIPE(ISP是TDMF),PYMBUF配置需要设置为2*3=6,驱动中共用一组BUF,并且平分个数,所以同时要求为PIPE数的倍数。 其他模式PYM BUF都是每个PIPE独立分配使用。 |
10 | PYM src_in_width,src_region_width配置要求? | src_region_width小于src_in_width是合理的,实际测试的时候,src in width,height不能动,改大了是不行的,只能反方向修改src region witdh,height来验证。 |
11 | PYM配置"output_buf_num"过大导致fd 溢出 | 增大pym“output_buf_num”配置时,有可能会导致FD溢出(超过1024),从而导致报错:[ion]Failed to do ION_IOC_SHARE(ret=-1)!, 可以输入ulinit -n 4096命令,把FD最大上限从1024提升至4096,解决FD溢出问题; |

