⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ov511.cpp

📁 Windows+CE下USB摄像头驱动开发,使用EVC开发。摄像头为 网眼 Webeye 2000 VID 0x05A9 PID 0xA511 输出格式:RAW-YUV
💻 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 + -