chenxinyu
驱动牛犊
驱动牛犊
  • 注册日期2004-04-09
  • 最后登录2004-12-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1473回复:7

DS3.1开发驱程,BULK读无法完成。20分请教

楼主#
更多 发布于:2004-11-21 20:28
我用DS3.1开发驱程,试验板是周立功的“SMART EVALUATION BOARD",端点2BULK写的部分成功,但读的部分却不行。BULK读程序如下,请高手们指导一下。
NTSTATUS NewDevice::Read(KIrp I)
{
if (I.IoctlBuffer() == 0)
{
     I.Information() = 0;
      return I.PnpComplete(this, STATUS_SUCCESS);
}
PUCHAR pBuffer = (PUCHAR)I.IoctlBuffer();
    ULONG dwTotalSize = I.IoctlOutputBufferSize();
ULONG dwMaxSize = m_Endpoint2IN.MaximumTransferSize();
KMemory Mem(pBuffer, dwTotalSize);
Mem.SetPageArray();
if (dwTotalSize > dwMaxSize)
{
ASSERT(dwMaxSize);
dwTotalSize = dwMaxSize;
}

USB_COMPLETION_INFO* pCompInfo = new (NonPagedPool) USB_COMPLETION_INFO;
if (pCompInfo == NULL)
{
I.Information() = 0;
return I.PnpComplete(this, STATUS_INSUFFICIENT_RESOURCES);
}

PURB pUrb = m_Endpoint2IN.BuildBulkTransfer(
    Mem,       // Where is data coming from?
dwTotalSize,   // How much data to read?
TRUE,         // direction (TRUE = IN)
NULL, // Link to next URB
TRUE // Allow a short transfer
);        

if (pUrb == NULL)
{
delete pCompInfo;
I.Information() = 0;
return I.PnpComplete(this, STATUS_INSUFFICIENT_RESOURCES);
}
t << "pUrb is ok, " << I << EOL;
// Initialize context structure
pCompInfo->m_pClass = this;
pCompInfo->m_pUrb = pUrb;

    // Submit the URB to our USB device
NTSTATUS status;
status = m_Endpoint2IN.SubmitUrb(I, pUrb, LinkTo(ReadComplete), pCompInfo, 0);
t << "pUrb is SubmitUrb, " << I << EOL;
return status;
}
用DRIVERMONITOR看出,此段代码执行完毕,但却没执行ReadComplete()部分,亦即例程没返回。
lwxcast
驱动牛犊
驱动牛犊
  • 注册日期2004-11-19
  • 最后登录2004-11-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-11-21 22:55
周立功的固件在读BULK前必须先发一个控制命令,控制命令详见固件程序。

chenxinyu
驱动牛犊
驱动牛犊
  • 注册日期2004-04-09
  • 最后登录2004-12-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-11-22 10:55
周立功的固件在读BULK前必须先发一个控制命令,控制命令详见固件程序。

 

非常感谢。不过能不能直接给个控制命令啊。
lwxcast
驱动牛犊
驱动牛犊
  • 注册日期2004-11-19
  • 最后登录2004-11-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-11-24 20:37
用Windows应用接口DeviceIoControl给控制端点发送控制命令,其参数详见其主机应用程序 。
xx_focus
驱动中牛
驱动中牛
  • 注册日期2003-08-06
  • 最后登录2007-06-08
  • 粉丝0
  • 关注0
  • 积分96分
  • 威望10点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-11-24 21:59
写出
ULONG dwTotalSize = I.IoctlOutputBufferSize();

读入
ULONG dwTotalSize = I.IoctlInputBufferSize();
 :D
chenxinyu
驱动牛犊
驱动牛犊
  • 注册日期2004-04-09
  • 最后登录2004-12-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-11-26 13:47
用Windows应用接口DeviceIoControl给控制端点发送控制命令,其参数详见其主机应用程序 。

我也知道使用DeviceIoControl来发送控制命令啊,但我的问题时出在驱程上啊。周立功的程序不是用DS做的,看都看不懂。高手能不能把驱程部分的BULK读代码给贴一下啊。
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-11-26 14:16
没有调用Complete,说明request没有完成
你的硬件部分是不是没有给它放数据,然后允许驱动读取
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
lujunql
驱动小牛
驱动小牛
  • 注册日期2004-06-09
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-11-26 17:01
我的处理过程是这样的:
1,驱动程序通过输出端点固件发送一串特定的数据(自定义命令);
2,固件设备接收到命令后,根据要求将驱动程序要的数据写到相应端点上;
3,驱动程序通过输入端点得到数据。
游客

返回顶部