阅读:1425回复:6
斑竹:ep1out,ep2out无区别吗?!!
用ds定义四个管道对象ep1in(int),ep1out(int),ep2in(bulk),ep2out(bulk)再读写函数中为何只出现一个管道对象,
example read() { ep2out.buildbulktranser();} 这样其余的管道不是就多余了吗?? |
|
沙发#
发布于:2003-03-11 21:30
对于read,当然只需要这么一个管道就可以了,读取数据
command type通过endpoint0建立的管道传输就可以了 |
|
板凳#
发布于:2003-03-11 22:55
谢谢光临!!
我的意思是主机程序有两个readfile,一个要求中断另一个批量传输,也就是一个对应ep1,另一个ep2。可在驱动中,只有一个管道对象ep2,相应的建立一种传输请求比如批量,然后进入readcomplete 历程。在这种情况下,要求对端点1的中断读请求,该如何实现呢?? 难道一个管道对象建立的批量请求,可以用于其他的管道及其他的传输方式?? :( :( |
|
地板#
发布于:2003-03-12 09:34
当然不行。这需要在driver中的deviceExtension->PipeInfo中纪录
你的device的所有的pipe的信息,你在app端读pipe的时候, 在这种情况下,不仅要用你的deivce symblic name,而且最好 在其后面附上你的pipe index,example as: \"e290eu3298djo9jd\\pipe1\" 做为你的read file name,然后在你的driver中处理IRP_MJ_CREATE的函数中解析这个文件名中的pipeX 中的X,然后再根据这个X,你在driver中用相应的pipe去read。 |
|
|
地下室#
发布于:2003-03-12 09:42
记住read file 是对文件操作,而pnp是把所有的设备虚拟化为
每一个文件名不同的文件,所以当然没一个文件下都可以有子目录了,就看你的driver中给不给解析。比如说\\\\.\\XXXDEV\\pipeX,如果你的driver中解析这个pipeX,那么就可以在APP中用这个文件名来实现XXXDEV这个设备的第X pipe的读写操作,Are you see?:) (write driver,就一定要记住,他们对于user mode用户就是一个个文件夹) |
|
|
5楼#
发布于:2003-03-12 11:41
楼上的:
感谢你的回答!!! 解释得很清楚。 但我现在用的是ds2.7,所以还是有点晕。既然两个readfile(要求的端点和传输方式不同)可以用不同的管道名打开,但是ds自动生成的驱动相应的只有一个管道对象和传输方式如 read() { ep2out.buildbulktranser();} 在这种情况下,另一个readfile产生的IRP_MJ_READ 请求,进入驱动 后,也进入READ函数,由于管道名和传输方式不同,这个请求酒会得不到正确处理。 在这情况下该如何做?? |
|
6楼#
发布于:2003-03-12 13:34
一定要改driver的,不肯能不改开发板自带的驱动。
在read file前,你的APP里是用CreateFile打开read file中的handle,在CreateFile中用附加pipeX的symblic link name打开handle,然后再在readfile中用这个handle打开设备for read, 所以你在APP CreateFile时driver中就会收到IRP_MJ_CREATE, 你在这里就解析pipe信息,确定是要读哪个pipe,然后存在deviceExtension中,在你的driver中的read处,判定这个值, 然后分支处理不就OK了:),example as: read(pipeX) { if(pipeX==ep1) //你自己再增加另一个pipe read ep1out.buildbulktranser();//你自己再增加另一个pipe read else if(pipeX==ep2) ep2out.buildbulktranser(); } |
|
|