阅读:2035回复:6
ISO传输为甚要在驱动程序开双缓冲
ISO 传输中所要求的双缓冲应该是在主控制器硬件上和USB设备端
中设计的吧?为什么要在驱动程序中开双缓冲呢? 是不是一个用于接收USB总线上的数据,另一个用于将数据发往用户程序?但好像不能实现。因为如果要将数据返回到用户程序,那么这个IRP应当已经完成了,就不可能接受USB总线上的数据了。 不知道我的理解对不对,请各位大虾指点! |
|
|
沙发#
发布于:2001-10-05 15:34
[QUOTE]原本由 gglee 发表
[B]你的意思是同时给usbd发俩个irp?但是不是只有前一个irp完成后,io管理器才把控制权交给驱动程序,此后才能发送第二个irp呢? 也就是说usbd一次只能接受到一个irp。 小弟刚开始学驱动,功力尚浅,能否给个同时发多个irp 的例子先! 主机上的cpu 和 usb host controler 应该是并行运行的,因此当 host controler执行完一个irp而返回用户程序的过程中(由cpu 来 负责),host controller 肯定还是在发sof 的,但只不过该frame 中没有iso packet.虽然主机速度快,但cpu 和host control是并行运行的,时钟不同步,肯定存在前几个frame包含iso token,而后几桢没有iso token,在后面几桢又有iso token的情形。 [/B][/QUOTE] irp 通过USBD 到HCD时已变成了TD,TD以链表的形式形式存在的。由于HOST CONTROLLER 的精巧设计,HCD 加入TD时不须要停掉HOST CONTROLLER的。CPU与HOST CONTROLLER 是并行运行的。所以,只要保证有足够的 irp 变为TD。就可以每个frame都包含iso token,当然 首先得有足够的带宽。 |
|
|
板凳#
发布于:2001-10-04 12:24
详细说字太多,给个电话,只要你理解的不浅,两分钟就搞定。
|
|
地板#
发布于:2001-10-04 11:49
你的意思是同时给usbd发俩个irp?但是不是只有前一个irp完成后,io管理器才把控制权交给驱动程序,此后才能发送第二个irp呢?
也就是说usbd一次只能接受到一个irp。 小弟刚开始学驱动,功力尚浅,能否给个同时发多个irp 的例子先! 主机上的cpu 和 usb host controler 应该是并行运行的,因此当 host controler执行完一个irp而返回用户程序的过程中(由cpu 来 负责),host controller 肯定还是在发sof 的,但只不过该frame 中没有iso packet.虽然主机速度快,但cpu 和host control是并行运行的,时钟不同步,肯定存在前几个frame包含iso token,而后几桢没有iso token,在后面几桢又有iso token的情形。 |
|
|
地下室#
发布于:2001-10-03 13:48
我认为最关键的问题是时刻保证USBD的等时IRP队列中有至少一个IRP,“先发一个irp,然后在完成例程再发一个irp”经我实际测试,只有一个IRP/URB速度不够(我要作到7.x M),至少在BULK时是这样。所以两个IRP/URB是必要的。
从你的问题看,你的USB设备好象不是STREAM ISO。ISO的带宽一定,每一桢都有ISO包,只不过有没有有用数据不一定(由固件决定)。另一方面,主机程序运行速度足够快,比如用FOR在送读写请求,你用不着担心1ms送不下去一个IRP。 |
|
5楼#
发布于:2001-10-02 21:17
在cypress给出的GPD中好像是这么说的,我也没看明白。
但为什么要保证两个irp呢?这和先发一个irp,然后在完成例程 再发一个irp有什么不同? 此外还有一点不清楚的是:irp 在完成之后,切换到用户态,应用 程序才能启动另一个I/O请求。那么在这两个请求之间的间隔内,HCD 是不会接受到ISO IRP 的,这是不是意味着在总线上的ISO TRANSACTON 不是连续的呢?至少有一帧不含ISO 包。 |
|
|
6楼#
发布于:2001-10-01 13:54
用不着开双缓冲啊,
两个IRP/URB是必要的 |
|