USER GUIDE / IMAGE PROCESSING / GPL_WDMA / CONFIGURATION FLOW

配置流程

配置流程如下。

启动方式

模块通过配置地址控制模块启动,配 1 个地址工作 1 帧,最多可以缓存 4 个地址;

每次配置前必须通过 debug 信号 0xC0、0xC4 检查对应 fifo 的状态,为 full 时无法继续配置,否则地址 fifo 异常覆盖,需要复位 fifo 重新配置;

当缓存中存在地址,模块即开始工作,所以需要确保参数配置必须都配置完再配置地址。

启动前

  1. 配置数据类型、顶层 wdma 位置,写入到 0x54:
    • MUX_SEL[18:16] 改变数据类型:dump_data_type;
    • MUX_SEL[26:24] 改变数据输出顺序:dump_data_order。具体数据类型配置见下表。

    *raw 数据根据 raw8/16 等对应选择 data_type,输出 bayer 类型不变与输入一致。

    *rgb 数据按 rgb888 对应选择 data_type,按 data_order 对应 r/g/b 顺序写入 ddr。

    *yuv 数据按 yuv-y/yuv-uv/双通道 yuv 对应选择 data_type,按 data_order 对应 u/v 顺序写入 ddr。

    表 1 data_type 与拼接格式
    data_type拼接格式-输入 32bit拼接格式-输出 64bit
    0raw8/yuv-y:
    {16’b0,raw8, 8’b0}
    {16’b0,y[7:0],8’b0}
    {raw8_p7,raw8_p6,raw8_p5, raw8_p4,raw8_p3, raw8_p2,raw8_p1,raw8_p0}
    {y8_p7,y8_p6,y8_p5,y8_p4,y8_p3,y8_p2,y8_p1, y8_p0}
    1raw10/raw12/raw16/yuv-uv:
    {16’b0,raw16}
    {20’b0,raw12}
    {22’b0,raw10}
    {16’b0,u[7:0],v[7:0]}
    {raw16_p3,raw16_p2,raw16_p1,raw16_p0}
    yuv-uv type 下:
    data_order=0:{{u,v}, {u,v}, {u,v}, {u,v}}
    data_order=1:{{v,u},{v,u}, {v,u},{v,u}}
    2raw32/rgb888:
    {raw32}
    {8’b0,r[7:0],g[7:0], b[7:0]}
    {raw32_p1,raw32_p0}
    rgb888 type 下:
    data_order=0:{{8’b0,r,g,b}, {8’b0,r,g,b}}
    data_order=1:{{8’b0,r,b,g}, {8’b0,r,b,g}}
    data_order=2:{{8’b0,g,r,b}, {8’b0,g,r,b}}
    data_order=3:{{8’b0,g,b,r},{8’b0,g,b,r}}
    data_order=4:{{8’b0,b,r,g}, {8’b0,b,r,g}}
    data_order=5:{{8’b0,b,g,r},{8’b0,b,g,r}}
    3raw12:
    {16’b0,raw12, 4’b0}
    满拼输出:
    {raw12_p5[3:0],raw12_p4,raw12_p3,raw12_p2, raw12_p1,raw12_p0}
    {...,raw12_p6,raw12_p5[11:4]}
    4双通道 YUV420:
    Ch0:{16’b0,y[7:0],8’b0}
    Ch2:{16’b0,u[7:0],v[7:0]}
    Ch0:
    {y8_p7,y8_p6,y8_p5,y8_p4,y8_p3,y8_p2,y8_p1, y8_p0}
    Ch2:
    {uv16_p3,uv16_p2, uv16_p1,uv16_p0}
    data_order=0:{{u,v}, {u,v}, {u,v}, {u,v}}
    data_order=1:{{v,u},{v,u}, {v,u},{v,u}}
    5双通道 dol_raw16:
    Ch0:{16’b0,raw16}
    Ch2:{16’b0,raw16}
    Ch0:
    {raw16_p3,raw16_p2,raw16_p1,raw16_p0}
    Ch2:
    {raw16_p3,raw16_p2,raw16_p1,raw16_p0}
    6双通道 YUV422:
    Ch0:{16’b0,y[7:0],8’b0}
    Ch2:{16’b0,u[7:0],v[7:0]}
    data_order=0:
    {v_p1,y_p3, u_p1,y_p2,v_p0, y_p1,u_p0,y_p0}
    data_order=1:
    {u_p1,y_p3, v_p1,y_p2,u_p0, y_p1,v_p0,y_p0}

    MUX_SEL[7:0] 为模块工作位置:mux_sel。具体配置见下表。

    表 2 mux_sel 与工作模块
    mux_sel对应工作模块data_type
    8’h1IPC(output raw)3
    8’h2IPC(output yuv422)6
    8’h3IPC(output yuv420)/DMSC(output yuv420)4
    8’h4IPC(output only y)/DMSC(output only y)0

    *YUV 域 NV12/NV21 均支持,但输入输出必须统一,YUV422 输入仅支持 YUYV 输出。

  2. 配置 stride,写入 0x60(YUV422 模式下,stride 需要按 2 倍图像宽度处理);
  3. 分配一块 buff 空间,用来存储 wdma 写出的数据,并将 buff 空间首地址写入 0x58/0x5C,至此 WDMA 模块启动完成;

工作中

  1. 等待中断 o_irq_done,模块结束传输,若地址 fifo 非空继续下一帧工作;
  2. 读取 0x70 第[0]位是否拉高,拉高即为开始工作;
  3. 读取 0x68 获取 wdma 结束地址,与写入 0x58 的起始地址保持一致即为结束。若为双路模式,同时读取 0x6C 与 0x5C 进行类似比较。

异常处理方式

软复位 dma_stop:0x44 第[0]写 1,模块停止工作,并在总线安全后复位(丢帧处理无中断)。