请大家帮忙看看我的usb设备流驱动有什么问题?

huangjiansword 2009-08-30 07:48:02
对应DeviceIOControl函数写了如下的流驱动代码:
BOOL TES_IOControl (DWORD dwCtx, DWORD dwCode,
PBYTE pInpBuf, DWORD dwInpLen,
PBYTE pOutBuf, DWORD dwOutLen, PDWORD pdwActualOutLen)
{
USBDEVICE_CONTEXT *pUSBCtx = (USBDEVICE_CONTEXT*)dwCtx;


SetLastError(ERROR_NOT_SUPPORTED);

//给设备发控制命令
if (dwCode == IOCTL_USB_CONTROL_WR) {
USB_DEVICE_REQUEST udr;
DWORD dwBytesTransferred;
DWORD dwErr;
ULONG UsbErr;

memcpy(&udr, pInpBuf, sizeof(USB_DEVICE_REQUEST));

PrintBuff(pInpBuf, dwInpLen);
dwErr = IssueVendorTransfer(
pUSBCtx->UsbFuncs,
pUSBCtx->hUsbDevice,
NULL,
NULL,
USB_OUT_TRANSFER,
&udr,
pInpBuf + sizeof(USB_DEVICE_REQUEST),
0,
&dwBytesTransferred,
INFINITE,
&UsbErr);

if (dwErr != ERROR_SUCCESS) {
DEBUGMSG( DEBUGZONE(0), (TEXT("CONTROL WRITE ERROR\n")));
return FALSE;
}

//收设备返回的数据
udr.bmRequestType = USB_REQUEST_DEVICE_TO_HOST | USB_REQUEST_VENDOR;
udr.bRequest = 0x01;
udr.wValue = 0;
udr.wIndex = 0x0000;
udr.wLength = (WORD)dwOutLen;////这里设置多少,则后面的dwBytesTransferred就返回多少!!


PrintBuff((BYTE*)&udr, sizeof(USB_DEVICE_REQUEST));
dwBytesTransferred = 0;

dwErr = IssueVendorTransfer(
pUSBCtx->UsbFuncs,
pUSBCtx->hUsbDevice,
NULL,
NULL,
USB_IN_TRANSFER | USB_SHORT_TRANSFER_OK,
&udr,
pOutBuf,
0,
&dwBytesTransferred, //////返回的值和udr.wLength的一样????!!!!

INFINITE,
&UsbErr);

if (dwErr != ERROR_SUCCESS) {
DEBUGMSG( DEBUGZONE(0), (TEXT("CONTROL READ ERROR\n")));
return FALSE;
}

#ifdef DEBUG
DEBUGMSG( DEBUGZONE(0), (TEXT("UsbErr = %d\n"), UsbErr));

DEBUGMSG( DEBUGZONE(0), (TEXT("dwBytesTransferred = %d\n"), dwBytesTransferred));
#endif
PrintBuff(pOutBuf, dwBytesTransferred);

*pdwActualOutLen = dwBytesTransferred;
}

return TRUE;
}

测试的时候发现我在收usb数据的时候(即第二个IssueVendorTransfer函数调用)udr.wLength = (WORD)dwOutLen;这一句中无论设置什么值,比如设为64,则接收到的dwBytesTransferred也是64,设为400,则dwBytesTransferred返回的也是400,(但是接受到的数据内容都是正确的)可是我已经在flag中加入了USB_SHORT_TRANSFER_OK了啊,这是怎么回事呢?难道wince5.0的控制器代码有问题吗?我的开发板上用的ohci控制器。

另外,usb设备本身发送的数据值肯定没有问题,这是个成熟设备在xp,vista,98等多个系统下都成熟使用了。返回数据都没有问题。
哪位大大遇到过这个问题吗?
...全文
310 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
taoyongjh 2010-06-30
  • 打赏
  • 举报
回复
遇到相同的问题,现在还没解决?
有人找到原因吗?
yudong54 2009-09-21
  • 打赏
  • 举报
回复
你们都用这个函数通过了吗?我还没有通过!
huangjiansword 2009-09-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 visualthinking 的回复:]
引用 4 楼 huangjiansword 的回复:
visualthinking你说的“这个函数在IssueVendorTransfer中的调用”什么意思?IssueVendorTransfer函数会调用GetTransferStatus吗?

在usbclient.c里有IssueVendorTransfer的定义,我也是刚刚重写了一遍才注意到的
[/Quote]
呵呵,我就是直接调用的就是usbclient的IssueVendorTransfer,看了一下,里面的确调用了GetTransferStatus,不过如果不调用GetTransferStatus函数的话,也没法得到dwBytesTransferred了吧,
usbclient.c中的
pUsbFuncs->lpIssueVendorTransfer( hUsbDevice,
NotifyRoutine,
NotifyContext,
Flags,
pControlHeader,
pBuffer,
PhysAddr );
并没有返回dwBytesTransferred。
你解决了该问题吗?
huangjiansword 2009-09-01
  • 打赏
  • 举报
回复
visualthinking你说的“这个函数在IssueVendorTransfer中的调用”什么意思?IssueVendorTransfer函数会调用GetTransferStatus吗?
huangjiansword 2009-09-01
  • 打赏
  • 举报
回复
自己顶下
visualthinking 2009-09-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 huangjiansword 的回复:]
visualthinking你说的“这个函数在IssueVendorTransfer中的调用”什么意思?IssueVendorTransfer函数会调用GetTransferStatus吗?
[/Quote]
在usbclient.c里有IssueVendorTransfer的定义,我也是刚刚重写了一遍才注意到的
huangjiansword 2009-08-31
  • 打赏
  • 举报
回复
请高手看看怎么回事。
visualthinking 2009-08-31
  • 打赏
  • 举报
回复
GetTransferStatus这个函数lz看看,是不是因为这个函数在IssueVendorTransfer中的调用,使得dwBytesTransferred是传输的字节数。
visualthinking 2009-08-30
  • 打赏
  • 举报
回复
不知道为什么,就是这么回事,调用过IssueVendorTransfer传输
req.bmRequestType = USB_TYPE_VENDOR | USB_RECIP_DEVICE;

req.bRequest = 2;
req.wValue = 0;
req.wIndex = (USHORT)reg;
req.wLength = 1; //返回的数据1个字节
下面是 DWORD dwBytes = 0; 最后调用dw =
IssueVendorTransfer(,,,,USB_OUT_TRANSFER | USB_SHORT_TRANSFER_OK,&req,,,,,);结果通过
RETAILMSG(1, (TEXT(" %d,%d \r\n"), dw,dwBytes));
dw == 0(USB_NO_ERROR),dwBytes==1和USB_DEVICE_REQUEST req.wLength = 1;设置是一致的。
期待高人给出解释

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