?? ov511.cpp
字號:
// Ov511.cpp : Defines the entry point for the DLL application.
//
//-------------------------------------------------------------------------
//======================================================================
// OV511 - Ov511 Webcam driver for Windows CE
//
// Author: MacintoshM
//======================================================================
#include <windows.h> // For all that Windows stuff
#include <winioctl.h> // Needed for CTLCODE macro
#include <USBdi.h> // USB includes
#include <usb100.h> // USB includes
#include "ov511camsdk.h" // IOCTL defs for driver
#include "Ov511Cam.h" // Local driver includes
#include "USBVideo.h"
//
// Globals
//
HINSTANCE hInst; // DLL instance handle
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
hInst = (HINSTANCE)hModule;
switch (ul_reason_for_call) {
case DLL_PROCESS_ATTACH:
DEBUGREGISTER(hInst);
// Improve performance by passing on thread attach calls
DisableThreadLibraryCalls (hInst);
break;
case DLL_PROCESS_DETACH:
DEBUGMSG(ZONE_INIT, (DTAG TEXT("DLL_PROCESS_DETACH\r\n")));
break;
}
return TRUE;
}
//======================================================================
// CAM_Init - Driver initialization function
//
DWORD CAM_Init (DWORD dwContext, LPCVOID lpvBusContext)
{
RETAILMSG(1,(TEXT("Camera Init!\r\n")));
PDRVCONTEXT pDrv;
// Allocate a drive instance structure.
pDrv = GetConfigData (dwContext);
if (pDrv)
{
}
return (DWORD)pDrv;
}
//======================================================================
// CAM_Deinit - Driver de-initialization function
//
BOOL CAM_Deinit (DWORD dwContext)
{
return 1;
}
//======================================================================
// CAM_Open - Called when driver opened
//
DWORD CAM_Open (DWORD dwContext, DWORD dwAccess, DWORD dwShare)
{
PDRVCONTEXT pDrv = (PDRVCONTEXT) dwContext;
RETAILMSG(1, (TEXT("CAM_Open++ dwContext: %x\r\n"), dwContext));
// Verify that the context handle is valid.
if (pDrv && (pDrv->dwSize != sizeof (DRVCONTEXT)))
{
return 0;
}
EnterCriticalSection (&pDrv->csDCall);
if (pDrv->nNumOpens)
{
//已經打開
LeaveCriticalSection (&pDrv->csDCall);
SetLastError(ERROR_ACCESS_DENIED);
return 0;
}
pDrv->nNumOpens++;
LeaveCriticalSection (&pDrv->csDCall);
RETAILMSG(1, (TEXT("CAM_Open-- dwContext: %x\r\n"), dwContext));
return (DWORD)pDrv;
}
//======================================================================
// CAM_Close - Called when driver closed
//
BOOL CAM_Close (DWORD dwOpen)
{
PDRVCONTEXT pDrv = (PDRVCONTEXT) dwOpen;
RETAILMSG(1, (TEXT("CAM_Close++ dwOpen: %x\r\n"), dwOpen));
EnterCriticalSection (&pDrv->csDCall);
if (pDrv && (pDrv->dwSize != sizeof (DRVCONTEXT)))
{
RETAILMSG(1, (TEXT("CAM_Close failed\r\n")));
SetLastError(ERROR_INVALID_HANDLE);
return 0;
}
//添加停止捕獲的代碼
if (pDrv->nNumOpens)
{
pDrv->nNumOpens--;
}
LeaveCriticalSection (&pDrv->csDCall);
RETAILMSG(1, (TEXT("CAM_Close--\r\n")));
return TRUE;
}
//======================================================================
// CAM_Read - Called when driver read
//
DWORD CAM_Read (DWORD dwOpen, LPVOID pBuffer, DWORD dwCount)
{
DWORD dwBytesRead = 0;
DEBUGMSG (ZONE_EXENTRY,
(DTAG TEXT("CAM_Read++ dwOpen: %x\r\n"), dwOpen));
DEBUGMSG (ZONE_FUNC, (DTAG TEXT("CAM_Read--\r\n")));
return dwBytesRead;
}
//======================================================================
// CAM_Write - Called when driver written
//
DWORD CAM_Write (DWORD dwOpen, LPVOID pBuffer, DWORD dwCount)
{
DWORD dwBytesWritten = 0;
DEBUGMSG (ZONE_EXENTRY,
(DTAG TEXT("CAM_Write++ dwOpen: %x\r\n"), dwOpen));
DEBUGMSG (ZONE_FUNC, (DTAG TEXT("CAM_Write--\r\n")));
return dwBytesWritten;
}
//======================================================================
// CAM_Seek - Called when SetFilePtr called
//
DWORD CAM_Seek (DWORD dwOpen, long lDelta, WORD wType)
{
DEBUGMSG (ZONE_EXENTRY,(DTAG TEXT("CAM_Seek++ dwOpen:%x %d %d\r\n"),
dwOpen, lDelta, wType));
DEBUGMSG (ZONE_EXENTRY, (DTAG TEXT("CAM_Seek--\r\n")));
return 0;
}
//======================================================================
// CAM_IOControl - Called when DeviceIOControl called
//
DWORD CAM_IOControl (DWORD dwOpen, DWORD dwCode, PBYTE pIn, DWORD dwIn,
PBYTE pOut, DWORD dwOut, DWORD *pdwBytesWritten)
{
PDRVCONTEXT pDrv;
DWORD err = ERROR_INVALID_PARAMETER;
int i;
DWORD startaddress;
DWORD bytesRead;
RETAILMSG(1, (TEXT("CAM_IOControl++ dwOpen: %x dwCode: %x\r\n"),
dwOpen, dwCode));
pDrv = (PDRVCONTEXT) dwOpen;
EnterCriticalSection (&pDrv->csDCall);
switch (dwCode)
{
case IOCTL_CAMERA_DEVICE_LED_ON:
RETAILMSG(1, (TEXT("Turn On LED!\r\n")));
RegisterWrite(pDrv,0x55,1);
break;
case IOCTL_CAMERA_DEVICE_LED_OFF:
RETAILMSG(1, (TEXT("Turn Off LED!\r\n")));
RegisterWrite(pDrv,0x55,0);
break;
case IOCTL_CAMERA_DEVICE_LED_READ:
RETAILMSG(1, (TEXT("Read LED status!\r\n")));
RegisterRead(pDrv,0x55,pOut);
break;
case IOCTL_CAMERA_DEVICE_START_CAPTURE:
Ov51xSetDefaultParams(pDrv);
break;
case IOCTL_CAMERA_DEVICE_STOP_CAPTURE:
Ov51xStop(pDrv);
break;
case IOCTL_CAMERA_DEVICE_CAPTURE_ONE_FRAME:
RETAILMSG(1, (TEXT("Init isoc!\r\n")));
startaddress=0;
for(i=0;i<25;i++)
{
bytesRead=Ov51xReadOneFrame(pDrv,pOut,startaddress);
startaddress+=bytesRead;
}
*pdwBytesWritten=startaddress;
break;
default:
RETAILMSG(1, (TEXT("CAM_IOControl: unknown code %x\r\n"), dwCode));
err = ERROR_INVALID_PARAMETER;
break;
}
SetLastError (err);
LeaveCriticalSection (&pDrv->csDCall);
RETAILMSG(1, (TEXT("CAM_IOControl-- rc = %d\r\n"), err));
return err ? FALSE : TRUE;
}
//======================================================================
// CAM_PowerDown - Called when system suspends
//
void CAM_PowerDown (DWORD dwContext)
{
return;
}
//======================================================================
// CAM_PowerUp - Called when resumes
//
void CAM_PowerUp (DWORD dwContext)
{
return;
}
//----------------------------------------------------------------------
// GetConfigData - Get the pointer to the driver context structure
//
PDRVCONTEXT GetConfigData (DWORD dwContext)
{
int nLen, rc;
DWORD dwLen, dwType, dwSize = 0;
HKEY hKey;
PDRVCONTEXT pDrv = 0;
DEBUGMSG (ZONE_FUNC, (DTAG TEXT("GetConfigData++\r\n")));
nLen = 0;
// If ptr < 65K, it's a value, not a pointer.
if (dwContext < 0x10000) {
return 0;
} else {
__try {
nLen = lstrlen ((LPTSTR)dwContext);
}
__except (EXCEPTION_EXECUTE_HANDLER) {
nLen = 0;
}
}
if (!nLen) {
DEBUGMSG (ZONE_ERROR, (DTAG TEXT("dwContext not a ptr\r\n")));
return 0;
}
// Open the Active key for the driver.
rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE,(LPTSTR)dwContext,0, 0, &hKey);
if (rc == ERROR_SUCCESS) {
// Read the key value.
dwLen = sizeof(pDrv);
rc = RegQueryValueEx (hKey, TEXT("ClientInfo"), NULL, &dwType,
(PBYTE)&pDrv, &dwLen);
RegCloseKey(hKey);
if ((rc == ERROR_SUCCESS) && (dwType == REG_DWORD))
{
__try {
if (pDrv->dwSize != sizeof (DRVCONTEXT))
pDrv = 0;
}
__except (EXCEPTION_EXECUTE_HANDLER) {
pDrv = 0;
}
}
else
{
DEBUGMSG (ZONE_ERROR, (DTAG TEXT("Error reading registry\r\n")));
pDrv = 0;
}
} else
DEBUGMSG (ZONE_ERROR, (DTAG TEXT("Error opening Active key\r\n")));
DEBUGMSG (ZONE_FUNC, (DTAG TEXT("GetConfigData--\r\n")));
return pDrv;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -