Windows摄像头驱动研究(一)

Windows 驱动基础系列,转载请标明出处:http://blog.csdn.net/ikerpeng/article/details/38865317


摄像头驱动的主要目的是通过通过硬件捕捉视频信号。


WDM摄像头驱动框架。

主要包括两种的驱动ClassDriver(由Windows提供,为了统一标准), MiniDriver(由程序员实现)


Class Driver:

与操作系统交互,包括处理同步,提够标准接口。

Mini Driver:

主要由类驱动调用,负责具体的硬件相关的操作。

通过一个图看看他们的关系:

                                     Windows摄像头驱动研究(一)

其中SRB是 Stream Request Block。


初始化:

1. 即插即用的设备,插入后调用Mini Driver的 DriverEntry例程;

2 Mini Driver 在自己的DriverEntry中填充HW_INITIALIZATION_DATA,然后返回StreamClassRegisterMinidriver;

3. Class Driver 中初始化一个SRB_INITIALIZE_DEVICE类型的SRB,这个SRB中的CommandData.ConfigInfo记录着摄像头硬件的相关信息;

    这个SRB会传递给小驱动,小驱动会由此得到一些硬件的信息并返回;同时告知类驱动,小驱动已经初始化完毕。

4. 然后类驱动再向小驱动发送一个SRB:SRB_GET_STREAM_INFO, 由此获得:HW_STREAM_HEADER 数据信息和 HW_STREAM_INFORMATION等信息这些信息中包括了摄像头驱动中提供的视频图像的大小,图像的格式等信息;

5. 然后类驱动再发送一个 HW_STREAM_INFORMATION的SRB,这次请求以后,小驱动应该做完所有的初始化操作,并返回给驱动程序。


·每个Minidriver都必须提供的例程:


StrMiniCancelPacket: 对 HW_SRB数据包进行取消的回调函数;

StrMiniReceiveDevicePacket: 获取 HW_SRB数据包的回调函数;

StrMiniRequestTimeout : 对HW_SRB数据包进行超时处理的回调函数;

StrMiniEvent: 使小驱动支持某一事件;

StrMiniInterrupt: 当驱动遇到中断时调用的回调函数;

·Minidriver为每个单独的流提供的例程:

StrMiniReceiveStreamDataPacket:对于获取数据流的回调函数

StrMiniReceiveStreamControlPacket: 对于控制数据流的回调函数

StrMiniEvent: 使数据流支持一种事件

StrMiniClock: 对于数字流时钟控制的回调函数。


我们再来看一下驱动程序的工作流:


1. 设备插入,被即插即用设备管理器检测到;

2. 于是创建PDO,产生相应的IRP;

3. 于是I/O子系统加载MiniDriver,并进入到DriverEntry;

4. 在DriverEntry里面初始化:HW_INITIALIZATION_DATA 数据结构(其中包括控制SRB的HwReceivePacket);

5.类驱动程序构造SRB,并将其Command设置为SRB_INITIALIZATION_DEVICE;

6,. 将此SRB作为参数,调用HwReceivePacket;

7,如此类似构造:open close等等的SRB,调用HwReceivePacket。


本节完。


参考书目:

《 Windows 驱动开发技术详解 》

Windows摄像头驱动研究(一)

上一篇:Windows上使用GitHub上传代码菜鸟起步


下一篇:Windows 系统下Git安装图解