WinCE USB驱动CDevice::EnterOperationalState函数相关

USB驱动中,设备相关的类及其继承关系如下:

 

                  CDevice (ADT)

                /                        /

            CFunction        CHub (ADT)

                                  /                   /

                             CRootHub      CExternalHub

 

 

父类CDevice中包含一个虚函数成员EnterOperationalState。各个子类中,根据需要,对该函数有不同的实现。

各个子类的EnterOperationalState函数被调用的地方也不相同。其中,CRootHub的该函数,在函数CEhcd::DeviceInitialize中被调用。CFunction和CExternalHub的该函数在函数CHub::HubStatusChangeThread中被调用。

也就是说,在HCD进行Device初始化的时候,会首先启动Root Hub的监视线程。

若有External Hub插入Root Hub,Root Hub 会启动External Hub的监视线程。若有Function插入Root Hub,Root Hub会启动Function的USB传输。

当External Hub和Function插入到External Hub时,操作与插入到Root Hub类似。

 

下面具体说说各个子类中,函数EnterOperationalState的实现。

 

1、函数CRootHub::EnterOperationalState

 

// 成员变量check

 

// 创建事件m_hHubStatusChangeEvent - Auto Reset, and Initial State = non-signaled

m_hHubStatusChangeEvent = CreateEvent( NULL, FALSE, FALSE, NULL );

 

// 创建设备列表。

AllocateDeviceArray()

 

// 启动状态改变监视线程,并设置线程优先级

m_hHubStatusChangeThread = CreateThread( 0, 0, HubStatusChangeThreadStub, this, 0, NULL );

CeSetThreadPriority( m_hHubStatusChangeThread, g_IstThreadPriority);

 

2、函数CExternalHub::EnterOperationalState

 

// 成员变量check

 

// 参数checkpEndpoint0Pipe != NULL

 

// 创建事件m_hHubStatusChangeEvent - Auto Reset, and Initial State = non-signaled

m_hHubStatusChangeEvent = CreateEvent( NULL, FALSE, FALSE, NULL );

 

// 检查endpoint的Descriptor

 

// 创建InterruptPipe

CPipeAbs* pStatusChangePipe = CreateInterruptPipe ( &m_deviceInfo.lpActiveConfig->lpInterfaces[0].lpEndpoints[0].Descriptor, m_fIsLowSpeed,m_fIsHighSpeed,m_address, uTTAddress,uTTPort, m_pCHcd);

 

// 分配Pipe数组的空间

AllocatePipeArray()

 

// AllocatePipeArray函数,根据m_deviceInfo结构体中endpoint的个数分配pipe array需要的内存

m_ppCPipe = new CPipeAbs* [ numPipes ];

 

// 创建设备列表。

AllocateDeviceArray()

 

// 打开InterruptPipe

pStatusChangePipe->OpenPipe()

 

// 由于状态监视线程中要用到Control Pipe和Interrupt Pipe,需要将它们保存到成员变量中

m_ppCPipe[ ENDPOINT0_CONTROL_PIPE ] = pEndpoint0Pipe; // pEndpoint0Pipe参数传入

m_ppCPipe[ STATUS_CHANGE_INTERRUPT_PIPE ] = pStatusChangePipe;

 

// 启动状态改变监视线程,并设置线程优先级

m_hHubStatusChangeThread = CreateThread( 0, 0, HubStatusChangeThreadStub, this, 0, NULL );

CeSetThreadPriority( m_hHubStatusChangeThread, g_IstThreadPriority);

 

3、函数CFunction::EnterOperationalState

 

// 成员变量check

 

// 参数checkpEndpoint0Pipe != NULL 

 

 

// 创建事件m_hFunctionFeatureEvent - Auto Reset, and Initial State = non-signaled

m_hFunctionFeatureEvent = CreateEvent( NULL, FALSE, FALSE, NULL );

 

// 分配Pipe数组的空间

AllocatePipeArray()

 

// AllocatePipeArray函数,根据m_deviceInfo结构体中endpoint的个数分配pipe array需要的内存

m_ppCPipe = new CPipeAbs* [ numPipes ];

 

// 保存Control Pipe到成员变量

m_ppCPipe[ ENDPOINT0_CONTROL_PIPE ] = pEndpoint0Pipe;

 

// 调用USBD中的函数HcdDeviceAttached。

// 调用方式:通过成员变量m_pCHcd获取函数指针进行调用

// m_pCHcd中CFunction对象构造时被传入

// CFunction对象的构造在函数CHub::AttachDevice中进行。也就是在Root Hub或者External Hub的AttachDevice函数中进行创建。

// 所以,m_pCHcd最终是在Root Hub对象创建的时候传入

// Root Hub对象在函数CEhcd::DeviceInitialize中被创建,传入的CHcd对象的指针式This指针

// 追溯发现,函数GetpUSBDAttachProc的实现在类CDeviceGlobal中 : { return m_pUSBDAttachProc; }

// 成员变量m_pUSBDAttachProc的赋值在函数CDeviceGlobal::Initialize中,如下:

// m_hUSBDInstance = LoadDriver(TEXT("USBD.DLL"));

// m_pUSBDAttachProc = (LPUSBD_ATTACH_PROC) GetProcAddress(m_hUSBDInstance, TEXT("HcdDeviceAttached"));

fSuccess = (*m_pCHcd->GetpUSBDAttachProc())(m_pCHcd->GetpHcdContext(), // context for Host Controller Driver m_address, // used to indicate this specific device ENDPOINT0_CONTROL_PIPE, // index of endpoint 0 pipe LPCUSB_DEVICE( &m_deviceInfo ), // USB descriptors &m_lpvDetachId ); // used to tell USBD this device is being detached

 

HCD相关,类的继承关系:

 

                        CDeviceGlobal      LockObject

                                         /         /       /

                                           CHcd    USB2lib

                                             /          /

                                      CHW         /

                                            /        /

                                           CEhcd

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值