流微型驱动开发指南(三)

Windows摄像头驱动研究(一) Windows 驱动基础系列,转载请标明出处:http://blog.youkuaiyun.com/ikerpeng/article/details/38865317 摄像头驱动的主要目的是通过通过硬件捕捉视频信号。 WDM摄像头驱动框架。 主要包括两种的驱动ClassDriver(由Windows提供,为了统一标准), MiniDriver(由程序员实现) Class Dri 阅读详情

三、开始着手编写Stream Minidriver

设计Stream Class Driver的主要目标,就是处理两个工作,一是处理操作系统,操作系统包含了对复杂的对多处理器的支持,二就是对内核流进行支持。这样Minidriver只需要对它必须执行的,与设备相关的操作进行处理即可。Class Driver为Minidriver分配内存空间,对Minidriver可能用到的NT内核资源进行登记,并(随意地)处理同步问题。

Class Driver通过一系列由Minidriver提供的回调函数和Minidriver进行通讯。大部分对流式Minidriver写的动作都发生在写这些回调函数的时候。

在本文中,我们所提到的每种由Minidriver提供的例程都命名为StrMin×××。根据下层硬件可能执行的不同功能的数目,Minidriver也许要为每个例程提供一到更多的版本。

一个典型的流驱动都会支持数种不同的数据流。例如,DVD播放器会产生音频和视频流。在内核流环境中,每个流都用一个pin来描述。(参见KS Filters, Pins and Node Topology for a description of pins)。

流类驱动会跟踪Minidriver上的每个pin,在Class Driver看来, pin的每种类型都是一个流。流,就好比Pin的类型,有可能会有多个实例。因为流可以接收I/O请求,所以驱动程序必须为每个流提供相关的回调函数。

下面所列的例程,Minidriver一般都会提供。在参考大全中会更加详细记录这些函数的细节。

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

StrMiniCancelPacket

StrMiniReceiveDevicePacket

StrMiniRequestTimeout

StrMiniEvent

StrMiniInterrupt

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

StrMiniReceiveStreamDataPacket

StrMiniReceiveStreamControlPacket

StrMiniEvent

StrMiniClock

对于Minidriver来说,对数个不同的流使用相同的回调例程是可以的。回调例程可以通过调用它的流的参数来确定执行何种动作。

同WDM驱动一样,Minidriver必须提供DriverEntry例程。Minidriver的DriverEntry例程的主要任务,就是向Class Driver注册Minidriver。

Class Driver代表Minidriver接收所有的I/O请求。为了获取完成此次请求所必须的信息,Class Driver创建一个流请求块(Stream Request Block,SRB)并把它传递给形如StrMin×××Packet的众多例程中的一个。总体的来说,Class Driver向某设备分派I/O请求就等同于向StrMiniReceiveDevicePacket例程传递流请求块SRB,它把请求发送到各个独立的流的StrMiniReceiveStreamDataPacket例程(适用于内核流的读写请求)或者StrMiniReceiveStreamControlPacket例程(适用于其他请求)。

通常说来,Class Driver会对所有的请求进行排队,然后每次发送一个请求给Minidriver。Minidriver可以随意地进行它自己的同步操作;Minidriver负责对它目前无法立即处理的请求进行排队。详见Minidriver Synchronization。

Minidriver必须提供两个额外的例程以对SRB进行操作。当Class Driver收到一个取消IRP包(Cancel IRP)时,就会去调用StrMiniCancelPacket,以此来通知Minidriver取消某个特定的包。Class Driver会跟踪Minidriver完成处理一个SRB所花费的时间。如果Minidriver花费了很长时间还没有处理完一个请求,Class Driver将会对该请求返回超时,同时调用StrMiniRequestTimeout例程。

当发生了一个硬件中断时,操作系统会照会Class Driver,然后Class Driver调用Minidriver的StrMiniInterrupt例程去处理该中断。

四、处理流请求块SRB

