WinCE的USB Camera流接口驅動(dòng)開(kāi)發(fā)
DWORD CAM_Init(LPCTSTR pContext,LPCVOIDIp VBusContext)
其中,pContext是系統自動(dòng)傳入的字符串內容,也是上面的鍵名,即[HKEY_LOCAL_MACHINEDriversActiveN];CAM_Init要完成的就是在此鍵下讀出設備上下文的指針,將其作為DWORD返回;IpvBusContext不用考慮。
在USBDeviceAttach()中,最后要完成的工作是在此函數內調用USBD模塊的RegisterNotificationRoutine函數登記注冊DeviceNotify函數。這個(gè)DeviceNotify函數是必需的,在設備被移走后,系統調用這個(gè)函數完成相應的善后工作。
BOOL WINAPI DeviceNotify(LPVOID lpvNotifyPa-rameter DWORD dwCode.LPDWORD dwInf01.LPDW0RDdwlnfo2.LPDWORD dwlnfo3.LPDWORD dwlnfo4)
其中,IpvNotifyParameter是設備的上下文句柄,在RegisterNoticationRoutine中作為參數傳入;dwCode是系統調用此函數的原因,如設備被移走,dwcode的值就為USB_CLOSE_DEVICE,相應的,用戶(hù)進(jìn)行卸載DLL工作;dwInfol,…,dwInfo4沒(méi)有使用。
自此,系統在USBDeviceAttach中完成對所加USB外設的驅動(dòng)加載。當有用戶(hù)調用CreateFile函數,系統會(huì )將用戶(hù)填入CreateFile()的參數值,直接傳到CAM_Open()。
DWORD CAM_Open(DWORD hDeviceContext,DWORDAccessCode,DWORD ShareMode)
其中,hDeviceContext是驅動(dòng)上下文句柄,由系統自動(dòng)填充;AccessCode是訪(fǎng)問(wèn)模式,ShareMode是共享模式,均由CreateFile()傳遞過(guò)來(lái);CAM_Open的工作是將hDe-viceContext以DWORD的形式返回,再作為CreateFile()的句柄值返回給用戶(hù)。當用戶(hù)調用CloseHandle()時(shí),系統將直接調用CAM_Close(),用于關(guān)閉一個(gè)驅動(dòng)程序。
B00L CAM_Close(DWORD hOpenContext)
其中,hOpenContext是設備驅動(dòng)的引用事例句柄,由CAM_Open創(chuàng )建。本驅動(dòng)中,所有對USB Camera的操作均通過(guò)IOControl()映射到CAM_IOControl來(lái)完成。下面是CAM_IOControl的部分源碼分析:

由于本驅動(dòng)是針對USBCamera的,因此CAM_Write、CAM_Read、CAM_PowerUp、CAM_PowerDown并沒(méi)有內容;但是只要用戶(hù)調用WriteFile,系統就將映射到CAM_Write。其他函數類(lèi)似。通常,Camera對圖像的壓縮采用標準是MJPEG算法。在Zc030x上正是采用這一算法完成對數據壓縮的。只要在驅動(dòng)上增加MJPEG的解碼算法,還原壓縮數據,就可以正確顯示圖像了。至此,整個(gè)USB Camera的驅動(dòng)編寫(xiě)工作完成。經(jīng)過(guò)實(shí)驗驗證,已經(jīng)實(shí)現了最高為25幀/s,大小為320×240的圖片的傳輸。
結 語(yǔ)
本文介紹了WinCE5.0下USB設備驅動(dòng)框架,結合USB Camera的驅動(dòng)開(kāi)發(fā)實(shí)例說(shuō)明了在USB驅動(dòng)框架中驅動(dòng)數據的流動(dòng)方向,并已在中星微公司的301PLUS和303這兩個(gè)系列的攝像頭上得到成功運用和實(shí)踐。所采用的程序設計方法及思想,對其他類(lèi)似嵌入式系統軟件的設計也有較高的參考價(jià)值。
評論