1. 程式人生 > >WinCE usb虛擬串列埠

WinCE usb虛擬串列埠

1.Usb驅動程式的載入
識別到USB裝置插入到電腦上(姑且這麼認為吧)
fRet = LoadDeviceDrivers(pDev, &fLoaded);
if(fRet && !fLoaded)
{
//失敗了,提示使用者對話方塊,
}
1.1LoadDeviceDrivers
LoadUSBClient(pDev, pfLoaded, NULL);


if(!*pfLoaded)
{

LoadGroupDriver(pDev, pfLoaded, pInterface, TRUE,TRUE, pInterface != NULL)

//載入驅動的各種嘗試,pid,vid什麼的,百度一下

}
LoadRegisteredDriver
列舉所有在szDriverId下面的子鍵,找到Dll,呼叫LoadDriver(szDll);載入到自己的程序空間,找到USBDeviceAttach函式入口,呼叫。控制權進入到我們驅動程式的USBDeviceAttach.
在USBDeviceAttach中,會判斷裝置是否可以控制。
pUsbDevice->Init()繼續呼叫Attach()函式,在UsbClientDevice::Attach中會呼叫純虛擬函式IsThisInterfaceSupported()和IsClientDriverSatisfied()判斷是否是我們需
要的Interface.
在UsbClientDevice的派生類中重定義。
usbser根據是否支援bulk in / bulk out判斷是否支援。
2.如何啟動讀寫執行緒
usbser是一個標準的流式驅動程式,在載入後,應用程式通過呼叫COM_Init來操作串列埠。微軟把跟硬體無關的程式碼提取出來放在Mdd.c中,在COM_Open中會初始化串列埠的一些屬性,reset緩衝區等等.

COM_Init函式中會最終構造虛擬串列埠物件pHWHead = pSerialHead->pHWObject->pFuncTbl->HWInit(....)這裡要提到檔案Cserpdd.h,Cserpdd.cpp檔案,Mdd層使用Pdd的程式碼,pdd實現函式表,MDD最後的實現都轉發到Cserpdd.cpp中的CSerpdd類,這樣只要實現Cserpdd類的派生就可以完成一個驅動程式了。usb虛擬串列埠正式實現了 UsbSerClientDriver類和UsbActiveSyncSerialClientDriver類完成的
mdd中會呼叫COM_Init會呼叫Cserpdd.cpp中的SerInit函式,在SerInit函式中會呼叫CreateSericalObject函式(在usbser.cpp中實現),分析Cserpdd.cpp函式,主要完成MDD函式的轉發,委託給Cserpdd類處理,面向物件
在CreateSerialObject函式中會呼叫UsbSerClientDriver::Init()函式,首先是呼叫基
類CSerialPDD::Init()函式,然後
CreateBulkIn
CreateBulkOut
會建立bulk in/out管道的讀寫執行緒,並且在SerialDataIn::Init(),SerialDataOut::Init()中啟動miniThread,至此虛擬串列埠完成。
讀寫資料,會把資料copy到使用者的buffer中去。