操作系统会把所有对设备的I/O请求分发到Class Driver。通过向Minidriver传递SRB,Class Driver轮流从Minidriver处获取硬件的相关信息,Class Driver通过设置SRB的命令成员来指定它要求完成的操作。

总体上看,整个Minidriver,和它包含的每个流,都可能会收到I/O请求。Minidriver必须提供StrMiniReceiveDevicePacket例程来处理整个设备范围内的请求(Device-wide requests)每个流必须支持两个用来处理I/O请求例程:一个用来处理数据请求的例程,还有一个例程用来处理控制请求。Class Driver会调用那个用来处理数据请求的回调例程:StrMiniReceiveStreamDataPacket,来处理所有对指定流的读写请求。所有其他对流的请求会传递给StrMiniReceiveStreamControlPacket例程进行处理。

如果Class Driver正在为Minidriver处理同步,那么它会把所有的流请求进行排队,然后依次把它们发送给Minidriver,每次只发送一个请求。Class Driver维护了三种相互独立的队列:一个设备请求队列,另外每个留都有一个数据请求队列和控制请求队列。Minidriver会通知说它已经准备好接收一个新的请求。每种请求队列所对应的、用来通知Class Driver的例程和参数如下表所示:

请求类型

例程

例程的通知类型参数

设备请求

StreamClassDeviceNotification

ReadyForNextDeviceRequest

流控制请求

StreamClassStreamNotification

ReadyForNextStreamControlRequest

流数据请求

StreamClassStreamNotification

ReadyForNextStreamDataRequest

当Class Driver调用StrMiniReceive×××Packet例程时,它会把SRB转交给Minidriver。在Minidriver通知Class Driver,它已经对完成处理该请求之前,Minidriver中负责进行处理的例程对SRB有独占存取权限。

当Minidriver完成对一个请求的处理后,它应当按如下方式通知Class Driver它已经完成对请求的处理:

1.设置SRB中表示当前请求状态的状态域;

2.调用例程StreamClassDeviceNotification或StreamClassStreamNotification,通知Class Driver说它已经完成对请求的处理。如果完成的是一个设备请求,Minidriver要使用DeviceRequestComplete作为通知类型参数来调用例程StreamClassDeviceNotification;如果完成的是一个流请求,Minidriver要用StreamRequestComplete作为通知类型参数调用例程StreamClassStreamNotification。

3. 如果Class Driver当前正在处理同步,并且如果与此同时Minidriver还没有通知Class Driver说它已经做好准备接收对当前类型队列(注意,前面说过有三种类型的请求队列)的下一个请求,那它现在应该立即这样做(通知Class Driver)。

Minidriver可以通过调用StreamClassCompleteRequestAndMarkQueueReady,把2、3两步合并一起做。

Minidriver是以异步的方式处理请求的。所以Class Driver也许会取消一个请求,或者让一个请求超时。为了达到这些目的,Minidriver必须分别提供一个StrMiniCancelPacket例程和一个StrMiniRequestTimeout例程。Class Driver会在他要取消,或者要超时一个请求的时候,调用这两个独立的例程。

当下层的I/O请求被操作系统取消,Class Driver就要取消请求。Class Driver会把那些处理时间过长的请求置为超时,那Class Driver又是如何知道一个请求有没有超时呢?原来,在SRB中有一个成员变量TimeoutCounter,它指定了此请求处理超过多少秒就算超时。Class Driver每秒将此变量减一,如果变量已经减为0,而Minidriver还没有完成该请求,Class Driver就会判定此请求超时,然后它会调用Minidriver的StrMiniRequestTimeout例程。如果Minidriver要推迟很长时间再去处理一个请求,那Minidriver就应该把TimeoutCounter设为0,这样Class Driver不会误判当前请求超时。一旦Minidriver重新开始处理该请求,它应该重置SRB中的TimeoutCounter变量和TimeoutOriginal的值相等,Minidriver可以在请求超时之前重设TimeoutOriginal变量来改变耗时长度。详细信息参见HW_STREAM_REQUEST_BLOCK结构体。

