阅读:1305回复:9
driverstudio中如何得到pipe0的实例?
我想通过pipe0传几个字节到EP0BUF中去,如何找到pipe0?
ds中,可以用kusbpipe定义自己的pipe,但pipe0呢? 我怎么进行pipe0的传输? |
|
最新喜欢:r2109t... |
沙发#
发布于:2004-03-03 09:05
是用DS开发的人太少,还是我问的问题太菜呢?
顶一下,希望有人能给讲讲,谢谢! [编辑 - 3/3/04 by asslittle] |
|
板凳#
发布于:2004-03-03 10:05
控制端点不提倡直接使用你所说的这种通信方式。如果你去看usb1.1文档的话,会得到这样的信息:根据第5章(5.4, 5.5)第8章(8.5.2)和第9章的内容,控制端点与其他端点不同,它的传输是由USB组织定义好了一部分(主要是setup packet)。也就是在transaction上一层也作了定义。这在其他端点上是没有的。所以,如果你想利用端点0传自己的数据,该协议也给了你机会,就是使用Vendor commands。对于你使用的DS来说,就是使用IOCTL_XXX_XXXX之类的东西就可以了。对于新作的程序,在wizard阶段会给你添加的机会的。
应该说,对于一个能够完成自举的系统来说,管道或端点的非对称性是一个简单的选择。 |
|
|
地板#
发布于:2004-03-03 15:52
总算有人说话了,谢谢~
我也看过一些文档,好象不建议再定义一个控制传输的pipe. usb1.1的没接触过,现在是直接做的2.0。 我就是自己定义的VendorRequest,应用程序的函数是这样调用的: WriteFile(hDevice, buf, 64, &nWritten, NULL); //创建64字节的buf,然后写几个东东到buf里 驱动程序中的write函数是这样的: KUsbLowerDevice m_Lower; KIrp I; pUrb = m_Lower.BuildVendorRequest( (PUCHAR)I.BufferedWriteSource(), // transfer buffer I.WriteSize(), // transfer buffer size 0, // request reserved bits 0xF0, // 我自己定义的request EP0BUF, // Value FALSE, // out TRUE, // Short Ok NULL, // link urb 0, // index URB_FUNCTION_VENDOR_ENDPOINT // function ); status = m_Lower.SubmitUrb(pUrb); 我用keil调试我的固件程序,发现ep0buf里的东西就没有改变,不知道是哪个地方的问题? |
|
地下室#
发布于:2004-03-03 23:45
你的vendor request index怎么会是0xf0 ??? 太大了吧,应该在0~0x0f吧。
|
|
|
5楼#
发布于:2004-03-04 09:13
这个Request是一个8bit的值,除了标准的请求与cypress保留的请求外,00-FF都可以由你自己定义,来实现自己的应用程序的请求.
昨天又看了一下资料,这个参数用的不对: (PUCHAR)I.BufferedWriteSource(), // transfer buffer 由于我创建设备的时候,使用的是do_driect_io的标志,后面应该用mdl来访问应用程序的缓冲区. 改为: KMemory M(I.Mdl()); 用这个M就可以了. 但还是很郁闷,我改了之后,发现ep0buf里还是没有变化:( |
|
6楼#
发布于:2004-03-04 09:57
我个人认为还是Request的问题。
Stand Request & Vendor Request 是在Request Type上面进行区分的。所以Request的值不必为之保留。 如果你的固件使用如下代码: code void (*StdRequestHandler[16])(void) = { OnStdGetStatus, OnStdClearFeature, StdReservedHandler, OnStdSetFeature, StdReservedHandler, OnStdSetAddress, OnStdGetDescriptor, StdReservedHandler, OnStdGetConfigration, OnStdSetConfigration, OnStdGetInterface, OnStdSetInterface, StdReservedHandler, StdReservedHandler, StdReservedHandler, StdReservedHandler }; //用户厂商请求 code void (*VendorDeviceRequest[])(void) = { StdReservedHandler, StdReservedHandler, StdReservedHandler, StdReservedHandler, StdReservedHandler, StdReservedHandler, StdReservedHandler, StdReservedHandler, StdReservedHandler, StdReservedHandler, StdReservedHandler, StdReservedHandler, read_write_register, StdReservedHandler, StdReservedHandler, StdReservedHandler }; void control_handler() { unsigned char type, req; type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK; req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK; // help_devreq(type, req); //显示设备请求 if (type == USB_STANDARD_REQUEST) { HandleStdRequest(req); // (*StandardDeviceRequest[req])();//调用标准请求 } else if (type == USB_VENDOR_REQUEST) (*VendorDeviceRequest[req])();//调用厂商请求 else stall_ep0(); } 则Request的值不能超过函数指针数组的最大索引。 难道你的函数指针数组会大到0xf0吗? 希望能够帮到你。 |
|
|
7楼#
发布于:2004-03-04 10:49
搞定!确实如你所说,我改成0F就ok了!!!
我找了半天也没找到这个VendorDeviceRequest的指针数组, 我看过68013的手册,对于留给自己定义的request,它没有给出范围, 究竟在什么地方定义的这个范围? 看你不停的给人回帖,呵呵,真是辛苦了~ |
|
8楼#
发布于:2004-03-05 23:07
光说辛苦,也不给点分,hehe,人心不古啊。
|
|
|
9楼#
发布于:2004-03-07 14:05
呵呵,我不知道你这么在乎给分,我对这个分不分的不感兴趣,
不过真的很谢谢你!分已经给你了^_^ |
|