阅读:3761回复:30
kernel stream minidriver开发讨论区
本人近期被老板强迫写一个dvb接收卡,经过2个多月的奋战对stream driver已有一定的认识,前一阵子我在该论坛提出的问题应者寥寥。那些问题现在虽然都已经解决,可是我总感到还有很多的困惑。以后我将在这个贴子中将自己的开发经验写出来与大家共享。当然有很多困惑希望有朋友能帮助解释。 :)
|
|
最新喜欢:![]() |
沙发#
发布于:2005-03-21 15:15
请问楼上各位高人,在Minidriver中,中断是如何处理的?
调用HwInterrupt之前,需要一些什么样的设置?是不是只设置一下IRQL就可以了? 要不要中断资源的申请?该如何做? 非常多谢!!被老板压着做Minidriver就差这最后一步了,看了一些例子代码,还是不太明白。 |
|
板凳#
发布于:2005-03-16 16:16
gz
|
|
地板#
发布于:2002-11-01 09:08
看不明白!
|
|
地下室#
发布于:2002-10-21 13:51
如果视频流的格式是RGB8的,如何将调色板传给directdraw的,在intersectinfo中好像只有ks_vedio,没有ks_dataformat_video_pallete,有无人知道?
|
|
5楼#
发布于:2002-08-23 17:04
**********
gung *********** 非常感谢你的回答!:) 我先试试看! |
|
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提供的内存可以是分页的(不知是不是一定分页),但已经预先锁定,可以直接使用 |
|
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 将其设置成不分页的! 你没有进行转换可以写吗? //////////////////////////// 问题:分页内存与不分页内存的区别及用途? :) |
|
8楼#
发布于:2002-08-23 16:27
另外,你说“用IoAllocateMdl获得一缓冲区”,我的理解缓冲区已经是系统申请好了,用srb传给你的,IoAllocateMdl只是针对这个缓冲区构造一个描述子罢了,做dma时不一定非要用mdl的,从srb中就可以得到缓冲区的逻辑地址和物理地址,直接写寄存器启动dma好了
|
|
9楼#
发布于:2002-08-23 16:22
你能保证srb中提供的缓冲区是非分页内存区的吗,好像是分页的吧
|
|
10楼#
发布于:2002-08-23 16:00
**********
gung ********** 我们的DMA控制其实差不多,都是通过控制芯片的寄存器,不同的是你是在寄存器中指定数据缓冲区的页面地址索引,而我是要在一个寄存器中制定risc程序的地址,写数据由risc程序完成。 ////////////////////////////////////// 问题:我由Srb->CommandData.DataBufferArray.data得到目标地址 用IoAllocateMdl获得一缓冲区,可是当我执行命令MmBuildMdlForNonPagedPool时却出现break due to page fault fault=000的错误,msdn中说必须要用这个函数,可是为什么有通不过呢? |
|
11楼#
发布于:2002-08-22 13:23
你是说干掉了PageOutWhenUnopened 也会导致无法关机吗,我也试试看。
saa7146含dma控制器,能够进行主动的dma控制,对于视频流的采集他是通过对寄存器的设置进行的,当受到srb_read后,从srb中取得数据缓冲区,由于7146支持scatter/gather,因此必须根据srb中缓冲区的情况初始化好一个页面,该页面内容为缓冲区中页面地址的索引,然后将索引页面的物理地址传给7146,写寄存器启动dma,视频数据就写到缓冲区中了。当一个frame的数据写完后,7146会产生一个中断,在中断处理程序中完成srb,取得新的srb,初始化索引页面..... |
|
12楼#
发布于:2002-08-22 11:46
*********
gung ******** 干掉他会有无法关机的现象的:( ////////////////////////////////// 说说你的DMA数据通道的控制吧! |
|
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. 干掉它应该可以了吧 |
|
14楼#
发布于:2002-08-22 10:51
通常page out指系统将内存中不常用的页面保存到硬盘上的缓存文件中,不知这里是什么意思,我再查查看。
saa7146h,philips出的视频桥芯片,和878一样的。 |
|
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是个用来做什么的?没听说过!! :) |
|
16楼#
发布于:2002-08-21 15:10
我用的7146,只有一个基地址,情况不一样了 :(
关于无法关机我也偶尔遇到过,是因为忽略了srb_paging_out吗?可是绝大多数时候都是正常的,我还不知是为什么 那么你在srb_paging_out中都作了些什么,出什么错了呢? |
|
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] |
|
18楼#
发布于:2002-08-21 14:10
目前我遇到的问题(难于解决),请大家看看,如有好的建议一定给分!!!!!!!!!!:] 我写的是minidriver,驱动中没有理会srb_paging_out,返回个STATUS_NOT_IMPLEMENTED了事,删除设备是响应SRB_UNINITIALIZE_DEVICE吧 另外,为什么要做成两个设备呢,一个设备也可以把,filter上带上两个pin就可以了嘛 |
|
19楼#
发布于:2002-08-21 13:44
目前我遇到的问题(难于解决),请大家看看,如有好的建议一定给分!!!!!!!!!!:]
(1)stream driver中的srb_paging_out的作用? 现象:如果我的驱动驱动两个设备(audio,video),删除设备是触发 srb_paging_out,可能会造成系统错误 (2)risc program 的基本原理,虽然我已经按照bt878的芯片的文档,将其写完,不过总感觉一头的露水!!! |
|
上一页
下一页