IoManager
驱动牛犊
驱动牛犊
  • 注册日期2007-05-04
  • 最后登录2008-12-29
  • 粉丝1
  • 关注1
  • 积分185分
  • 威望35点
  • 贡献值0点
  • 好评度30点
  • 原创分0分
  • 专家分0分
阅读:1980回复:13

Bulk 传输问题:写数据OK,读数据:没反应。求解!

楼主#
更多 发布于:2007-05-23 11:39
高手给小弟指点一下:
小弟的USB设备枚举成功,可以读出各种描述符 。。。
端点1:OU T BULK  64B,接口芯片PDIUSBD12
向设备写数据没有问题。
端点1:IN  BULK  64B
从设备读数据:没反应,用户程序一直处于等待中。。。
小弟用softice跟踪了一下。。。
读数据时:URB放到USB总线上就没反映了。
写数据时:URB放到USB总线上很快就返回了。。。
问题大概就是这样。

NTSTATUS  CollData_Bulk_Transfer(IN PDEVICE_OBJECT fdo, IN PIRP Irp)
{
NTSTATUS  ntStatus;
PURB      PUrb=NULL;
USHORT    SizeofUrb =0;
ULONG     TransferFlag=0;
ULONG     BufferLength=0;
PUSBD_INTERFACE_INFORMATION   InterfaceInfo =NULL;
PUSBD_PIPE_INFORMATION   PipeInfo=NULL;
USBD_PIPE_HANDLE    PipeHandle =NULL;
PDEVICE_EXTENSION  PDevExn =(PDEVICE_EXTENSION)fdo->DeviceExtension;
PIO_STACK_LOCATION  IrpStack = NULL;
PBULK_TRANSFER_CONTROL  PBulkCtl = NULL;

IrpStack = IoGetCurrentIrpStackLocation(Irp);
PBulkCtl = (PBULK_TRANSFER_CONTROL)Irp->AssociatedIrp.SystemBuffer;
BufferLength = IrpStack->Parameters.DeviceIoControl.OutputBufferLength;

InterfaceInfo = PDevExn->InterfaceInfo;          //以下对配置信息进行校验
if (!InterfaceInfo)
    return STATUS_UNSUCCESSFUL;
if (PBulkCtl->pipeNum > InterfaceInfo->NumberOfPipes)
    return STATUS_INVALID_PARAMETER;
PipeInfo =&(InterfaceInfo->Pipes[PBulkCtl->pipeNum]);
if((PipeInfo->PipeType!=UsbdPipeTypeBulk) &&(PipeInfo->PipeType!=UsbdPipeTypeInterrupt))
    return STATUS_INVALID_PARAMETER;
 PipeHandle = PipeInfo->PipeHandle;
if (!PipeHandle)
       return STATUS_UNSUCCESSFUL;
if (BufferLength >PipeInfo->MaximumTransferSize)
      return STATUS_INVALID_PARAMETER;

SizeofUrb = sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER);
PUrb = ExAllocatePool(NonPagedPool,SizeofUrb);
if (!PUrb)
     return STATUS_NO_MEMORY;

TransferFlag = USBD_SHORT_TRANSFER_OK;
if (USB_ENDPOINT_DIRECTION_IN(PipeInfo->EndpointAddress))
    TransferFlag |=USBD_TRANSFER_DIRECTION_IN;
UsbBuildInterruptOrBulkTransferRequest(PUrb,
                                           SizeofUrb,
                        Pipe Handle,
                      NULL,
                 Irp->MdlAddress,
            BufferLength,
            TransferFlag,
             NULL);
ntStatus = CallUSBDI(fdo,PUrb);
if (NT_SUCCESS(ntStatus))
    ->IoStatus.Information = PUrb->UrbBulkOrInterruptTransfer.TransferBufferLength;
ExFreePool(PUrb);
return ntStatus;                                                  
    }
//程序参照《USB2.0原理与工程开发》

最新喜欢:

wingmanwingma...
ke077
驱动牛犊
驱动牛犊
  • 注册日期2007-03-14
  • 最后登录2010-10-28
  • 粉丝1
  • 关注0
  • 积分362分
  • 威望134点
  • 贡献值0点
  • 好评度72点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-05-23 17:47
你的usb设备回应数据了没有啊?
首先看看你的usb设备回应了数据没阿?抓数据看看,对于驱动端,能写,读的话问题应该不大。如果他读数据的时候,usb设备不回,大概就一直在那读吧
我也是个小菜鸟,希望能够给你点提示
Jkw_Dev
驱动中牛
驱动中牛
  • 注册日期2002-11-03
  • 最后登录2014-11-28
  • 粉丝0
  • 关注0
  • 积分82分
  • 威望28点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-05-24 10:43
可能是usb设备没有发送相应的数据,你可以在USB设备端的程序里加一些处理,确认一下:
1. 设备是否收到请求
2. 如果收到了,请求是否被正确处理
3. 看一下设备端的请求处理在哪一步被停止
排除掉相应的错误就行了
IoManager
驱动牛犊
驱动牛犊
  • 注册日期2007-05-04
  • 最后登录2008-12-29
  • 粉丝1
  • 关注1
  • 积分185分
  • 威望35点
  • 贡献值0点
  • 好评度30点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-05-24 17:51
