ysoni
驱动牛犊
驱动牛犊
  • 注册日期2003-08-26
  • 最后登录2008-12-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1007回复:1

usb中断通道驱动!

楼主#
更多 发布于:2004-09-15 15:12
下面是我写的点驱动,由StartPolling开始循检中断端点,间隔1s。但执行一断时间(200多次,间隔时间小的话很快就停了)之后就停了,没有执行完成例程。
DriverMonitor显示Polling Again,

usb设备端因为ep1的数据没被取走,不会更新fifo里的数据。

请有经验的大侠指点一下。

void MyDevice::StartPolling(void)
{
m_Endpoint1IN.BuildInterruptTransfer(
pIntBuff,
IntBuffLen,
TRUE,
NULL,
m_pIntUrb
);

m_kTimer->Set(-1000000,LinkTo(TimedCallback),this); //1s
}


void MyDevice::StopPolling(void)
{
m_kTimer->Cancel();

InterlockedExchange(&m_lStopRequested, 1);

if( INTERLOCKED_COMPARE_EXCHANGE(&m_lPolling, 1, 1) )
IoCancelIrp(m_KIrp);
}


VOID MyDevice::TimedCallback(PVOID arg1, PVOID arg2)
{

if(1 != INTERLOCKED_COMPARE_EXCHANGE(&m_lStopRequested, 1, 1)&&
1 != INTERLOCKED_COMPARE_EXCHANGE(&m_lPolling, 1, 1))
{
t << "Polling Againn";

m_Endpoint1IN.SubmitUrb(
m_KIrp,
m_pIntUrb,
LinkTo(IntTransferComplete),
this
);

InterlockedExchange(&m_lPolling, 1);
}
}


NTSTATUS MyDevice::IntTransferComplete(KIrp I)
{
m_kTimer->Cancel();

InterlockedExchange(&m_lPolling, 0);

if(1 != INTERLOCKED_COMPARE_EXCHANGE(&m_lStopRequested, 1, 1))
{
m_Endpoint1IN.BuildInterruptTransfer(
pIntBuff,
IntBuffLen,
TRUE,
NULL,
m_pIntUrb
);

m_KIrp.Reuse();

m_kTimer->Set(-1000000,LinkTo(TimedCallback),this); //1s = -10000000
}

return STATUS_MORE_PROCESSING_REQUIRED;
}

[编辑 -  9/15/04 by  ysoni]

[编辑 -  9/15/04 by  ysoni]
ysoni
驱动牛犊
驱动牛犊
  • 注册日期2003-08-26
  • 最后登录2008-12-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-09-16 08:24
难道没人愿意帮忙指点一下?
游客

返回顶部