合众达DM642驱动程序设计
SEED-VPM642 视频驱动程序
摘要
本篇主要讲述关于视频驱动的采集与显示的 Mini-Driver 在 SEED-VPM642 板卡上的应
用。这个驱动程序符合DSP/BIOS的驱动模型。在 TMS320DM642与存贮器之间采用EDMA
进行数据的交换。为了代码容易维护,这个驱动由数据管理与视频编解码器件控制两部分组
成。
驱动程序的特点:
多对象驱动(一个驱动程序可以控制多路的编解码电路);
采集驱动支持以下的模式:
¾ 双通路的 8/10 位的内嵌时基与外部同步的 BT.656 格式输...
SEED-VPM642 视频驱动程序
摘要
本篇主要讲述关于视频驱动的采集与显示的 Mini-Driver 在 SEED-VPM642 板卡上的应
用。这个驱动程序符合DSP/BIOS的驱动模型。在 TMS320DM642与存贮器之间采用EDMA
进行数据的交换。为了代码容易维护,这个驱动由数据管理与视频编解码器件控制两部分组
成。
驱动程序的特点:
多对象驱动(一个驱动程序可以控制多路的编解码电路);
采集驱动支持以下的模式:
¾ 双通路的 8/10 位的内嵌时基与外部同步的 BT.656 格式输出
¾ 四通路的 8/10 位的内嵌时基的 BT.656 格式输出。
显示驱动支持以下的模式:
¾ 8/10 位的内嵌时基的 BT.656 格式输入;
¾ 8/10 位的使用外部同步的 BT.656 格式输入;
支持视频口的所有的事件中断;
允许用户通过应用程序的配置参数来设定驱动中视频帧的数据缓冲区。
1. 概述
这里所说的器件驱动程序实际上是 IOM Mini-driver 的一部分。它是处在二层器件驱动
程序模型的底层,其上层是 FVID 模块,这是一个经过简单包装的 DSP/BIOS 的 GIO 型类
驱动。像 GIO 型的类驱动为不同的 Mini-driver 一系列通用且独立的 API
数与服务一样,
FVID 也为视频帧的采集与显示提供了定制的 API。相关的内容,请参看附录 B 中有关 FVID
详细说明。
图一说明了 DSP/BIOS 器件驱动程序的结构,关于 IOM、GIO、SIO/DIO 和 PIP/PIO
的器件驱动模型参看相关的说明。
图一:DSP/BIOS 驱动分层模型
图二说明了 SEED-VPM642 视频采集与显示的 Mini-driver 驱动程序的结构图,为了使
SEED-VPM642 视频采集与显示的 Mini-driver 驱动程序的代码有最大的重复使用能力,将
其分为数据管理与视频编解码器件控制两部分。与其它将用户板上器件控制程序直接放在
Mini-driver 中不同的是,在视频采集与显示的 Mini-driver 中是通过外部器件控制接口(EDC)
把视频编解码器件的控制集成到 Mini-driver 中的。这样使我们的视频采集与显示的
Mini-driver 能适应不同的视频编解码器件。当更换不同器件时,只须更改 EDC 部分即可,
其它的部分可保持不变。
图二:采集与显示驱动分层模型
本文主要描述 SEED-VPM642 视频采集与显示 Mini-driver 的数据管理与器件控制两部
分。数据管理部分是采用 EDMA 技术完成对视频口的写入与读出。器件控制部分在采集驱
动里完成对 TVP5150AM 的初始化与配置;在显示驱动里,完成对 SAA7121 的初始化与配
置。器件控制部分(EDC)使视频编解码器与 DM642 的视频口配合工作,完成指定视频数
据格式的采集与显示。例如,TVP5150 根据应用程序的需要可以配置成为 NTSC 制式或 PAL
制式的采集。同时,视频口也应配置成为相同的模式。
器件控制接口部分程序运行前需要 SEED-VPM642 调用 SEED-VPM642 板级支持库
(seedvpm642_bsl.lib)中的初始化程序 SEEDVPM642_init()对 EMI 与 I2C 总线控制器进
行初始化。因此,正确调用视频采集与显示库,需要在编程时同时连接 seedvpm642_bsl.lib
与 seedvpm642_vport.l64 这两个库。
2. 使用规则
2.1 驱动程序在 DSP/BIOS中的配置
为了使用采集与显示的器件驱动,必须在 DSP/BIOS 配置工具中加入相应的配置设备
实体。关于如何使用 DSP/BIOS 来配置设备实例的详细内容可参看<
>(文档号:SPRU616)或是参看相关的例程。下面是在使用采
集驱动时需要设置设备实例的参数。
Init function:这个驱动无初始化的函数
Function table ptr:_VPORTCAP_Fxns
Function table type: IOM_Fxns
Device id: 0~3,指定是 SEEDVPM642 系统内哪一通路的采集
Device params ptr:这是一个可选项,它是一个指向 VOPRT_PortParams 结构的
指针,这个结构定义在 vport.h 的头文件中。这个结构是用来设定视频口与解码器
件参数的。如果将这个指针设为 NULL,则应用程序需要另外调用 FVID_control
来 初 始 化 视 频 口 与 解 码 器 件 。 关 于 这 个 结 构 设 置 的 例 子 , 可 以 在
seedvpm642_vcapparamsPAL_EMBEDDED.c 中看到。
Device global data ptr:此参数在驱动中未使用。
下面是显示驱动在 DSP/BIOS 中设备实体设置参数:
Init function:这参数驱动程序未使用。
Function talbe ptr:_VPORTDIS_Fxns
Function table type: IOM_Fxns
Device id: 在 SEED-VPM642 设为 0,使用视频口 0
Device params ptr:这个参数的设置与采集驱动是一致的
Device global data ptr:此参数在驱动中未使用。
2.1.1 视频口参数
typedef struct VPORT_PortParams
{
Bool dualChanEnable;
Bool dualChanEnab;
Uns vc1Polarity;
Uns vc2Polarity;
Uns vc3Polarity;
EDC_Fxns* edcTbl[2];
}VPORT_PortParams;
dualChanEnable:是否使能视频口的双通路模式(TRUE 或 FALSE)
vc1Polarity: 视频口管脚 vctrl1 是高有效还是低有效,其值为:
¾ VPORT_POLARITY_ACTIVE_HIGH:高有效;
¾ VPORT_POLARITY_ACTIVE_LOW: 低有效;
Vc2 Polarity: 视频口管脚 vctrl2 是高有效还是低有效,其值为:
¾ VPORT_POLARITY_ACTIVE_HIGH:高有效;
¾ VPORT_POLARITY_ACTIVE_LOW: 低有效;
Vc3Polarity: 视频口管脚 vctrl3 是高有效还是低有效,其值为:
¾ VPORT_POLARITY_ACTIVE_HIGH:高有效;
¾ VPORT_POLARITY_ACTIVE_LOW: 低有效;
edcTbl[2]:指向器件控制接口(EDC)的两个指针队列,每一个通路有一地址,
当只使用一个时,另一个设为 NULL。
2.1.2 采集通路参数
typedef struct
{
Int cmode;
Int fldOp;
Int scale;
Int resmpl;
Int bpk10Bit;
Int hCtRst;
Int vCtRst;
Int fldDect;
Int extCtl;
Int fldInv;
Uint16 fldXStrt1;
Uint16 fldYStrt1;
Uint16 fldXStrt2;
Uint16 fldYStrt2;
Uint16 fldXStop1;
Uint16 fldYStop1;
Uint16 fldXStop2;
Uint16 fldYStop2;
Uint16 thrld;
Int numFrmBufs;
Int alignment;
Int mergeFlds;
Int segId;
Int edmaPri;
Int irqId;
Bool autoSyncEnable;
} VPORTCAP_Params;
上面结构中定义的每一位直接映射射到视频采集控制寄存器。未定义的位保持复位进的
默认值,下面是这些定义的详细说明:
Cmode:采集的模式,下面是在 Vport.h 内定义的可能的值,在 SEEDVPM642
中只能采用第一种模式。
¾ VPORT_MODE_BT656_8BIT
¾ VPORT_MODE_BT656_10BIT
¾ VPORT_MODE_RAW_8BIT
¾ VPORT_MODE_RAW_10BIT
¾ VPORT_MODE_YC_8BIT
¾ VPORT_MODE_YC_10BIT
¾ VPORT_MODE_RAW_16BIT
¾ VPORT_MODE_RAW_20BIT
fldOp: 帧或场的操作模式。下面是在 Vport.h 内定义的可能的值:
¾ VPORT_FLDOP_FLD1
¾ VPORT_FLDOP_FLD2
¾ VPORT_FLDOP_FRAME
¾ VPORT_FLDOP_PROGRESSIVE
scale: 水平½缩小使能。下面是在 Vport.h 内定义的可能的值:
¾ VPORT_SCALING_DISABLE
¾ VPORT_SCALING_ENABLE
resmpl: 将每行色度由 4:2:2变换 4:2:0使能. 下面是在Vport.h内定义的可能的值:
¾ VPORT_RESMPL_DISABLE
¾ VPORT_RESMPL_DISABLE
bpk10Bit: 10 位视频采集模式, 下面是在 Vport.h 内定义的可能的值:
¾ VPORTCAP_BPK_10BIT_ZERO_EXTENDED
¾ VPORTCAP_BPK_10BIT_SIGN_EXTENDED
¾ VPORTCAP_BPK_10BIT_DENSE
hCtRst: 行(水平方向)计数复位模式。下面是在 Vport.h 内定义的可能的值:
¾ VPORTCAP_HRST_EAV
¾ VPORTCAP_HRST_START_HBLK
¾ VPORTCAP_HRST_START_HSYNC
¾ VPORTCAP_HRST_SAV
¾ VPORTCAP_HRST_END_HBLK
¾ VPORTCAP_HRST_END_HSYNC
vCtRst: 场(垂直方向)计数复位模式. 下面是在 Vport.h 内定义的可能的值:
¾ VPORTCAP_VRST_START_VBLK
¾ VPORTCAP_VRST_START_VSYNC
¾ VPORTCAP_VRST_END_VBLK
¾ VPORTCAP_VRST_END_VSYNC
¾ VPORTCAP_VRST_EAV_V1
¾ VPROTCAP_VRST_EAV_V0
fldDect: 场侦测使能,此项功能仅在使用外部同部时使用。当使能时,需要确定场
侦测的方式。一般是由 H-Sync 与 V-Sync 的关系或由 Field 输入管脚来确定。下
面是在 Vport.h 内定义的可能的值:
¾ VPORTCAP_FLDD_ENABLE
¾ VPORTCAP_FLDD_ENABLE
extCtl: 外部同步使能。下面是在 Vport.h 内定义的可能的值:
VPORTCAP_EXC_DISABLE
VPORTCAP_EXC_ENABLE
fldInv: 场反转使能。下面是在 Vport.h 内定义的可能的值:
¾ VPORTCAP_FINV_DISABLE
¾ VPORTCAP_FINV_ENABLE
fldXStrt1: 第一场起始像素点横坐标 其值大于等 0
fldYStrt1: 第一场起始像素点纵坐标 其值大于等 0
fldXStrt2: 第二场起始像素点横坐标 其值大于等 0
fldYStrt2: 第二场起始像素点纵坐标 其值大于等 0
fldXStop1: 第一场起始像素点横坐标 其值大于等 fldXStrt1
fldYStop1: 第一场起始像素点纵坐标 其值大于等 fldYStrt1
fldXStop2: 第二场起始像素点纵坐标 其值大于等 fldXStrt2
fldYStop2: 第二场起始像素点纵坐标 其值大于等 fldYStrt2
thrld: 设定产生 DMA 中断的门槛,以双字节以单位
numFrmBufs:设定驱动程序中采集缓冲区的个数
alignment: 采集缓冲区的对齐长度
mergeFlds: 指定场在缓冲区中的存放方式,可以将两场分别存放,也可以排成逐
行方式存放(两场交叉存放)。下面是在 Vport.h 内定义的可能的值:
¾ VPORT_FLDS_MERGED
¾ VPORT_FLDS_SEPARATED
SegId: DSP/BIOS 存贮空间 ID, 驱动用来分配视频帧的缓冲区。
edmaPri: EDMA 的优先级
irqId: EDMA 中断安排
autoSyncEnable:是否使能断帧自动同步功能。下面是在 Vport.h 内定义的可能的
值:
¾ TRUE
¾ FALSE
2.1.3 显示通路参数
typedef struct
{
Int dmode;
Int fldOp;
Int scale;
Int resmpl;
Int defValEn;
Int bpk10Bit;
Int vctl1Config;
Int vctl2Config;
Int vctl3Config;
Int extCtl;
Uint16 frmHSize;
Uint16 frmVSize;
Int16 imgHOffsetFld1;
Int16 imgVOffsetFld1;
Uint16 imgHSizeFld1;
Uint16 imgVSizeFld1;
Int16 imgHOffsetFld2;
Int16 imgVOffsetFld2;
Uint16 imgHSizeFld2;
Uint16 imgVSizeFld2;
Uint16 hBlnkStart;
Uint16 hBlnkStop;
Uint16 vBlnkXStartFld1;
Uint16 vBlnkYStartFld1;
Uint16 vBlnkXStopFld1;
Uint16 vBlnkYStopFld1;
Uint16 vBlnkXStartFld2;
Uint16 vBlnkYStartFld2;
Uint16 vBlnkXStopFld2;
Uint16 vBlnkYStopFld2;
Uint16 xStartFld1;
Uint16 yStartFld1;
Uint16 xStartFld2;
Uint16 yStartFld2;
Uint16 hSyncStart;
Uint16 hSyncStop;
Uint16 vSyncXStartFld1;
Uint16 vSyncYStartFld1;
Uint16 vSyncXStopFld1;
Uint16 vSyncYStopFld1;
Uint16 vSyncXStartFld2;
Uint16 vSyncYStartFld2;
Uint16 vSyncXStopFld2;
Uint16 vSyncYStopFld2;
Uint8 yClipLow;
Uint8 yClipHigh;
Uint8 cClipLow;
Uint8 cClipHigh;
Uint8 yDefVal;
Uint8 cbDefVal;
Uint8 crDefVal;
Int rgbX;
Int incPix;
Uint16 thrld;
Int numFrmBufs;
Int alignment;
Int mergeFlds;
Int segId;
Int edmaPri;
Int irqId;
} VPORTDIS_Params;
dmode: 显示模式。在 SEEDVPM642 中只支持第一种值下面是在 Vport.h 内定义
的可能的值:
¾ VPORT_MODE_BT656_8BIT
¾ VPORT_MODE_BT656_10BIT
¾ VPORT_MODE_RAW_8BIT
¾ VPORT_MODE_RAW_10BIT
¾ VPORT_MODE_YC_8BIT
¾ VPORT_MODE_YC_10BIT
¾ VPORT_MODE_RAW_16BIT
¾ VPORT_MODE_RAW_20BIT
fldOp: 场与帧的操作模式下面是在 Vport.h 内定义的可能的值:
¾ VPORT_FLDOP_FLD1
¾ VPORT_FLDOP_FLD2
¾ VPORT_FLDOP_FRAME
¾ VPORT_FLDOP_PROGRESSIVE
scale: 行(水平方向)的 2 倍放大功能使能。下面是在 Vport.h 内定义的可能的值:
¾ VPORT_SCALING_DISABLE
¾ VPORT_SCALING_ENABLE
resmpl:每一行(水平方向)色度由 4:2:0 变换成 4:2:2 的使能. 下面是在 Vport.h
内定义的可能的值:
¾ VPORT_RESMPL_DISABLE
¾ VPORT_RESMPL_DISABLE
defValEn: 默认值输出使能。当使能时,在非消隐区显示默认值。下面是在 Vport.h
内定义的可能的值:
¾ VPORTDIS_DEFVAL_DISABLE
¾ VPORTDIS_DEFVAL_ENABLE
bpk10Bit: 10 位数据显示模式. 下面是在 Vport.h 内定义的可能的值:
¾ VPORTDIS_BPK_10BIT_NORMAL
¾ VPORTDIS_BPK_10BIT_DENSE
vctl1Config: VCTL1 输出功能选择。下面是在 Vport.h 内定义的可能的值:
¾ VPORTDIS_VCTL1_HSYNC
¾ VPORTDIS_VCTL1_HBLNK
¾ VPORTDIS_VCTL1_AVID
¾ VPORTDIS_VCTL1_FLD
vctl2Config: VCTL2 输出功能选择。下面是在 Vport.h 内定义的可能的值:
¾ VPORTDIS_VCTL2_VSYNC
¾ VPORTDIS_VCTL2_VBLNK
¾ VPORTDIS_VCTL2_CSYNC
¾ VPORTDIS_VCTL2_FLD
vctl3Config: VCTL3 输出功能选择。下面是在 Vport.h 内定义的可能的值:
¾ VPORTDIS_VCTL3_CBLNK
¾ VPORTDIS_VCTL3_FLD
extCtl: 外部控制使能,指定视频口是做为主模式还是从模式。当其为主模式时
VCTLx 管脚为输出信号,当其为从模式时,这此管脚为输入,需要外部(例如视
频编码器件)提供控制信号. 输出功能选择。下面是在 Vport.h 内定义的可能的值:
¾ VPORTDIS_EXC_DISABLE
¾ VPORTDIS_EXC_ENABLE
frmHSize: 视频帧每行有多少像素,包括行消隐在内。
frmVSize: 视频帧有多少行,包括场消隐急在内。
imgHOffsetFld1: 第一场图像显示的行偏置,其计算是相对于每行的最后一个行消
隐像素位置。可以在行消隐时,使输出水平镜像.
imgVOffsetFld1: 第一场图像显示的场偏置,其计算是相对每场的最后一个消隐行
位置。可以在场消隐时,使输出垂直镜像。
imgHSizeFld1: 第一场图像显示每行宽度。
imgVSizeFld1: 第一场图像显示的行数。
imgHOffsetFld2: 第二场图像显示的行偏置,其计算是相对于每行的最后一个行消
隐像素位置。可以在行消隐时,使输出水平镜像.
imgVOffsetFld2: 第二场图像显示的场偏置,其计算是相对每场的最后一个消隐行
位置。可以在场消隐时,使输出垂直镜像。
imgHSizeFld2: 第二场图像显示每行宽度。
imgVSizeFld2: 第二场图像显示的行数。
hBlnkStart: 每行(水平方向)的消隐开始的像素位置。
hBlnkStop: 每行(水平方向)的消隐结束的像素位置。
vBlnkXStartFld1: 第一场场消隐开始的行(水平方向)的像素位置
vBlnkYStartFld1: 第一场场消隐开始的哪一行(垂直方向)
vBlnkXStopFld1: 第一场场消隐结束的行(水平方向)的像素位置
vblnkYStopFld1: 第一场场消隐结束的哪一行(垂直方向)
vBlnkXStartFld2: 第二场场消隐开始的行(水平方向)的像素位置
vBlnkYStartFld2: 第二场场消隐开始的哪一行(垂直方向)
vBlnkXStopFld2: 第二场场消隐结束的行(水平方向)的像素位置
vblnkYStopFld2: 第二场场消隐结束的行(水平方向)的像素位置
xStartFld1: 第一场显示输出第一行的第一个像素点的位置。
yStartFld1: 第一场显示输出的行数。
xStartFld2: 第二场显示输出第一行的第一个像素点的位置。
yStartFld2: 第二场显示输出的行数。
hSyncStart: 每行行同步有效开始的像素位置。
hSyncStop: 每行行同步有效结束的像素位置。
vSyncXStartFld1: 第一场场同步开始的像素的位置(水平方向)。
vSyncYStartFld1: 第一场场同步开始的行数(垂直方向)。
vSyncXStopFld1: 第一场场同步结束的像素的位置(水平方向)。
vSyncYStopFld1: 第一场场同步结束的行数(垂直方向)。
vSyncXStartFld2: 第二场场同步开始的像素的位置(水平方向)。
vSyncYStartFld2: 第二场场同步开始的行数(垂直方向)。
vSyncXStopFld2: 第二场场同步结束的像素的位置(水平方向)。
vSyncYStopFld1: 第一场场同步结束的行数(垂直方向)。
yClipLow: 指定 Y 的最低值。
yClipHigh: 指定 Y 的最高值。
cClipLow: 指定 CbCr 的最低值。
cClipHigh: 指定 CbCr 的最高值。
yDefVal: 指定 Y 的默认输出值。
cbDefVal: 指定 Cb 的默认输出值
crDefVal: 指定 Cr 的默认输出值
rgbX: 只在 Raw 模式下使用,用来使能连续的 24/30RGB 数据的输出。本系统未
使用。
incPix: 只在 Raw 模式下使用。本系统未使用。
thrld: 设定产生 DMA 中断的门槛,以双字节以单位。
numFrmBufs: 设置显示驱动使用的视频数据缓冲区的个数
alignment: 显示缓冲区的对齐长度
mergeFlds: 指定场在缓冲区中的存放方式,可以将两场分别存放,也可以排成逐
行方式存放(两场交叉存放)。下面是在 Vport.h 内定义的可能的值:
¾ VPORT_FLDS_MERGED
¾ VPORT_FLDS_SEPARATED
SegId: DSP/BIOS 存贮空间 ID, 驱动用来分配视频帧的缓冲区。
edmaPri: EDMA 的优先级
irqId: EDMA 中断安排
2.1.4 视频口全局中断程序接口
typedef struct VPORT_VIntCbParams
{
Int cbArg;
VPORT_IntCallBack vIntCbFxn;
Uint16 vIntMask;
Uint16 vIntLine;
Int irqId;
} VPORT_VIntCbParams;
cbArg: 中断回调函数的参数
vIntCBFxn: 指向中断回调函数的指针
vIntMask:设定可以产生全局中断的视频口的事件,其映射为视频口的中断使能寄
存器,其可能的值在 vport.h 列出:
¾ VPORT_INT_COVR: 采集 FIFO 覆盖中断
¾ VPORT_INT_CCMP: 采集完成中断
¾ VPORT_INT_SERR: 同步错误中断
¾ VPORT_INT_VINT1: 第一场的场同步中断
¾ VPORT_INT_VINT2: 第二场的场同步中断
¾ VPORT_INT_SFD: 短帧中断
¾ VPORT_INT_LFD: 长帧中断
¾ VPORT_INT_STC: 系统时钟的中断
¾ VPORT_INT_TICK: 时基中断
¾ VPORT_INT_DUND: 显示 FIFO 覆盖中断
¾ VPORT_INT_DCMP: 显示完成中断
¾ VPORT_INT_DCNA: 显示完成未确认中断
irqId: 视频全局中断对应的中断号。
IntrMask:中断屏蔽,为 ISR 执行时使用。
2.1.5 显示驱动命令
以下是驱动程序在执行时,在 vport.h 中定义执行命令
VPORT_CMD_RESET: 复位视频口
VPORT_CMD_CONFIG_PORT: 配置视频口
VPORT_CMD_CONFIG_CHAN: 配置视频通路
VPORT_CMD_START: 开始采集或显示操作
VPORT_CMD_STOP: 停止采集或显示操作
VPORT_CMD_SET_VINTCB: 设置驱动程序的中断回调函数
VPORT_CMD_DUND_RECOVER: 强制显示驱动从 under-run 中恢复
VPORT_CMD_COVR_RECOVER: 强制采集驱动从 over-run 中恢复
2.2 驱动程序器件控制的参数
2.2.1 外部器件控制的接口(EDC)
在以上的图二中可以看出,在采集与显示的 Mini-driver 中,包含了以下两部分:
数据管理部分,这部分可以兼容系统内不同的编解码器,这种分的设置主要针对
DM64 本身。和视频数据流的管理。
器件接口部分,这部分主要是配置用户选择的视频编解码器件,对其进行配置,并
与 DM642 的工作模式一致。这部分是用户在改变视频编解码器件时需要改变的。
在 SEED-VPM643 系统中这部分工作已经进行了配制,故将其封装在库中。以下
就其做简单说明。
为了使代码更改最小,修改时产生更少的错误,在器件接口部分实现了两个与驱动程序
无缝的 APIs 接口。驱动程序通过 APIs 函数调用配置视频编解码器件,使其与视频口相配
合。APIs 接口是由三个函数及,一系列的命令组成。举例如下:
/* EDC control commands */
#define EDC_CONFIG 0x00000001
#define EDC_RESET 0x00000002
#define EDC_START 0x00000003
#define EDC_STOP 0x00000004
#define EDC_GET_CONFIG 0x00000005
#define EDC_GET_STATUS 0x00000006
/* base of user defined commands */
#define EDC_USER 0x10000000
/* EDC return codes */
#define EDC_SUCCESS 0
#define EDC_FAILED −1
typedef void* EDC_Handle;
/*
* ======== EDC_Fxns ========
* edcOpen() required, open the device
* edcClose() required, close the device
* edcCtrl() required, control/query device
*/
typedef struct EDC_Fxns
{
EDC_Handle (*open)(String name, Arg optArg);
Int (*close)(Ptr devHandle);
Int (*ctrl)(Ptr devHandle, Uns cmd, Arg arg);
} EDC_Fxns;
2.2.2 采集 EDC 接口函数及参数配制
typedef struct
{
TVP51XX_Mode videoMode;
TVP51XX_AnalogFormat aFmt;
int inputPort;
I2C_Handle hI2C;
} TVP51XX_ConfParams;
videoMode:采集视频输出的格式,一些可能的值定义在 TVP51XX.h 中,列表如
下:
typedef enum TVP51XX_Mode
{
TVP51XX_MODE_NTSC601,
TVP51XX_MODE_NTSCSqp,
TVP51XX_MODE_PAL601,
TVP51XX_MODE_PALSqp,
TVP51XX_MODE_USER
}TVP51XX_Mode;
aFmt:模拟视频输入的格式,一些可能的值定义在 TVP51XX.h 中,列表如下:
typedef enum TVP51XX_AnalogFormat
{
TVP51XX_AFMT_COMPOSITE,
TVP51XX_AFMT_SVIDEO,
TVP51XX_AFMT_RGB,
TVP51XX_AFMT_YPBPR
} TVP51XX_AnalogFormat;
inputPort:输入的通路数,在 SEED-VPM642 系统内采用单路输入,其值为 1。
hI2C:已在 seedvpm642_bsl 的初始函数中打开的 DM642 的 IIC 的控制器句柄。
2.2.3 采集 EDC 接口函数及参数配制
typedef struct
{
SAA7121_AnalogFormat aFmt;
SAA7121_Mode mode;
SAA7121_InputFormat iFmt;
Bool enableSlaveMode;
Bool enableBT656Sync;
I2C_Handle hI2C;
} SAA7121_ConfParams;
aFmt:SAA7121 模拟输出的形式,一些可能的值在 SAA7121.h 中进行了定义,
在 SEED-VPM642 中,只支持 SVIDEO, COMPOSITE 两种。列表如下:
typedef enum SAA7121_AnalogFormat
{
SAA7121_AFMT_SVIDEO = 0,
SAA7121_AFMT_RGB = 1,
SAA7121_AFMT_YPBPR = 1,
SAA7121_AFMT_COMPOSITE = 2
} SAA7121_AnalogFormat;
mode:SAA7121 输出支持的制式。一些可能的值在 SAA7121.h 中进行了定义,
列表如下:
typedef enum
{
SAA7121_MODE_NTSC720,
SAA7121_MODE_PAL720,
}SAA7121_Mode;
iFmt:输入视频数据流的格式。一些可能的值在 SAA7121.h 中进行了定义,列表
如下:
typedef enum SAA7121_InputFormat
{
SAA7121_IFMT_YCBCR422_NONEINTERLACED,
SAA7121_IFMT_YCBCR422_INTERLACED
}SAA7121_InputFormat;
enableSlaveMode:SAA7121 的控制模式。在 SEED-VPM642 中采用从模式,此
项设置为 TRUE。一些可能的值在 SAA7121.h 中进行了定义,列表如下:
¾ TRUE:为从模式,DM642 为主控。
¾ FALSE:SAA7121 为主模式。
enableBT656Sync:SAA7121 的同步控制。此顶在 SEED-VPM642 中未采用。
hI2C:已在 seedvpm642_bsl 的初始函数中打开的 DM642 的 IIC 的控制器句柄。
2.2.4 在 FVID_create()函数中的命名规则
由于 DM642 可以进行双通路的采集,并且可以通过 EDC 接口配置不同的视频编解码
器件。因此必须有一种方法把这些信息从应用程序传递给视频采集与显示驱动。这个规则是
通过调用 FVID_create()函数来实现传递的。这个函数的第一个参数即为包含这一规则的字
符串型的参数,取名为 name。下面介绍这一字符串的命名规则:
使用采集驱动时,字符串包含 3 个子字符串,以反斜杠“/”区分。例如
“/VP0CAPTURE/A/0”。
字符串的第一部分是在 DSP/BIOS 的.cdb 文件中命名的驱动名称。GIO 类型的类
驱动通过这个字符串关联的 Device ID 来确定使用哪个视频口。
字符串的第二部分说明是使用视频口的 A 通路,还是 B 通路。
字符串的第三部分是可选反,如果被指定,用来指定是使用的第几个视频口。
显示驱动中的命名规则与采集中使用的是一致的。例如:"/VP0DISPLAY/A/0"。
3. 采集与显示驱动程序的结构
这一节主要介绍驱动程序的与执行。驱动程序使用不同DSP/BIOS与CSL库的模块
(参看附录A)。关这两部分的内容可参看文档TMS320C6000 DSP/BIOS Application
Programming Interface (literature number SPRU403) and TMS320C6000 Chip Support
Library API Reference Guide (literature number SPRU401)。有关EDMA的详细内容可以参
看文档TMS320C6000 Peripherals Reference Guide (literature number SPRU190)。有关
视频口的详细内容可以参看文档TMS320C64x DSP Video Port/ VCXO Interpolated
Control (VIC) Port Reference Guide (literature number SPRU629)。
3.1 原理框图
图三:显示驱动的原理框
上图说明了显示驱动的原理。在显示操作中,数据从位于存贮空间的视频帧的数据缓冲
区通过EDMA传递到视频口的FIFO内。视频口再将这些数据通过外部的Encoder送至显示
屏。当每一帧的数据从存贮空间传视频口后,触发EDMA中断。这个中断是整个程序的关键,
被驱动程序用做下以目的:
帧缓冲区的管理
EDMA 的重装
通过回调函数类驱动空的帧缓冲区已经可以被应用程序所填写。
视频口的全局中断是可选的。它可以使应用程序处理视频口的错误或是同步问。
采集驱动除了在数据方向上与显示驱动相反外,其它均是一致的。
3.2 缓冲区的管理
包含视频数据的帧缓冲区是由驱动程序初始化并进行管理的。驱动程序在运行时,至少
需要配置3个帧数据缓冲区。驱动程序将根据通数参数来计算帧缓冲区的大小。例如,一整
帧的PAL帛的视频帧的大小为720X576X2。但如果,缩小1/2被使能,缓冲区的大小则被减
半。
通过FVID_alloc(),FVID_free(),FVID_exhange()函数,帧缓冲区可以在应用程序与
驱动之间进行交换。然而对于显示与采集来说,其对帧缓冲区的处理是不一致的。具体
说明如图四与图五。
图四:采集驱动的缓冲区管理
在采集过程中,所有的帧缓冲区都被初始化的状态是处于空队列内,并且驱动程序使其
进行循环。其说明见图4(a)。
当应用程序调用FVID_alloc()时,将驱动程序中最新的一个帧数据缓冲取出,驱动程序
命名剩下的缓冲区进行循环。其说明从图4(a)到4(b)、从4(b)到4(e)。
当程序调用FVID_free()时,一个空的帧数据缓冲区从应用程序返回驱动程序的空队列
中,其说明从图4(b)到4(a)、从4(e)到4(b)。
当程序谳用FVID_exhange()时,一个空的帧数据缓冲区从应用程序返回驱动程序的空
队列中,同时,将驱动程序中最新的一个帧数据缓冲取出。其作用相当于顺序调用FVID_free()
与FVID_alloc()。其说明从图4(b)到4(c)、从4(c)到4(d)。
图五:显示驱动的缓冲区管理
在显示过程中,在其初始化时,除了一个帧缓冲区处于输出队列中,其它的都准备由应
用程序进行抓取。驱动程序重复的显示处于输出队列中的帧缓冲区。共说明如图5(a)。
当应用程序调用FVID_alloc()时,在当前的帧显示缓冲区正还在显示时,从显示驱动获
取一个帧缓冲区并开始填写要显示的数据。其说明如5(b)与5(d)。
当应用程序调用FVID_Free()时,和序将已经填好数据的帧缓冲区还给驱动程序。驱动
程序在前一个显示帧缓冲区显示结束后将按顺序将其做为当前的显示帧。其说明从5(b)到
5(c)到5(d)。
当程序调用FVID_exchange()时,把已填好数据的缓冲区还给驱动程序,并从驱动程序
代回一个空的帧缓冲区。共做用相当于顺序调用FVID_free()与FVID_alloc()。其说明从5(d)
到5(e)。
3.3 Cache的一致性
确保Cache的一致性是应用程序的责任,驱动在这一点上未做任何的处理。这是因为数
据主要是在高速的片上SRAM与片外较低的SD-RAM之间通过EDMA进行传输。这比CPU获
取数据要快得多。当算法使用乒乓机制时,可以使CPU的执行与EDMA的传送同时进行。从
而掩藏了数据的搬移过程。在帧缓冲区的边界与Cache的边界一致情况下,Cache的刷新与
清空操作是可以被避免的。
然而,当应用程驐直接使用这些帧缓冲区时,应用程序必须刷新与清空Cache,来确保
其一致性。因为当CPU通过Cache获取数据时,EDMA正通过EMIF从片外的SDRAM搬运数
据。
4. 视频采集与显示驱协的使用约束
此驱动程序不支持下列模式:
原始数据的采集
双通路同步的原始数据显示
两个视频口的同步
MPEG 格式的数据流的采集。
5. 参考资料
以下的文档均可以在http://www.ti.com上获取
1. DSP/BIOS Driver Developer’s Guide (SPRU616)
2. TMS320C64x DSP Video Port/ VCXO Interpolated Control (VIC) Port Reference
Guide (SPRU629)
3. TMS320C6000 DSP/BIOS Application Programming Interface (SPRU403)
4. TMS320C6000 Chip Support Library API Reference Guide (SPRU401)
5. TMS320C6000 Peripherals Reference Guide (SPRU190)
附录 A Device Driver Data Sheet
A.1 驱动程序的名称
Seedvpm642_vport2.1.l64.
A.2 使用到的 DSP/BIOS模块
HWI – 硬件中断管理器
QUE – 队列管理器
IOM – I/O 管理器
A.3 使用到的 DSP/BIOS对象
QUE_Obj:队列对象
A.4 使用到的 CSL模块
EDMA 模块
IRQ 模块
I2C 模块
VP 模块
A.5 使用到的 CPU 中断
EDMA interrupt
Video Port interrupt
A.6 使用到的外设
EDMA
EMIF
I2C
Video Port
A.7 最大的中断延时(显示/采集)
89/71 cycles
A.8 存贮空间的使用
表A−1. 驱动程序对存贮空间的占用 (显示/采集)
附录 B FVID APIs 函数接口
B.1 概述
FVID模块是为使基于DSP/BIOS应用程序操作视频帧数据采集与显示的一组API接口。
FVID是在GIO类驱动的基础上进行了简单的封装,提供应用程序与视频数据之间定制的接
口。有关DSP/BIOS设备驱动模型和GIO类驱动更多的信息,参看以下的说明。
FVID设备驱的API与那些需要由应用程序自已管理数据缓冲区的驱动程序是不一样的。
绝大多数DSP/BIOS设备驱动程序希望应用程序初始化数据缓冲区,并将指向数据缓冲区的
地址指针传给驱动程序,完成数据的输入与输出。FVID与视频采集与显示的Mini-driver工作
正好相反。它是由设备驱动进行初始化并管理数据缓冲区。这种方法的目的是为了解决视频
系统中的高速运行的大容量,专一的数据缓冲区的管理。这些数据缓冲区是存在系统的堆内
的,也是使用这种方法才能更好的进行控制。由于缓冲区的大小、位置与状态都是在驱动程
序内进行处理的,驱动程序可以更好的管理数据缓冲区。
基于帧的视频系统都具多数据缓冲的特点。双数据缓冲一般是这样安排:一个数据缓冲
区将数据与视频编解码器件之间进行传送,另一个由应用程序进行处理。两个数据缓冲区是
在帧同步时进行交换的。三缓冲的安排可以使应用程序无需等待帧同步的情况下获取一个数
据缓冲区。在采集与显示驱动中,一般采用三缓冲的安排。
B.2 FVID的 APIs
通过以上的介绍可知,采集与显示驱动程序初始化并管理视频的帧缓冲区,应用程序则
是在需要的时候获取这些缓冲区。FVID的APIs首要的任务就是管理这些驱动程序在驱动与
应用程序之间所有权的分配。FVID的两个核心调用如下:
FVID_alloc 使应用程序获取一个视频的帧缓冲区
FVID_exchange 把应用程序所拥有的缓冲区,与驱动程序所拥有的缓冲区进行交
换
当驱动程被初始化后,应用程序首先使用FVID_alloc获取一个数据缓冲区,然后就可以
调用FVID_exchange在应用程序与驱动程序之间进行缓冲区的交换。
FVID接口与DSP/BIOS完全兼容的。每一个通路的FVID产生一个独立的同步体。当进
行获取与交换视频缓冲区时,可以进行阻塞或非阻塞处理。这由用户在初始化同步体时是否
指定了其超时参数决定的。
下面是一个简单的例子,说明了应用程序获取采集数据,并将在一定的器件上进行显示。
#include
#include
main()
{
/* 当Main()结束时DSP/BIOS 开始运行 */
}
/* 视频处理任务 */
void tskVDisplay()
{
/* 采集与显示的设备对象 */
GIO_Handle capChan, disChan;
/* 采集与显示的帧缓冲区 */
FVID_Frame *capFrameBuf, *disFrameBuf;
/* 产生并初始化FVID的通路对象*/
capChan = FVID_create(”/vcap”, IOM_INPUT, NULL, (Ptr)&capParams, NULL);
disChan = FVID_create(”/vdis”, IOM_OUTPUT, NULL, (Ptr)&disParams, NULL);
/* 应用程序获取第一个采集帧与显示帧*/
FVID_alloc(capChan, &capFrameBuf);
FVID_alloc(disChan, &disFrameBuf);
while(1)
{
/* 将采集帧缓冲数据,拷贝到显示帧缓冲区,并进行交换 */
FrameDataCopy(capFrameBuf, disFrameBuf);
FVID_exchange(capChan, &capFrameBuf);
FVID_exchange(disChan, &disFrameBuf);
}
}
B.3 API说明
B.3.1 函数
FVID定义的API函数列表如下:
FVID_allo
本文档为【合众达DM642驱动程序设计】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。