|
请大家帮忙看看我的usb设备流驱动有什么问题?
[复制链接]
对应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等多个系统下都成熟使用了。返回数据都没有问题。
哪位大大遇到过这个问题吗?
|
|