广播驱动体系(BDA) 系列讲座:五

By | 12月22日
Advertisement

BDA minidriver的职责:调制(tunning)信号,解调(demodulating)信号,获取(capture),分流(demultiplexing)。BDA是在AVStream上的扩展,Bdasup.lib提供了BDA的属性集和方法集。写BDA驱动的主要工作就是把Bdasup.lib中要求的属性集方法集的例程都注册一遍(需要的注册,确实不需要的也可以不管),提供自己的实现。

BDA驱动的入口是DeviceEntry函数,在这个函数里主要做的工作就是注册分发例程,调用KsInitializeDriver 函数,传入一个KSDEVICE_DESCRIPTOR类型的参数,该参数中指定了一个KSDEVICE_DISPATCH参数,用来注册各种例程。一个典型的KSDEVICE_DISPATCH参数如下所示:

广播驱动体系(BDA) 系列讲座:五
extern
广播驱动体系(BDA) 系列讲座:五
const
广播驱动体系(BDA) 系列讲座:五
KSDEVICE_DISPATCH
广播驱动体系(BDA) 系列讲座:五
DeviceDispatch =
广播驱动体系(BDA) 系列讲座:五
广播驱动体系(BDA) 系列讲座:五
广播驱动体系(BDA) 系列讲座:五
{
广播驱动体系(BDA) 系列讲座:五
CDevice::Create, // Add
广播驱动体系(BDA) 系列讲座:五
CDevice::Start, // Start
广播驱动体系(BDA) 系列讲座:五
NULL, // PostStart
广播驱动体系(BDA) 系列讲座:五
NULL, // QueryStop
广播驱动体系(BDA) 系列讲座:五
NULL, // CancelStop
广播驱动体系(BDA) 系列讲座:五
NULL, // Stop
广播驱动体系(BDA) 系列讲座:五
NULL, // QueryRemove
广播驱动体系(BDA) 系列讲座:五
NULL, // CancelRemove
广播驱动体系(BDA) 系列讲座:五
NULL, // Remove
广播驱动体系(BDA) 系列讲座:五
NULL, // QueryCapabilities
广播驱动体系(BDA) 系列讲座:五
NULL, // SurpriseRemoval
广播驱动体系(BDA) 系列讲座:五
NULL, // QueryPower
广播驱动体系(BDA) 系列讲座:五
NULL // SetPower
广播驱动体系(BDA) 系列讲座:五
};
广播驱动体系(BDA) 系列讲座:五

广播驱动体系(BDA) 系列讲座:五

这部分工作实际上是AVStream minidriver要做的,考虑到bda是在AVStream基础上的扩展,我们写bda minidriver时也要做相同的工作。类似的工作在WDM驱动里也要做,不同的是WDM的例程注册都是类似赋值的语句,而AVStream minidriver的例程注册使用一些模板完成,为我们省掉很多工作。

CDevice::Create 例程中,我们要做的事情主要包括:Download firmware和生成必要Filter实例,如有必要还可以配置DMA等。Download firmware之前要先获得板子的product_id,然后调用Reset8051(0x09),通知下层开始传输fireware,传完后再调用Reset8051(0x08)通知下层传输完毕。生成Filter调用BdaCreateFilterFactory 函数,传入BDA_FILTER_TEMPLATE参数,在该参数中需要指定FilterDispatch,FilterAutomation,PinDescriptors,KSFILTER_CATEGORY(目录位置),NodeDescriptors 和 CONNECTIONS。 FilterDispatch指定了Filter的各个分发例程,FilterAutomation用于提供PropertySet(属性集)和MethodSet(方法集),PinDescriptors用于指定Pin的各个分发例程,KSFILTER_CATEGORY指定生成的的Filter在哪个目录底下(硬件filter用目录索引的方法寻找实例,而不是像软件filter那样用GUID寻找实例),NodeDescriptors 和 CONNECTIONS 共同指定了filter内部的功能拓扑图。

一个典型的FilterDispatch 如下图所示

广播驱动体系(BDA) 系列讲座:五
const
广播驱动体系(BDA) 系列讲座:五
KSFILTER_DISPATCH
广播驱动体系(BDA) 系列讲座:五
FilterDispatch =
广播驱动体系(BDA) 系列讲座:五
广播驱动体系(BDA) 系列讲座:五
广播驱动体系(BDA) 系列讲座:五
{
广播驱动体系(BDA) 系列讲座:五
CFilter::Create, // Create
广播驱动体系(BDA) 系列讲座:五
CFilter::FilterClose, // Close
广播驱动体系(BDA) 系列讲座:五
NULL, // Process
广播驱动体系(BDA) 系列讲座:五
NULL // Reset
广播驱动体系(BDA) 系列讲座:五
};

