4246|9

52

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请大家帮忙看看我的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等多个系统下都成熟使用了。返回数据都没有问题。
哪位大大遇到过这个问题吗?

最新回复

遇到相同的问题,现在还没解决? 有人找到原因吗?  详情 回复 发表于 2010-6-30 17:50
点赞 关注

回复
举报

64

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
不知道为什么,就是这么回事,调用过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;设置是一致的。
期待高人给出解释
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
请高手看看怎么回事。
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

4
 
GetTransferStatus这个函数lz看看,是不是因为这个函数在IssueVendorTransfer中的调用,使得dwBytesTransferred是传输的字节数。
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

5
 
visualthinking你说的“这个函数在IssueVendorTransfer中的调用”什么意思?IssueVendorTransfer函数会调用GetTransferStatus吗?
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

6
 
自己顶下
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 4 楼 huangjiansword 的回复:
visualthinking你说的“这个函数在IssueVendorTransfer中的调用”什么意思?IssueVendorTransfer函数会调用GetTransferStatus吗?

在usbclient.c里有IssueVendorTransfer的定义,我也是刚刚重写了一遍才注意到的
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 6 楼 visualthinking 的回复:
引用 4 楼 huangjiansword 的回复:
visualthinking你说的“这个函数在IssueVendorTransfer中的调用”什么意思?IssueVendorTransfer函数会调用GetTransferStatus吗?

在usbclient.c里有IssueVendorTransfer的定义,我也是刚刚重写了一遍才注意到的

呵呵,我就是直接调用的就是usbclient的IssueVendorTransfer,看了一下,里面的确调用了GetTransferStatus,不过如果不调用GetTransferStatus函数的话,也没法得到dwBytesTransferred了吧,
usbclient.c中的
pUsbFuncs->lpIssueVendorTransfer( hUsbDevice,
                                                     NotifyRoutine,
                                                     NotifyContext,
                                                     Flags,
                                                     pControlHeader,
                                                     pBuffer,
                                                     PhysAddr );
并没有返回dwBytesTransferred。
你解决了该问题吗?
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

9
 
你们都用这个函数通过了吗?我还没有通过!
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

10
 
遇到相同的问题,现在还没解决?
有人找到原因吗?
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表