谢谢上面兄弟们了。
两位兄弟都认为USB设备没有返回给驱动程序数据,导致驱动一直处于等待中。事实就是这样的!!
当程序执行到 ntStatus = CallUSBDI(fdo,PUrb); //将URB发送到总线上 语句时,程序就不在往下执行了。。。它一直处于等待中,也就是等待USB设备向主机发送数据。
如果一切正常的话,当程序执行到上述语句时,令牌OUT会使接口芯片向单片机发送一个中断,告诉单片机向接口芯片缓冲区中写数据,然后令牌IN会带走这些数据。事实是,这个中断没有发生!
我想可能是我的驱动程序有问题,我把DDK自带的例子(bulkusb)编译一下,同样是这个毛病;另外可能是单片机固件的问题,固件又重新查了一边,也没看出哪里异常。再说如果有问题,那么写数据也应该有问题啊!
就这样,每当想到一个可能的问题,马上又会想到它的矛盾面。
。。痛苦啊。
我记得我装DriverStdio时,也是痛苦了一阵,当时一运行softice机器就死机。我就不明白,以为肯定是哪里设置不对。在网上查资料,发帖子。还是没解决。最后没办法把系统重装了一下,第一个装的软件就是DriverStdio,奇迹发生了,softice可以运行。最后装卡巴斯基时,机器又死机了。这时我明白,这两个软件是相冲突的。
IoManager
驱动牛犊
驱动牛犊
  • 注册日期2007-05-04
  • 最后登录2008-12-29
  • 粉丝1
  • 关注1
  • 积分185分
  • 威望35点
  • 贡献值0点
  • 好评度30点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-05-25 09:42
IoManager
驱动牛犊
驱动牛犊
  • 注册日期2007-05-04
  • 最后登录2008-12-29
  • 粉丝1
  • 关注1
  • 积分185分
  • 威望35点
  • 贡献值0点
  • 好评度30点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-05-30 17:15
问题的答案是:PDIUSBD12在收到 IN 之前数据缓冲区必须有效。
所以必须在OUT端点对IN 端点进行更新。
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-06-04 10:00
不一定非要在第一个IN的时候就放好数据,如果没有数据,会一直有IN过来,你什么时候放进去,什么时候这个IN就会被结束,URB就会得到返回。
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
dianke02
驱动牛犊
驱动牛犊
  • 注册日期2007-05-27
  • 最后登录2010-02-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望26点
  • 贡献值0点
  • 好评度25点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-06-05 12:02
楼主我遇到了与你一样的问题,不知你解决没有,能否加我qq:164460528,一起探讨下子
开发,i love it
oushengfen
驱动牛犊
驱动牛犊
  • 注册日期2007-06-28
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分747分
  • 威望124点
  • 贡献值1点
  • 好评度82点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-06-28 14:35
楼主也看了《USB2.0原理与工程开发》,我还正在看呢,我觉这里面就讲读写太少了,没有讲,只有源程序,光看源程序,没有讲也看不懂啊.
IoManager
驱动牛犊
驱动牛犊
  • 注册日期2007-05-04
  • 最后登录2008-12-29
  • 粉丝1
  • 关注1
  • 积分185分
  • 威望35点
  • 贡献值0点
  • 好评度30点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-06-28 22:38
rayyang2000 兄弟说得对,不一定要第一个IN之前把数据写入缓冲区。但如果要使D12响应IN,则必须要更新其数据缓冲区,否则D12不会对MCU发出中断
onizuka2070
驱动牛犊
驱动牛犊
  • 注册日期2006-10-18
  • 最后登录2007-08-07
  • 粉丝0
  • 关注0
  • 积分430分
  • 威望44点
  • 贡献值0点
  • 好评度43点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-06-29 16:40
你好,楼主
    我遇到了和你相似的问题。我驱动加载固件后,不能往下写,用SoftICE监视发现也是停在CallUSBD处,我的QQ:101153024.希望一起探讨!
IoManager
驱动牛犊
驱动牛犊
  • 注册日期2007-05-04
  • 最后登录2008-12-29
  • 粉丝1
  • 关注1
  • 积分185分
  • 威望35点
  • 贡献值0点
  • 好评度30点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2007-06-30 00:51
onizuka2070:接口芯片是PDIUSBD12吗?我的接口芯片是这个。
如果方便就把中断服务函数放到上面。让我们大家分析一下。
要不你这样试试:
   在你受到OUT时,刷新数据区。
onizuka2070
驱动牛犊
驱动牛犊
  • 注册日期2006-10-18
  • 最后登录2007-08-07
  • 粉丝0
  • 关注0
  • 积分430分
  • 威望44点
  • 贡献值0点
  • 好评度43点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2007-06-30 07:50
啊,我用的是68013A,你指的刷新数据是什么意思啊?
IoManager
驱动牛犊
驱动牛犊
  • 注册日期2007-05-04
  • 最后登录2008-12-29
  • 粉丝1
  • 关注1
  • 积分185分
  • 威望35点
  • 贡献值0点
  • 好评度30点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2007-07-01 00:43
USB接口芯片肯定有好几个端点,每个端点肯定有数据缓冲区;
刷新数据就是用USB接口芯片的命令去更新相应端点的数据缓冲区,告诉USB接口芯片数据准备好了。
游客

返回顶部