流Mini驱动开发(译自Microsoft DDK) 本节详细讨论了已经过时的Stream.sys Class Driver。随着Microsoft Windows XP的正式发布,Microsoft建议硬件制造商考虑使用下一代Class模型——AVStream——来开发新的,非音频多媒体驱动程序。相关细节可参看《AVStream Overview》一章。Microsoft现在只对Stream.sys提供基本的支持。如果你要开发一个音频Minidri 阅读详情

相关推荐

流微型驱动开发指南(六)

六、Minidriver的控制流程 下面要介绍的这几步,一般都和Minidriver的初始化、调用和卸载密切相关。将要用到的命令和结构在DDK的其他章节均有详细描述。 Minidriver的初始化、调用和卸载的步骤如下: 1.PnP管理器枚举到Minidriver所支持的硬件适配器插入,然后PnP管理器通过检查注册表去解析所有相关的符号引用,并向I/O子系统发送请求。 2.I/O子系统加载Mini

人是会思考的一棵苇草 1529

Stream Minidriver 编写 blog记录

http://blog.youkuaiyun.com/codewarrior/article/category/19380   http://blog.youkuaiyun.com/zijida/article/category/171836

wangandy7811的专栏 799

流微型驱动开发指南(五)

PORT_CONFIGURATION_INFORMATION各成员解释如下:·SizeOfThisPacket  设定本结构的大小,由Class Driver负责填写该域。·HwDeviceExtension  指向Minidriver的设备扩展结构(Device Extension)的指针。Minidriver会藉此buffer记录一些对Minidriver来说是公有的,但是对外是私有的信息。此

人是会思考的一棵苇草 1913

AVstream 和usb driver 模型

AVStream 是指什么? AVStream 是指audio and video stream.是声频和视频数据流. 我们什么情况下考虑用AVStream 进行kmdf/wdm开发? AVStream是微软2003年推出的流驱动开发标准.原来的stream已经不支持了. AVStream简化了的原来stream开发过程,也使stream的开发变得更加简单.对于Pci接口的声音设

xuke537的专栏 1873

Digispark(ATTINY85) 微型开发板驱动安装与开发环境配置教程

Digispark(ATTINY85) 微型开发板驱动安装与开发环境配置教程 文章目录Digispark(ATTINY85) 微型开发板驱动安装与开发环境配置教程参考链接:前言:配置步骤: 参考链接: Digispark(ATTINY85) 微型开发板驱动安装与开发环境配置教程 前言: 说到Digispark(ATTINY85) 微型开发板,我是真滴有很多槽要吐,由于我买来之后一直放着它在吃灰,淘宝的链接都快失效了。 好不容易找到了一个没失效的链接,下载了对应的软硬件驱动,发现插入之后,端口一直无法读取。

hehedadaq的博客 4383

Pixie微型LED链式显示模块技术解析与嵌入式驱动开发

链式LED显示模块是嵌入式人机交互的关键组件,其核心在于单线级联、分布式智能控制与低资源占用的协同实现。Pixie模块通过集成ATTINY45微控制器,将协议解析、PWM调光与数据中继功能下沉至像素节点,显著降低主控实时负担,使Arduino、STM32等MCU可在无额外硬件加速条件下驱动数十级显示。该架构兼顾了紧凑尺寸(20.6mm×34.7mm)、宽压供电(2.7–5.5V)与工业级可靠性(过温降频、奇偶校验、恒流可编程),适用于状态看板、IoT设备指示、工业HMI等对空间、功耗与鲁棒性敏感的场景。本文

weixin_35935514的博客 523

流微型驱动开发指南(二)

