Windows 驱动基础系列,转载请标明出处:http://blog.csdn.net/ikerpeng/article/details/38865317
摄像头驱动的主要目的是通过通过硬件捕捉视频信号。
WDM摄像头驱动框架。
主要包括两种的驱动ClassDriver(由Windows提供,为了统一标准), MiniDriver(由程序员实现)
Class Driver:
与操作系统交互,包括处理同步,提够标准接口。
Mini Driver:
主要由类驱动调用,负责具体的硬件相关的操作。
通过一个图看看他们的关系:
其中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 驱动开发技术详解 》