WinCE的USB Camera流接口驅(qū)動開發(fā)
DWORD CAM_Init(LPCTSTR pContext,LPCVOIDIp VBusContext)
其中,pContext是系統(tǒng)自動傳入的字符串內(nèi)容,也是上面的鍵名,即[HKEY_LOCAL_MACHINEDriversActiveN];CAM_Init要完成的就是在此鍵下讀出設(shè)備上下文的指針,將其作為DWORD返回;IpvBusContext不用考慮。
在USBDeviceAttach()中,最后要完成的工作是在此函數(shù)內(nèi)調(diào)用USBD模塊的RegisterNotificationRoutine函數(shù)登記注冊DeviceNotify函數(shù)。這個DeviceNotify函數(shù)是必需的,在設(shè)備被移走后,系統(tǒng)調(diào)用這個函數(shù)完成相應(yīng)的善后工作。
BOOL WINAPI DeviceNotify(LPVOID lpvNotifyPa-rameter DWORD dwCode.LPDWORD dwInf01.LPDW0RDdwlnfo2.LPDWORD dwlnfo3.LPDWORD dwlnfo4)
其中,IpvNotifyParameter是設(shè)備的上下文句柄,在RegisterNoticationRoutine中作為參數(shù)傳入;dwCode是系統(tǒng)調(diào)用此函數(shù)的原因,如設(shè)備被移走,dwcode的值就為USB_CLOSE_DEVICE,相應(yīng)的,用戶進行卸載DLL工作;dwInfol,…,dwInfo4沒有使用。
自此,系統(tǒng)在USBDeviceAttach中完成對所加USB外設(shè)的驅(qū)動加載。當有用戶調(diào)用CreateFile函數(shù),系統(tǒng)會將用戶填入CreateFile()的參數(shù)值,直接傳到CAM_Open()。
DWORD CAM_Open(DWORD hDeviceContext,DWORDAccessCode,DWORD ShareMode)
其中,hDeviceContext是驅(qū)動上下文句柄,由系統(tǒng)自動填充;AccessCode是訪問模式,ShareMode是共享模式,均由CreateFile()傳遞過來;CAM_Open的工作是將hDe-viceContext以DWORD的形式返回,再作為CreateFile()的句柄值返回給用戶。當用戶調(diào)用CloseHandle()時,系統(tǒng)將直接調(diào)用CAM_Close(),用于關(guān)閉一個驅(qū)動程序。
B00L CAM_Close(DWORD hOpenContext)
其中,hOpenContext是設(shè)備驅(qū)動的引用事例句柄,由CAM_Open創(chuàng)建。本驅(qū)動中,所有對USB Camera的操作均通過IOControl()映射到CAM_IOControl來完成。下面是CAM_IOControl的部分源碼分析:
由于本驅(qū)動是針對USBCamera的,因此CAM_Write、CAM_Read、CAM_PowerUp、CAM_PowerDown并沒有內(nèi)容;但是只要用戶調(diào)用WriteFile,系統(tǒng)就將映射到CAM_Write。其他函數(shù)類似。通常,Camera對圖像的壓縮采用標準是MJPEG算法。在Zc030x上正是采用這一算法完成對數(shù)據(jù)壓縮的。只要在驅(qū)動上增加MJPEG的解碼算法,還原壓縮數(shù)據(jù),就可以正確顯示圖像了。至此,整個USB Camera的驅(qū)動編寫工作完成。經(jīng)過實驗驗證,已經(jīng)實現(xiàn)了最高為25幀/s,大小為320×240的圖片的傳輸。
結(jié) 語
本文介紹了WinCE5.0下USB設(shè)備驅(qū)動框架,結(jié)合USB Camera的驅(qū)動開發(fā)實例說明了在USB驅(qū)動框架中驅(qū)動數(shù)據(jù)的流動方向,并已在中星微公司的301PLUS和303這兩個系列的攝像頭上得到成功運用和實踐。所采用的程序設(shè)計方法及思想,對其他類似嵌入式系統(tǒng)軟件的設(shè)計也有較高的參考價值。
評論