二、Stream Class和 Minidriver之间的接口流类接口(Stream Class Interface)主要由介于Class Driver和Minidriver之间的一系列的函数调用组成。Class Driver对请求的流程(Request Flow)进行控制,当有必要对适配器硬件进行存取时,它就调用适配器的Minidriver。Class Driver还负责对多处理器和中断同步作出

人是会思考的一棵苇草 1993

Lattice CrosslinkNx LIFCL-40实战解析:MIPI D-PHY硬核IP配置与CSI-2数据解析全流程

本文详细解析了Lattice CrosslinkNx LIFCL-40 FPGA中MIPI D-PHY硬核IP的配置与CSI-2数据解析全流程。通过实战案例,介绍了硬件环境搭建、寄存器配置、数据包结构解析及视频流重构技巧,帮助开发者快速掌握高速图像采集系统的设计与优化方法。

weixin_29159613的博客 200

流微型驱动开发指南(一)

流微型驱动开发指南——翻译:codewarrior@HS5@HS5注意:本节详述了已经过时的Stream.sys类驱动。随着Microsoft Windows XP的正式发布,Microsoft建议硬件制造商考虑使用下一代Class模型——AVStream——来开发新的,非音频多媒体驱动程序。相关细节可参看《AVStream Overview》一章。Microsoft现在只对Stream.

人是会思考的一棵苇草 2251

富斯遥控器-ros机器人控制

富斯遥控器-ros机器人手柄控制

zkh7758的博客 1702

RK3568/RK3588之修改8250驱动实现RS485收发的自动切换

在串口发送前,若为485,则将控制引脚拉为发送状态,在发送后,循环查看是否发送完成,若发送完成则将引脚置回读状态,如此一来,就能实现在内核测控制方向切换,而不会因为延时造成数据丢失,经过测试此办法可行。全部修改完成后,重新编译生成内核文件和设备树文件,烧写到板子上即可。

哒宰的博客 3120

window 显示驱动开发-微型端口程序的初始化(一)

DriverEntry 分配 DRIVER_INITIALIZATION_DATA 结构,并使用DXGKDDI_INTERFACE_VERSION填充 DRIVER_INITIALIZATION_DATA 的 Version 成员,并使用指向显示微型端口驱动程序的其他入口点函数 ((即显示微型端口驱动程序实现的函数) )的指针填充DRIVER_INITIALIZATION_DATA的其余成员。用户模式显示驱动程序调用运行时提供的回调函数来访问显示微型端口驱动程序中的内核模式服务。

王马的博客 1330

SAP 替代关系完全替代简介

这里产生了成品物料的计划订单,我们查看计划订单中BOM的变化,如下图可以看到物料的需求仍然落在了优先级为1的这个302300005555这个物料上面,并没有考虑到302300006666的这个库存,和我们理解的MRP的完全替代不一样,按我们的理解需求应该是要落在302300006666这个物料料,但是MRP计算后并没有这样进行分配。最近用户在对长周期物料进行备料的时候又提出替代料的问题,主料库存不足的时候需要考虑替代料的在途库存,经常会忘了SAP标准的替代料逻辑,这次一次性把这个逻辑写清楚。

我小时候很黑的博客 1749

微型驱动程序、微型端口驱动程序和驱动程序对

微型驱动程序或微型端口驱动程序可以用作半个驱动程序对。诸如(微型端口、端口)的驱动程序对可以简化驱动程序开发。在驱动程序对中,一个驱动程序处理整个设备集合共同的常规任务,而另一个驱动程序处理特定于单个设备的任务。处理设备特定任务的驱动程序有多个名称,包括微型端口驱动程序、微型类驱动程序和微型驱动程序。 Microsoft 提供一般驱动程序,而独立的硬件供应商通常提供特定驱动程序。在阅读本主题之前

求索 1446

RK356x U-Boot研究所(命令篇)3.10 bidram与sysmem相关命令的作用

RK356x U-Boot研究所(命令篇)3.10 bidram与sysmem相关命令的作用

Systemcall名屋 624

