mike_wang
驱动中牛
驱动中牛
  • 注册日期2003-01-22
  • 最后登录2012-01-04
  • 粉丝0
  • 关注0
  • 积分91分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
阅读:3761回复:30

kernel stream minidriver开发讨论区

楼主#
更多 发布于:2002-08-15 18:25
本人近期被老板强迫写一个dvb接收卡,经过2个多月的奋战对stream driver已有一定的认识,前一阵子我在该论坛提出的问题应者寥寥。那些问题现在虽然都已经解决,可是我总感到还有很多的困惑。以后我将在这个贴子中将自己的开发经验写出来与大家共享。当然有很多困惑希望有朋友能帮助解释。 :)

最新喜欢:

WY.lslrtWY.lsl...
bluewater
驱动牛犊
驱动牛犊
  • 注册日期2005-03-15
  • 最后登录2005-04-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-03-21 15:15
请问楼上各位高人,在Minidriver中,中断是如何处理的?
调用HwInterrupt之前,需要一些什么样的设置?是不是只设置一下IRQL就可以了? 要不要中断资源的申请?该如何做?
非常多谢!!被老板压着做Minidriver就差这最后一步了,看了一些例子代码,还是不太明白。
tony221
驱动牛犊
驱动牛犊
  • 注册日期2001-12-03
  • 最后登录2013-04-16
  • 粉丝0
  • 关注0
  • 积分187分
  • 威望61点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-03-16 16:16
gz
zuowei999
驱动牛犊
驱动牛犊
  • 注册日期2002-03-21
  • 最后登录2018-02-05
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望53点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2002-11-01 09:08
看不明白!
weichaozhou
驱动牛犊
驱动牛犊
  • 注册日期2002-08-12
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-10-21 13:51
如果视频流的格式是RGB8的,如何将调色板传给directdraw的,在intersectinfo中好像只有ks_vedio,没有ks_dataformat_video_pallete,有无人知道?
mike_wang
驱动中牛
驱动中牛
  • 注册日期2003-01-22
  • 最后登录2012-01-04
  • 粉丝0
  • 关注0
  • 积分91分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-08-23 17:04
**********
gung
***********
非常感谢你的回答!:)
我先试试看!


gung
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2008-04-21
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-08-23 16:54
这里说是driver的buffer要用MmBuildMdlForNonPagedPool 将其设置成不分页的!
你没有进行转换可以写吗?
////////////////////////////
问题:分页内存与不分页内存的区别及用途?
 :)  


不是这样的,当你拿到srb时,buffer已经是申请好的,是否分页已经确定了,不可能再进行设置和转换的,mdl只是向某些用到这种结构的函数描述这块内存的具体情况,如大小,属性,逻辑地址等等,不管有没有mdl,只要有相应权限都可以写这块内存的,我现在就没有用mdl,直接写的内存
    typedef struct _MDL {
        struct _MDL *MdlNext;
        short MdlSize;
        short MdlFlags;
        struct _EPROCESS *Process;
        ULONG *lpMappedSystemVa;
        ULONG *lpStartVa;
        ULONG ByteCount;
        ULONG ByteOffset;
    } MDL;

我的理解,非分页内存除了没有被系统的分页机制所映射外,它还永远驻留,且能保证物理上连续,适于做dma的缓冲区,分页内存则若没有被锁定的话很容易被系统page out,且物理地址通常不连续,未锁定时物理地址不固定,不能用于dma,但是srb提供的内存可以是分页的(不知是不是一定分页),但已经预先锁定,可以直接使用
mike_wang
驱动中牛
驱动中牛
  • 注册日期2003-01-22
  • 最后登录2012-01-04
  • 粉丝0
  • 关注0
  • 积分91分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-08-23 16:35
*********
gung
**********
取自msdn:
IoAllocateMdl can be used by a driver that needs to break a buffer into pieces, each mapped by a separate MDL, or to map a driver-allocated buffer. The driver should call MmBuildMdlForNonPagedPool with the MDL allocated by this call to set up an MDL describing a driver-allocated buffer in nonpaged pool.
这里说是driver的buffer要用MmBuildMdlForNonPagedPool 将其设置成不分页的!
你没有进行转换可以写吗?
////////////////////////////
问题:分页内存与不分页内存的区别及用途?
 :)
gung
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2008-04-21
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-08-23 16:27
另外,你说“用IoAllocateMdl获得一缓冲区”,我的理解缓冲区已经是系统申请好了,用srb传给你的,IoAllocateMdl只是针对这个缓冲区构造一个描述子罢了,做dma时不一定非要用mdl的,从srb中就可以得到缓冲区的逻辑地址和物理地址,直接写寄存器启动dma好了
gung
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2008-04-21
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-08-23 16:22
你能保证srb中提供的缓冲区是非分页内存区的吗,好像是分页的吧
mike_wang
驱动中牛
驱动中牛
  • 注册日期2003-01-22
  • 最后登录2012-01-04
  • 粉丝0
  • 关注0
  • 积分91分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-08-23 16:00