一个典型的PinDescriptors如下所示

广播驱动体系(BDA) 系列讲座:五
const
广播驱动体系(BDA) 系列讲座:五
KSPIN_DESCRIPTOR_EX
广播驱动体系(BDA) 系列讲座:五
InitialPinDescriptors[] =
广播驱动体系(BDA) 系列讲座:五
广播驱动体系(BDA) 系列讲座:五
广播驱动体系(BDA) 系列讲座:五
{
广播驱动体系(BDA) 系列讲座:五
// Antenna Pin
广播驱动体系(BDA) 系列讲座:五
//
广播驱动体系(BDA) 系列讲座:五
广播驱动体系(BDA) 系列讲座:五
广播驱动体系(BDA) 系列讲座:五
{
广播驱动体系(BDA) 系列讲座:五
&AntennaPinDispatch, 分发例程
广播驱动体系(BDA) 系列讲座:五
&AntennaAutomation, // Pin上的属性集和方法集
广播驱动体系(BDA) 系列讲座:五

广播驱动体系(BDA) 系列讲座:五
//下面是该pin的类型定义
广播驱动体系(BDA) 系列讲座:五
广播驱动体系(BDA) 系列讲座:五
广播驱动体系(BDA) 系列讲座:五
{
广播驱动体系(BDA) 系列讲座:五
0, // Interfaces
广播驱动体系(BDA) 系列讲座:五
NULL,
广播驱动体系(BDA) 系列讲座:五
0, // Mediums
广播驱动体系(BDA) 系列讲座:五
NULL,
广播驱动体系(BDA) 系列讲座:五
SIZEOF_ARRAY(AntennaPinRanges),
广播驱动体系(BDA) 系列讲座:五
AntennaPinRanges,
广播驱动体系(BDA) 系列讲座:五
KSPIN_DATAFLOW_IN,
广播驱动体系(BDA) 系列讲座:五
KSPIN_COMMUNICATION_BOTH,
广播驱动体系(BDA) 系列讲座:五
NULL, // Name
广播驱动体系(BDA) 系列讲座:五
NULL, // Category
广播驱动体系(BDA) 系列讲座:五
0
广播驱动体系(BDA) 系列讲座:五
},
广播驱动体系(BDA) 系列讲座:五

广播驱动体系(BDA) 系列讲座:五
下面指定传输类型和方式
广播驱动体系(BDA) 系列讲座:五
KSPIN_FLAG_DO_NOT_USE_STANDARD_TRANSPORT |
广播驱动体系(BDA) 系列讲座:五
KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING |
广播驱动体系(BDA) 系列讲座:五
KSPIN_FLAG_FIXED_FORMAT,
广播驱动体系(BDA) 系列讲座:五
1, // InstancesPossible
广播驱动体系(BDA) 系列讲座:五
0, // InstancesNecessary
广播驱动体系(BDA) 系列讲座:五
NULL, // Allocator Framing
广播驱动体系(BDA) 系列讲座:五
NULL // PinIntersectHandler
广播驱动体系(BDA) 系列讲座:五
}
广播驱动体系(BDA) 系列讲座:五
};
广播驱动体系(BDA) 系列讲座:五

广播驱动体系(BDA) 系列讲座:五

一个典型的AntennaPinDispatch 如下图所示

广播驱动体系(BDA) 系列讲座:五
const
广播驱动体系(BDA) 系列讲座:五
KSPIN_DISPATCH
广播驱动体系(BDA) 系列讲座:五
AntennaPinDispatch =
广播驱动体系(BDA) 系列讲座:五
广播驱动体系(BDA) 系列讲座:五
广播驱动体系(BDA) 系列讲座:五
{
广播驱动体系(BDA) 系列讲座:五
CAntennaPin::PinCreate, // Create
广播驱动体系(BDA) 系列讲座:五
CAntennaPin::PinClose, // Close
广播驱动体系(BDA) 系列讲座:五
NULL, // Process signal data
广播驱动体系(BDA) 系列讲座:五
NULL, // Reset
广播驱动体系(BDA) 系列讲座:五
NULL, // SetDataFormat
广播驱动体系(BDA) 系列讲座:五
CAntennaPin::PinSetDeviceState, // SetDeviceState
广播驱动体系(BDA) 系列讲座:五
NULL, // Connect
广播驱动体系(BDA) 系列讲座:五
NULL, // Disconnect
广播驱动体系(BDA) 系列讲座:五
NULL, // Clock
广播驱动体系(BDA) 系列讲座:五
NULL // Allocator
广播驱动体系(BDA) 系列讲座:五
};