YOLO26优化:注意力魔改 | EMA:基于跨空间学习的高效多尺度注意力,效果优于ECA、CBAM、CA

加入EMA注意力,一种基于跨空间学习的高效多尺度注意力,效果优于ECA、CBAM、CA等经典注意力。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 334

window 显示驱动开发-微型端口程序的初始化(三)

第二次调用中,驱动程序应填充 DXGK_QUERYSEGMENTOUT 或 DXGK_QUERYSEGMENTOUT3的所有成员。第二次调用中,驱动程序应使用驱动程序支持的段的相关信息填充DXGK_QUERYSEGMENTOUT或DXGK_QUERYSEGMENTOUT3的 pSegmentDescriptor 成员中DXGK_SEGMENTDESCRIPTOR或DXGK_SEGMENTDESCRIPTOR3结构 NbSegment 大小的数组。使用WinDbg验证段布局。

王马的博客 674

地平线旭日X5开发板--搭建ROS1环境开发

由于RDK X5是基于Ubuntu22.04 进行版本释放,而ROS1只兼容到了20.04,为了更很好的做以前ROS1相关代码方案的快速迁移,提供了使用docker 的ros环境,进而使用ros1的方案。

bingdund的博客 1019

Windows 显示驱动开发-微型端口的DriverEntry 函数

在 DriverEntry 返回后,DRIVER_INITIALIZATION_DATA 结构不需要保留在内存中。DriverEntry 应可分页。

王马的博客 860

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

两种微型水泵介绍——微型电磁泵和微型隔膜泵

微型水泵:组成形式为电机+泵体,且泵体上有一进一出两个接口,水从入水口进,排水口出。凡是采用这种形式,且体积小巧、袖珍的水泵,都叫微型水泵。微型水泵的作用就是抽水,在各种电器具中得到非常广泛的应用。 下面介绍两种常用的微型水泵——微型电磁泵、微型隔膜泵。 电磁泵的工作原理 电磁泵是一种电磁驱动的柱塞泵,是一种高压微型泵;其特点为:结构紧凑、输出压力高、无泄漏、体积小、动态调节特性好、输出流量较小等。 等电磁线圈通电后,滑杆在电磁场力作用向右运动,密封仓容积增大,压力小于进口气压时,液体流入密封仓。

tuxinbang1989的博客 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

流微型驱动开发指南(四)

p五、Minidriver的初始化过程当操作系统初次初始化Stream Class Minidrivers的时候会调用Minidriver的DriverEntry例程。Minidriver必须调用StreamClassRegisterMinidriver向Class Driver注册它自己。关于Stream Class Minidrivers的DriverEntry例程,请见第六部分。在Minid

人是会思考的一棵苇草 1526

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

window 显示驱动开发-微型端口程序的初始化(二)

帧缓冲内存(VRAM)系统内存孔径(AGP/GART)设备本地内存(DEVICE_LOCAL)WDDM版本数据结构关键增强1.0-1.1基础段属性定义1.2+支持UMA架构、缓存策略控制位。

王马的博客 1374

NDIS小端口驱动开发(三)

NDIS小端口驱动

王马的博客 1283

微型机器人正迎来发展,三大领域应用大有可为

  麻雀虽小,五脏俱全。微型机器人凭借着小身材在医疗、管道和军事等领域发挥着大功效的同时,其自身的功能性、安全性等问题也需要实时关注。  在漫威超级英雄系列电影中,有一部《蚁人》令人印象深刻,其中主角经常将自己缩小到比纳米还小,置身于微观世界中完成任务的场景,让现实中的无数科学家心向往之。而随着科技发展到今天,人们也终于不用再沉迷于电影的虚幻之中,微型机器人的出现,带领人们进...

weixin_34088838的博客 2359
上一篇: 流微型驱动开发指南(四)
下一篇: 又开学啦,今天开始blog正式重新开张@_@
会思考的草
博客等级 码龄25年 208粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值