阅读:1526回复:5
有关USB规范的讨论
USB规范中提到:
1、endpoint0可以用于IN,OUT,而其他endpoint,如:endpointX要么是IN,要么是OUT。 2,endpoint0是规范缺省的,并且可用来传输数据。 那么如果如何通过endpoint0来传输数据呢?是不是需要fimeware解释每个命令,看是数据还是命令,或者叫需要自定义协议 |
|
|
沙发#
发布于:2003-07-27 18:59
自定义请求,叫做vendor request,就是厂商请求,和标准请求的格式是一样的,你可以让它有数据阶段也可以没有,如下:
UsbBuildVendorRequest(urb, //ptr to urb URB_FUNCTION_VENDOR_DEVICE, (USHORT) siz, //siz of urb 0, 0x0, //reservedbits=bmRequestType 0x0C, //request = USBSCAN IOCTL_WRITE_REGISTER wValue, wIndex, ioBlock->pbyData, //TransferBuffer NULL, //mdl (unused) length, //bufferlength NULL); //link |
|
板凳#
发布于:2003-07-28 09:20
jinghuiren兄,在Windows驱动层我就是使用UsbBuildVendorRequest来生成vendor request的,DDK文档中这样对UsbBuildVendorRequest的第7个参数这样写到:
Value Is a value, specific to Request, that becomes part of the USB-defined setup packet for the target. This value is defined by the creator of the code used in Request. 那么Value是否需要传递到硬件?如果是,起什么作用? 另外从文档可解释来看,数据应该放在TransferBuffer(或TransferBufferMDL )所指向的内存中,长度由TransferBufferLength 来表示,但是如果传输一个长度为n字节的数据,n大于硬件缓冲大小,那么怎样生成这个URB呢? |
|
|
地板#
发布于:2003-07-28 09:48
一般来说这个value用来传输比较少的数据,比如你只有一个字节或者两个字节的数据的话可以直接放在value中传到设备方,这样数据阶段就不需要了
这个urb应该可以传输大于硬件端点缓冲区的数据量的,具体是多少我没有查证过,但我估计肯定会大于64字节的,你可以参考ddk或者msdn的帮助,你只要把数据放在TransferBuffer里,把长度放在TransferBufferLength 里即可,这个urb发送到usbd后被分成一个个的数据包发到设备方的,这个分包的过程不用你来控制。 |
|
地下室#
发布于:2003-07-28 10:14
多谢jinghuiren兄的指点,不知老兄的QQ是多少?可告诉一下吗?
|
|
|
5楼#
发布于:2003-07-28 10:24
你发mail给我吧
jinghuiren@163.com |
|