属性集和方法集可以在filter里提供,也可以在Node里提供。Filter上提供的属性集可以被应用层调用,而Node上提供的属性集则只能是BDA架构内的东西可以调用(如第一页所讲,tunner里的两个node都是Network Provider通过内置的GUID来访问的,node上只需要提供BDA中需要的属性集和方法集即可,比如设置频率等,而这些属性集方法集所绑定的GUID也是BDA内置的。)Filter上提供的属性集可以为上层定制很多特定功能,可以代替DeviceIoControl,实际上在BDA架构下不建议使用DeviceIoControl。

(据观察,我的程序中

Demodulator Node中有一个PropertySetKSPROPSETID_BdaAutodemodulate

Tunner Node中有 KSPROPERTY_BDA_RF_TUNER_FREQUENCY_MULTIPLIER

KSPROPERTY_BDA_RF_TUNER_FREQUENCY

KSPROPERTY_BDA_SIGNAL_STRENGTH

KSPROPERTY_BDA_SIGNAL_QUALITY

KSPROPERTY_BDA_SIGNAL_PRESENT

KSPROPERTY_BDA_SIGNAL_LOCKED

KSPROPERTY_BDA_SAMPLE_TIME

这几个属性,提供对内置frequency和signal的操作的实现。所有BDA内置的属性请参看DDK à Device Technology à Video Capture Device à Reference à Broadcast Driver Architecture Drivers à Broadcast Driver Architecture Property, Event, and Method Sets)。

视频采集驱动中最关键的操作:数据采集,发生在Capture Filter的Output Pin的状态从其他状态变成Start状态时。它会启动一个工作线程,不停的从底层采集数据存放在缓存中,并调用KsPinAttemptProcessing方法以响应Capture Filter的Process方法把数据往后传。

Stream Pointers是AVStream minidriver中把数据从一个filter传到下一个filter的方法,BDA扩展自AVStream,所以BDA传数据也用Stream Pointers。AVStream内部管理了一条数据队列,我们要做的事情是往队列里塞数据,把当前指针往后移以及销毁过期数据。Process操作会把Stream Pointer指向的数据复制给下一个与他相连的filter,具体细节被屏蔽,我们要关心的只有Stream Pointer。要把数据往后移,我们可以调用KsStreamPointerAdvance 函数 , 或者KsStreamPointerUnlock 函数(Eject 参数设置为TRUE),函数中传入要移动数据的Stream Pointer即可。调用完后需要再调用KsStreamPointerSetStatusCode 查看操作是否成功,如果有错误,则调用KsStreamPointerDelete 方法销毁数据(实际上不是真的销毁,只是减少引用计数。当引用计数减少到0的时候,数据才被真正销毁)。

Stream Pointers还提供了一套管理数据队列的方法,KsPinGetLeadingEdgeStreamPointer取得头指针,KsPinGetTrailingEdgeStreamPointer取得尾指针,KsPinGetFirstCloneStreamPointer取得当前正在用的数据的指针,KsStreamPointerGetNextClone则指向当前指针的下一个指针。

如果要传输的只是一个帧里的某一些数据,则调用KsStreamPointerAdvanceOffsets 或者 KsStreamPointerAdvanceOffsetsAndUnlock.函数。

在DeviceAdd例程中,我们还可以在KsDeviceàContext中加入我们需要的数据,这批数据的生命周期就会一直延续到DeviceRemove例程完成为止,在程序中定义一些全局变量是不可取的,最好全放在KsDeviceàContext中。