**********
gung
**********
我们的DMA控制其实差不多,都是通过控制芯片的寄存器,不同的是你是在寄存器中指定数据缓冲区的页面地址索引,而我是要在一个寄存器中制定risc程序的地址,写数据由risc程序完成。

//////////////////////////////////////
问题:我由Srb->CommandData.DataBufferArray.data得到目标地址
用IoAllocateMdl获得一缓冲区,可是当我执行命令MmBuildMdlForNonPagedPool时却出现break due to page fault fault=000的错误,msdn中说必须要用这个函数,可是为什么有通不过呢?
gung
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2008-04-21
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-08-22 13:23
你是说干掉了PageOutWhenUnopened 也会导致无法关机吗,我也试试看。
saa7146含dma控制器,能够进行主动的dma控制,对于视频流的采集他是通过对寄存器的设置进行的,当受到srb_read后,从srb中取得数据缓冲区,由于7146支持scatter/gather,因此必须根据srb中缓冲区的情况初始化好一个页面,该页面内容为缓冲区中页面地址的索引,然后将索引页面的物理地址传给7146,写寄存器启动dma,视频数据就写到缓冲区中了。当一个frame的数据写完后,7146会产生一个中断,在中断处理程序中完成srb,取得新的srb,初始化索引页面.....
mike_wang
驱动中牛
驱动中牛
  • 注册日期2003-01-22
  • 最后登录2012-01-04
  • 粉丝0
  • 关注0
  • 积分91分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-08-22 11:46
*********
gung
********
干掉他会有无法关机的现象的:(


//////////////////////////////////
说说你的DMA数据通道的控制吧!
gung
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2008-04-21
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-08-22 10:54
呵呵

The class driver will page out the minidriver only if the minidriver turns on this feature. The minidriver enables this feature by setting the registry variable PageOutWhenUnopened to 1 in the device\'s INF file.

干掉它应该可以了吧
gung
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2008-04-21
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-08-22 10:51
通常page out指系统将内存中不常用的页面保存到硬盘上的缓存文件中,不知这里是什么意思,我再查查看。
saa7146h,philips出的视频桥芯片,和878一样的。
mike_wang
驱动中牛
驱动中牛
  • 注册日期2003-01-22
  • 最后登录2012-01-04
  • 粉丝0
  • 关注0
  • 积分91分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-08-22 10:44
**********
to gung
*********
srb_paging_out在这里我只是判断了一些寄存器的状态,如果寄存器处于应用中则屏蔽掉:
    问题:帮助中所说的The class driver sends this request to signal that it is about to page out the minidriver。
 这里的page out the minidriver什么意思????


//////////////////////////////////////////////////////
7146是个用来做什么的?没听说过!!
   :)
gung
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2008-04-21
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-08-21 15:10
我用的7146,只有一个基地址,情况不一样了 :(
关于无法关机我也偶尔遇到过,是因为忽略了srb_paging_out吗?可是绝大多数时候都是正常的,我还不知是为什么
那么你在srb_paging_out中都作了些什么,出什么错了呢?
mike_wang
驱动中牛
驱动中牛
  • 注册日期2003-01-22
  • 最后登录2012-01-04
  • 粉丝0
  • 关注0
  • 积分91分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-08-21 14:48
**********
 to gung
*********
我写得也是minidriver啊!不过tuner是数字的。
不管你的filter是怎么样的如果你用的芯片是fusion 878,那么在你的卡肯定是两个设备,也就是有两个baseaddress,如果你要操作两个设备的寄存器,就必须要基于这些基地址啊!filter仅仅是在用户态表现的一种形式,控制硬件还是要遵从芯片的原理啊!
不过我感到奇怪的是ms的例程中的filter好像只装一个video设备,就能控制video and audio(有它的各个接口完成),它的audio基地只是怎么得到的?
///////////////////////////////////////
如果我忽略srb_paging_out,驱动删除后,无法关机了!!!???


[编辑 -  8/21/02 by  mike_wang]
gung
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2008-04-21
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-08-21 14:10
目前我遇到的问题(难于解决),请大家看看,如有好的建议一定给分!!!!!!!!!!:]
(1)stream driver中的srb_paging_out的作用?
现象:如果我的驱动驱动两个设备(audio,video),删除设备是触发
srb_paging_out,可能会造成系统错误
 


我写的是minidriver,驱动中没有理会srb_paging_out,返回个STATUS_NOT_IMPLEMENTED了事,删除设备是响应SRB_UNINITIALIZE_DEVICE吧
另外,为什么要做成两个设备呢,一个设备也可以把,filter上带上两个pin就可以了嘛
mike_wang
驱动中牛
驱动中牛
  • 注册日期2003-01-22
  • 最后登录2012-01-04
  • 粉丝0
  • 关注0
  • 积分91分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2002-08-21 13:44
目前我遇到的问题(难于解决),请大家看看,如有好的建议一定给分!!!!!!!!!!:]
(1)stream driver中的srb_paging_out的作用?
现象:如果我的驱动驱动两个设备(audio,video),删除设备是触发
srb_paging_out,可能会造成系统错误
(2)risc program 的基本原理,虽然我已经按照bt878的芯片的文档,将其写完,不过总感觉一头的露水!!!
上一页
游客

返回顶部