专栏算法工具链J5 DVB实战教程(3)-基于J5芯片的PYM模块功能详解及验证调试方法

J5 DVB实战教程(3)-基于J5芯片的PYM模块功能详解及验证调试方法

Feng2022-11-28
572
0

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

1. 硬件特性

J5 芯片共有三个PYM模块:两个全功能模块(PYM0,PYM1),一个标准功能模块(PYM2)。支持最大4096x4096、最小32x32分辨率图像输入。
  • 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模块规格如下:

  1. Online输入图像格式YUV422/YUV420

  2. Offline输入图像格式YUV420 semi-planar,支持输入stride

  3. 输出图像格式YUV420 semi-planar

  4. 支持帧率:3840*2160@30fps

  5. 原图输出:

    1. Y和UV可单独使能

    2. 可crop输出

    3. 有输出stride

  6. 双线性下采样基础层:

    1. 层数:5层

    2. 每层缩放图像支持输出可单独使能,Y和UV可单独使能

    3. 可crop 输出

    4. 有输出stride

  7. 高斯下采样基础层:

    1. 层数:5层

    2. 每层缩放图像支持输出可单独使能,Y和UV可单独使能

    3. 支持可配置垂直5x1和水平1x5的6-bit signed滤波系数模板

    4. 可crop输出

    5. 有输出stride

    6. 边界padding方式:mirror_101

  8. DownScale ROI :

    1. 层数:6层

    2. 每层缩放图像支持输出可单独使能,Y和UV可单独使能

    3. 可crop输出,

    4. 有输出 stride

    5. 缩放范围[1/2,1]

    6. 可配置水平和垂直的初始相位[0~65535]

  9. UpScale :

    1. 层数:1层

    2. 最大输出宽度2048

    3. 最大输出高度2048

    4. 每层缩放图像支持输出可单独使能,Y和UV可单独使能

    5. 可crop输入(roi)

    6. 输出stride

    7. 水平和垂直缩放范围[1,4].

    8. 可配置水平和垂直的初始相位[-65536~65535][-1,1)精度1/65535

  10. 输出中断

    1. 输入8个水位监测中断

    2. frame_start、frame_done

    3. 数据溢出中断

    4. Size error

    5. 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. 接口使用说明

  • 接口函数列表

  1. 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 及以上
  2. 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. 调试方法

  • 调试手段

  1. 用户态调试信息控制
    VPM相关库的打印信息只会通过logcat 进行打印,可在运行调试程序之前在开发板执行logcat命令查看相关运行打印。

    注意export 的环境变量LOGLEVEL只在当前shell 窗口生效,后台执行或者其他shell 窗口执行,环境变量不生效。

  2. 内核调试信息控制
    打开PYM调试信息:
echo "file vio_video_api.c +p" &gt;/sys/kernel/debug/dynamic_debug/control
echo "file vio_group_api.c +p" &gt;/sys/kernel/debug/dynamic_debug/control
echo "file vio_framemgr.c +p" &gt;/sys/kernel/debug/dynamic_debug/control

关闭PYM调试信息:
echo "file hobot_dev_pym.c -p" >/sys/kernel/debug/dynamic_debug/control

查看运行中PYM硬件Buf轮转状态

PYM0
cat /sys/devices/platform/soc/47010000.cam_sys/470e0000.pym/pym_stat
PYM1
cat /sys/devices/platform/soc/47010000.cam_sys/47130000.pym/pym_stat
PYM2
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/fps
    PYM1
    cat /sys/devices/platform/soc/47010000.cam_sys/47130000.pym/fps
    PYM2
    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时间就是这一帧的模块处理时间。
    一般可对这些数据进行多次采样,计算出平均值。
    下面给出一组值作为参考:
  • 调试步骤
    确保硬件系统能正常出图,相关出图配置文件已完备。
    1. 工作模式确认:参考2.1节说明,确认PYM工作模式。

    2. 关联配置确认:参考2.2.5节说明,修改关联模块配置。

    3. PYM CONFIG配置:参考2.2.1节说明,修改pym_config节点,重点关注pym_hw_id、pym_mode、output_buf_num配置项。

    4. PYM CTRL 配置:参考2.2.2节说明,配置PYM模块输入图像参数。根据后端算法输入要求,选择合适输出通道并enable 对应输出通道。

    5. 输出通道属性配置:根据步骤4确认的输出通道数,按照算法要求完成GS、BL、DS、US等图像数据变换配置。

    6. 指定修改后的VPS配置文件,正常运行程序。

6. 验证步骤

  1. 检查PYM 模块状态,确认PYM配置已生效。

  2. 检查PYM模块帧率,确认与摄像头模组输出帧率匹配。

  3. 实时观测PYM输出图像或者dump PYM输出为图片,检查图像是否正常。

  4. 以上操作如有异常,打开用户态和内核调试信息,检查是否有打印异常。

7. Sample Code

本示例以PYM回灌为例说明PYM模块使用流程。
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层只有02不输出35符合预期

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溢出问题;
算法工具链
征程5官方教程
评论0
0/1000