Similar Posts:

  • Eclipse零起步系列讲座 (四~六)(转贴)

    Eclipse零起步系列讲座 (四) =========================================== (前言)大家根据上一讲,加之好好练习,相信您会越来越喜欢用eclipse来开发java程序的. 那今天这篇, 应ForEclipse版友的要求, 就写一篇关于eclipse下使用cvs的文章 .而且昨天那篇水贴,大家都谈了谈使用感受,我也觉的受益非潜. 呵呵, 就来总结一下把. (正文) [CVS 简介] CVS 是 Concurrent Versions System的

  • 1025.在线视频—shell脚本系列讲座(三)千机变—脚本变量

    shell脚本系列讲座有以下主题 (一)shell脚本与应用示例 (二)三剑客-文本处理 (三)千机变-脚本变量 (四)向左向右-条件选择 (五)望山跑死马-循环 (六)脚本函数与任务调度 (七)脚本分析与应用技巧 以下是(三)千机变-脚本变量的在线视频,附件是此视频的电子课件: shell脚本系列视频访问链接: (一)shell脚本与应用示例 (二)三剑客-文本处理 (三)千机变-脚本变量 (四)向左向右-条件选择 (五)望山跑死马-循环 (六)脚本函数与任务调度 本文出自 "培训师李明峻&q

  • ZT:再看OA系列讲座之七:OA主业不是文秘

    再看OA系列讲座之七:OA主业不是文秘[ZT] 国土资源部信息中心副主任 查宗祥 2002-9-16 中国计算机用户 提到OA,很多人.特别是领导干部会联系到公文流转业务,称它为"以公文流转为主要内容的"办公自动化系统.但不同部门由于工作性质(内容)的不同,对OA的认识和需求是不完全相同的.同时,伴随IT技术发展的变化,OA的概念也在发生着根本的变化.当电子政务的概念提出后,有人将OA进行重新包装,以电子政务的形式来推向市场.那么到底如何看待又火起来的OA呢? OA的主业是"

  • 测试驱动的开发系列 第二部分:用JUnit测试Java类

    选择自 chaosii 的 Blog --http://dev.csdn.net/user/chaosii 测试驱动的开发系列 第二部分:用JUnit测试Java类 Test_Driven Development Series Part I:Testing Java Classes with JUnit By Wellie Chao January 2004 一.简介(Introduction) 看到这儿你应该已经知道为什么测试如此重要了.如果还没有的话,请先阅读这个分为五个部分的系列论文中的第

  • solr与.net系列课程(五)solrnet的使用

    solr与.net系列课程(五)solrnet的使用 最近因项目比较忙,所以这篇文章出的比较晚,离上一篇文章已经有半个月的时间了,这节课我们来学下一下solr的.net客户端solrnet 出处 https://github.com/mausch/SolrNet 上一篇文章讲述了C#是如何请求和接受solr的数据的,请求链接是自己拼接的,接受数据是使用数据契约,solrnet就是把这些步骤封装起来,大家直接调用方法就可以请求和接受数据 首先要下载solrnet所要使用的DLL Microsoft

  • 【软件测试自动化-QTP系列讲座 22】 == 描述性编程 ==

    Rss订阅IQuickTest(关于如何订阅?) GoogleReader订阅地址: http://feeds.feedburner.com/iquicktest 作者:zzxxbb112 时间:2009/12/09 版权所有,侵权必究. 出处:http://blog.csdn.net/zzxxbb112 这一章的内容较为简单,对描述性编程熟悉的朋友可以直接略过,为了教程的完整性还是把这章的内容补上去,在学习本章之前,请先务必完成以下讲座的学习: [软件测试自动化-QTP系列讲座 2] == 对

  • 数学之美 系列十五 繁与简 自然语言处理的几位精英

    数学之美 系列十五 繁与简 自然语言处理的几位精英 我在数学之美系列中一直强调的一个好方法就是简单.但是,事实上,自然语言处理中也有一些特例,比如有些学者将一个问题研究到极致,执著追求完善甚至可以说完美的程度.他们的工作对同行有很大的参考价值,因此我们在科研中很需要这样的学者.在自然语言处理方面新一代的顶级人物麦克尔·柯林斯 (Michael Collins) 就是这样的人. 柯林斯:追求完美 柯林斯从师于自然语言处理大师马库斯 (Mitch Marcus)(我们以后还会多次提到马库斯),从宾夕

  • JAVA笔试面试必考题系列(五)——传了值还是传了引用?

    JAVA面试题解惑系列(五)--传了值还是传了引用? 关键字: java 面试题 值传递 引用传递 作者:臧圩人(zangweiren) 网址:http://zangweiren.iteye.com >>>转载请注明出处!<<< JAVA中的传递都是值传递吗?有没有引用传递呢? 在回答这两个问题前,让我们首先来看一段代码: Java代码 public class ParamTest { // 初始值为0 protected int num = 0; // 为方法参数重新

  • [原]【软件测试自动化-QTP系列讲座 50】== 自定义实时控制台输出 ==

    作者:zzxxbb112 时间:2011/12/21 版权所有,侵权必究. 出处:http://blog.csdn.net/zzxxbb112 终于迎来了本系列讲座的第50讲内容,这次的内容比较特别,大家都知道Visual Studio 与 Eclipse这两大目前主流的开发IDE都有控制台,那么今天这次讲座笔者就带领大家来打造一个实时信息显示的控制台. 首先给大家来看张图: 分析:我们来看一下这张图,图中一共有三个窗口:QTP应用程序.print打印窗口和IE浏览器窗口,注意这三个窗口并不是笔

  • MySQL查询优化系列讲座

    MySQL查询优化系列讲座 连载文章简介: 当前连载文章篇数4篇 1. MySQL查询优化系列讲座之调度和锁定 2. MySQL查询优化讲座之管理员的优化措施 3. MySQL查询优化系列讲座之数据类型与效率 4. MySQL查询优化系列讲座之查询优化器

Tags: