IssueTransfer调用相关
在CHub类中的AttachDevice函数中,经常会调用到类CControlPipe的函数IssueTransfer。本文介绍一下函数CControlPipe::IssueTransfer的调用过程,以及具体实现。
首先说说对函数CControlPipe::IssueTransfer的调用。
首先调用函数CControlPipe::IssueTransfer:
status = pControlPipe->IssueTransfer(
.
.
.
TransferDoneCallbackSetEvent, // 回调函数
m_hHubStatusChangeEvent, // 回调函数的参数
.
.
.
);
传输处理完后,会使用传入的回调函数参数来调用回调函数。即set event m_hHubStatusChangeEvent。
等待事件m_hHubStatusChangeEvent,即等待传输处理结束。
WaitForSingleObject( m_hHubStatusChangeEvent, ATTACH_TIMEOUT )
若Timeout,则中断传输:
pControlPipe->AbortTransfer( NULL, // callback function
NULL, // callback parameter
this ); // cancel ID
判断线程退出标志,若为True,则中断传输:
pControlPipe->AbortTransfer( NULL, // callback function
NULL, // callback parameter
this ); // cancel ID
下面来说说函数CControlPipe::IssueTransfer的实现。
首先判断是否需要change address:
if (m_bDeviceAddress ==0 && address !=0) { // Address Changed.m_bDeviceAddress在类CPipe的构造函数中被初始化。请参考Pipe相关类的继承关系。
// CQueuedPipe的构造函数中,将m_pQueuedTransfer赋值为NULL。
// 函数CQueuedPipe::AbortTransfer和函数CQueuedPipe::AbortQueue中会根据条件,将m_pQueuedTransfer赋值为NULL。
// 函数CQueuedPipe::ScheduleTransfer中会取m_pUnQueuedTransfer的第一个,赋值给m_pQueuedTransfer。
// 函数CQueuedPipe::CheckForDoneTransfers中,如果Pipe Halt了,会将m_pQueuedTransfer赋值为NULL。
// m_pPipeQHead在函数CControlPipe::OpenPipe中被创建
if ( m_pQueuedTransfer == NULL && m_pPipeQHead && m_pPipeQHead->IsActive()==FALSE) { // We need cqueue new Transfer.
m_bDeviceAddress = address;
// 函数CQH::SetDeviceAddress的实现:qH_StaticEndptState.qH_SESContext.DeviceAddress = dwDeviceAddress;
m_pPipeQHead ->SetDeviceAddress(m_bDeviceAddress);
}
else {
ASSERT(FALSE);
return requestFailed;
}
}
接下来调用函数CQueuedPipe::IssueTransfer。
函数CQueuedPipe::IssueTransfer中:
根据传入的参数定义一个STransfer对象。
检查STransfer对象中的Transfer参数是否合法。
AreTransferParametersValid(&sTransfer)
判断QHead是否已经创建成功。
检查成员变量m_bDeviceAddress与传入的address是否一致。
如果以上条件满足。则:
进入临界区。
Disables the PREfast warnings
#pragma prefast(disable: 322, "Recover gracefully from hardware failure")
进入一个__try... __except模块。
在该模块中,执行以下操作:
初始化Transfer状态参数。
用当前对象的this指针和先前创建的Transfer对象在CEhcd对象的Physical Memory上创建一个CQTransfer对象。CQTransfer是CTransfer的子类。
CQTransfer * pTransfer = new CQTransfer(this,m_pCEhcd->GetPhysMem(),sTransfer);
如果创建成功,调用CQTransfer对象的Init函数。
pTransfer->Init()
函数CTransfer::Init中检查是否需要分配Control Header Memory和Data Buffer。若需要,则进行分配。
若函数函数CTransfer::Init调用成功,则声明一个CQTransfer指针,并将其指向m_pUnQueuedTransfer。
接下来就是将新创建的Transfer对象追加到m_pUnQueuedTransfer末尾。
执行完后,恢复PREfast warnings
#pragma prefast(pop)
退出临界区。
调用函数CQueuedPipe::ScheduleTransfer。
函数CQueuedPipe::ScheduleTransfe执行的操作如下:
首先判断是否需要queue new Transfer,若不需要,则不进行任何操作。
判断的条件是m_pQueuedTransfer为空,m_pUnQueuedTransfer非空。QHead存在,并且不是Active的。
从m_pUnQueuedTransfer中取出第一个Transfer对象。
调用函数CQTransfer::GetCQTDList获取m_pCQTDList。
在函数CQTransfer::AddTransfer中会对m_pCQTDList赋值。
m_pCQTDList = new(m_pCPhysMem) CQTD(this, ((CQueuedPipe * const)m_pCPipe)->GetQHead())
pPrevTD= m_pCQTDList = pCurTD;
调用函数CQH::QueueTD,将QHead的nextQTDPointer指向前面获取到底m_pCQTDList。
GetQHead()->QueueTD(pCurTransfer->GetCQTDList())
将先前从m_pUnQueuedTransfer中取出的Transfer对象赋值给m_pQueuedTransfer。
m_pQueuedTransfer = pCurTransfer;
++参考+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1、Pipe相关类的继承关系
// CPipe (ADT)
// / /
// CQueuedPipe (ADT) CIsochronousPipe
// / | /
// / | /
// CControlPipe CInterruptPipe CBulkPipe
分享到:
相关推荐
WinCE USB 驱动开发 CPU类型支持ARM构架,USB WiFi(Wlan 802.11b)无线网卡的驱动程序
详细介绍Wince下USB驱动程序的开发过程,对usb协议,wince下驱动程序架构有详细介绍
Wince 设备USB驱动模式切换 可以在以移动硬盘方式 、微软同步软件方式 等4种模式间 切换,当然也要看设备是否支持
WINCE同步USB驱动,仅仅是驱动,很好的
wince 下usb驱动开发 一个基于wince潜入式平台的设备下的usb的驱动程序.rar
RT2870系列USB wifi驱动程序(for ARM CORTEX-A9 CPU)
wince下应用程序如何调用驱动程序,关于流驱动的部分代码。
自己的解决win10配置wince5.0的开发环境问题的方法,具体看博客https://blog.csdn.net/Leoxford/article/details/80202934
wince下 UVC camera 源码 流驱动
WinCE驱动开发 WinCE驱动开发 WinCE驱动开发
名称:VCP_WinCE60 USB转串口芯片CP2102 WINCE6.0驱动
wince下与PC同步的USB驱动 wince下与PC同步的USB驱动
usb的c++代码,对于wince的嵌入式初学者有很大帮助
wince5.0下的USB驱动,绝对能用
详细描述usb驱动的开发过程以及开发流程,省却繁杂资料搜集过程
基于WinCE的USB软驱驱动设计 针对目前流行的WinCE.NET嵌入式操作系统不完全支持...此驱动程序已成功应用于基于ARM9的多功能电脑绣花机上,具有实现简单和调用方便等优点,为类似USB设备驱动开发提供了很好的参考价值。
WinCE系统下USB摄像头驱动程序开发的研究
基于win10开发wince的同步工具驱动,安装后通过USB连接wince会弹出window mobile设备中心
支持FTD232芯片的USB转串口驱动,已在wince6.0系统上调试通过;
WINCE\WinCE下USB无线网卡驱动程序,主要是用于WINCE5.0和WINCE6.0.zip