新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 如何编写Windows CE.net的usb驱动程序(2)

如何编写Windows CE.net的usb驱动程序(2)

作者:时间:2012-05-02来源:网络收藏

另外一个函数是USBUninstallDriver()函数,具体代码如下:

externCBOOL

USBUnInstallDriver()

{

BOOLfRet=FALSE;

HINSTANCEhInst=LoadLibrary(LUSBD.DLL);

if(hInst)

{

LPUN_REGISTER_CLIENT_DRIVER_IDpUnRegisterId=

(LPUN_REGISTER_CLIENT_DRIVER_ID)

GetProcAddress(hInst,gcszUnRegisterClientDriverId);

LPUN_REGISTER_CLIENT_SETTINGSpUnRegisterSettings=

(LPUN_REGISTER_CLIENT_SETTINGS)GetProcAddress(hInst,

gcszUnRegisterClientSettings);

if(pUnRegisterSettings)

{

USB_DRIVER_SETTINGSDriverSettings;

DriverSettings.dwCount=sizeof(DriverSettings);

//必须填入与注册时相同的信息。

DriverSettings.dwVendorId=USB_NO_INFO;

DriverSettings.dwProductId=USB_NO_INFO;

DriverSettings.dwReleaseNumber=USB_NO_INFO;

DriverSettings.dwDeviceClass=USB_NO_INFO;

DriverSettings.dwDeviceSubClass=USB_NO_INFO;

DriverSettings.dwDeviceProtocol=USB_NO_INFO;

DriverSettings.dwInterfaceClass=0x03;//HID

DriverSettings.dwInterfaceSubClass=0x01;//bootdevice

DriverSettings.dwInterfaceProtocol=0x02;//mouse

fRet=(*pUnRegisterSettings)(gcszMouseDriverId,NULL,

DriverSettings);

}

if(pUnRegisterId)

{

BOOLfRetTemp=(*pUnRegisterId)(gcszMouseDriverId);

fRet=fRet?fRetTemp:fRet;

}

FreeLibrary(hInst);

}

returnfRet;

}

此函数主要用于删除USBInstallDriver()时创建的注册表信息,同样的它使用自己的函数接口UnRegisterClientDriverID()和UnRegisterClientSettings()来做相应的处理。

另外一个需要处理的注册的监控通知函数USBDeviceNotifications():

externCBOOLUSBDeviceNotifications(LPVOIDlpvNotifyParameter,DWORDdwCode,

LPDWORD*dwInfo1,LPDWORD*dwInfo2,LPDWORD*dwInfo3,

LPDWORD*dwInfo4)

{

CMouse*pMouse=(CMouse*)lpvNotifyParameter;

switch(dwCode)

{

caseUSB_CLOSE_DEVICE:

//删除相关的资源。

deletepMouse;

returnTRUE;

}

returnFALSE;

}

USB鼠标的类的定义如下:

classCMouse

{

public:

CMouse::CMouse(USB_HANDLEhDevice,LPCUSB_FUNCSlpUsbFuncs,

LPCUSB_INTERFACElpInterface);

~CMouse();

BOOLInitialize();

private:

//传输完毕调用的回调函数

staticDWORDCALLBACKMouseTransferCompleteStub(LPVOIDlpvNotifyParameter);

//中断处理函数

staticULONGCALLBACKCMouse::MouseThreadStub(PVOIDcontext);

DWORDMouseTransferComplete();

DWORDMouseThread();

BOOLSubmitInterrupt();

BOOLHandleInterrupt();

BOOLm_fClosing;

BOOLm_fReadyForMouseEvents;

HANDLEm_hEvent;

HANDLEm_hThread;

USB_HANDLEm_hDevice;

USB_PIPEm_hInterruptPipe;

USB_TRANSFERm_hInterruptTransfer;

LPCUSB_FUNCSm_lpUsbFuncs;

LPCUSB_INTERFACEm_pInterface;

BOOLm_fPrevButton1;

BOOLm_fPrevButton2;

BOOLm_fPrevButton3;

//数据接受缓冲区。

BYTEm_pbDataBuffer[8];

};

具体实现如下:

//构造函数,初始化时调用

CMouse::CMouse(USB_HANDLEhDevice,LPCUSB_FUNCSlpUsbFuncs,

LPCUSB_INTERFACElpInterface)

{

m_fClosing=FALSE;

m_fReadyForMouseEvents=FALSE;

m_hEvent=NULL;

m_hThread=NULL;

m_hDevice=hDevice;

m_hInterruptPipe=NULL;

m_hInterruptTransfer=NULL;

m_lpUsbFuncs=lpUsbFuncs;

m_pInterface=lpInterface;

m_fPrevButton1=FALSE;

m_fPrevButton2=FALSE;

m_fPrevButton3=FALSE;

memset(m_pbDataBuffer,0,sizeof(m_pbDataBuffer));

}

//析构函数,用于清除申请的资源。

CMouse::~CMouse()

{

//通知系统去关闭相关的函数接口。

m_fClosing=TRUE;

//Wakeuptheconnectionthreadagainandgiveittimetodie.

if(m_hEvent!=NULL)

{

//通知关闭数据接受线程。

SetEvent(m_hEvent);

if(m_hThread!=NULL)

{

DWORDdwWaitReturn;

dwWaitReturn=WaitForSingleObject(m_hThread,1000);

if(dwWaitReturn!=WAIT_OBJECT_0)

{

TerminateThread(m_hThread,DWORD(-1));

}

CloseHandle(m_hThread);

m_hThread=NULL;

}

CloseHandle(m_hEvent);

m_hEvent=NULL;

}

if(m_hInterruptTransfer)

(*m_lpUsbFuncs->lpCloseTransfer)(m_hInterruptTransfer);

if(m_hInterruptPipe)

(*m_lpUsbFuncs->lpClosePipe)(m_hInterruptPipe);

}

//初始化USB鼠标

BOOLCMouse::Initialize()

{

LPCUSB_DEVICElpDeviceInfo=(*m_lpUsbFuncs->lpGetDeviceInfo)(m_hDevice);

//检测配置:USB鼠标应该只有一个中断管道

if((m_pInterface->lpEndpoints[0].Descriptor.bmAttributesUSB_ENDPOINT_TYPE_MASK)!=USB_ENDPOINT_TYPE_INTERRUPT)

{

RETAILMSG(1,(TEXT(!USBMouse:EP0wrongtype(%u)!rn),



评论


相关推荐

技术专区

关闭