USER GUIDE / IMAGE PROCESSING / GPL_WDMA / CONFIGURATION FLOW
配置流程
配置流程如下。
启动方式
模块通过配置地址控制模块启动,配 1 个地址工作 1 帧,最多可以缓存 4 个地址;
每次配置前必须通过 debug 信号 0xC0、0xC4 检查对应 fifo 的状态,为 full 时无法继续配置,否则地址 fifo 异常覆盖,需要复位 fifo 重新配置;
当缓存中存在地址,模块即开始工作,所以需要确保参数配置必须都配置完再配置地址。
启动前
- 配置数据类型、顶层 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 0 raw8/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}1 raw10/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}}2 raw32/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}}3 raw12:
{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’h1 IPC(output raw) 3 8’h2 IPC(output yuv422) 6 8’h3 IPC(output yuv420)/DMSC(output yuv420) 4 8’h4 IPC(output only y)/DMSC(output only y) 0 *YUV 域 NV12/NV21 均支持,但输入输出必须统一,YUV422 输入仅支持 YUYV 输出。
- 配置 stride,写入
0x60(YUV422 模式下,stride 需要按 2 倍图像宽度处理); - 分配一块 buff 空间,用来存储 wdma 写出的数据,并将 buff 空间首地址写入
0x58/0x5C,至此 WDMA 模块启动完成;
工作中
- 等待中断 o_irq_done,模块结束传输,若地址 fifo 非空继续下一帧工作;
- 读取
0x70第[0]位是否拉高,拉高即为开始工作; - 读取
0x68获取 wdma 结束地址,与写入0x58的起始地址保持一致即为结束。若为双路模式,同时读取0x6C与0x5C进行类似比较。
异常处理方式
软复位 dma_stop:0x44 第[0]写 1,模块停止工作,并在总线安全后复位(丢帧处理无中断)。