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

请教Usb中断管道驱动的问题!

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

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

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

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

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
);                       //发送Urb,记取数据

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
);                                                   //重新初始化Urb

m_KIrp.Reuse();                   //重用Irp

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

return STATUS_MORE_PROCESSING_REQUIRED;
}

游客

返回顶部