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

📄 ov511_diag.cpp

📁 camera 驱动源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
////////////////////////////////////////////////////////////////
//
// This is a diagnostics application for accessing the USB device.
// The code accesses the hardware via WinDriver functions.
// 
// Copyright (c) 2003 - 2005 Jungo Ltd.  http://www.jungo.com
// 
////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>

#if defined(USB_DIAG_SAMPLE)

#include "../../include/wdu_lib.h"
#include "../../include/status_strings.h"
#include "../../include/utils.h"

#include "ov511_diag.h"

// TODO: change the following definitions to match your device.
#define DEFAULT_VENDOR_ID 0x1234
#define DEFAULT_PRODUCT_ID 0x5678
#define DEFAULT_LICENSE_STRING "12345abcde1234.license"

#else

// use in wizard's device-specific generated code
#include "d:\windriver/include/wdu_lib.h"
#include "d:\windriver/include/status_strings.h"
#include "d:\windriver/include/utils.h"

#define DEFAULT_VENDOR_ID         0x05A9
#define DEFAULT_PRODUCT_ID        0xA511
#define DEFAULT_LICENSE_STRING    "6C3CC2BFF76637EC558F0D4D088AF4534612916A.hfl"

#endif

#define USE_DEFAULT 0xffff
#define ATTACH_EVENT_TIMEOUT 30 // in seconds
#define TRANSFER_TIMEOUT 30000 // in msecs
#if !defined(TRACE)
#define TRACE printf
#endif
#if !defined(ERR)
#define ERR printf
#endif

#define BYTES_IN_LINE 16
#define HEX_CHARS_PER_BYTE 3
#define HEX_STOP_POS BYTES_IN_LINE * HEX_CHARS_PER_BYTE

typedef struct DEVICE_CONTEXT
{
    struct DEVICE_CONTEXT *pNext;
    WDU_DEVICE_HANDLE hDevice;
    DWORD dwVendorId;
    DWORD dwProductId;
    DWORD dwInterfaceNum;
    DWORD dwAlternateSetting;
} DEVICE_CONTEXT;

typedef struct DRIVER_CONTEXT
{
    HANDLE hEvent;
    HANDLE hMutex;
    DWORD dwDeviceCount;
    DEVICE_CONTEXT *deviceContextList;
    DEVICE_CONTEXT *pActiveDev;
    HANDLE hDeviceUnusedEvent;
} DRIVER_CONTEXT;

char line[250];
DRIVER_CONTEXT DrvCtx;

BOOL DLLCALLCONV DeviceAttach(WDU_DEVICE_HANDLE hDevice, 
    WDU_DEVICE *pDeviceInfo, PVOID pUserData)
{
    DRIVER_CONTEXT *pDrvCtx = (DRIVER_CONTEXT *)pUserData;
    DEVICE_CONTEXT *pDevCtx, **ppDevCtx;
    DWORD dwInterfaceNum = pDeviceInfo->pActiveInterface->pActiveAltSetting->Descriptor.bInterfaceNumber;
    DWORD dwAlternateSetting = pDeviceInfo->pActiveInterface->pActiveAltSetting->Descriptor.bAlternateSetting;
    
    /*
    // NOTE: To change the alternate setting, call WDU_SetInterface() here
    DWORD dwAttachError;

    // TODO: replace with the requested number:
    dwAlternateSetting = %alternate_setting_number%; 

    dwAttachError = WDU_SetInterface(hDevice, dwInterfaceNum, dwAlternateSetting);
    if (dwAttachError)
    {
        ERR("DeviceAttach: WDU_SetInterface failed (num. %ld, alternate %ld) device 0x%p: error 0x%lx (\"%s\")\n",
            dwInterfaceNum, dwAlternateSetting, hDevice, 
            dwAttachError, Stat2Str(dwAttachError));

        return FALSE;
    }
    */

    TRACE("DeviceAttach: received and accepted attach for vendor id 0x%x, "
        "product id 0x%x, interface %ld, device handle 0x%p\n",
        pDeviceInfo->Descriptor.idVendor, pDeviceInfo->Descriptor.idProduct,
        dwInterfaceNum, hDevice);
    
    // Add our device to the device list
    pDevCtx = (DEVICE_CONTEXT *)malloc(sizeof(DEVICE_CONTEXT));
    if (!pDevCtx)
    {
        ERR("DeviceAttach: failed allocating memory\n");
        return FALSE;
    }
    BZERO(*pDevCtx);
    pDevCtx->hDevice = hDevice;
    pDevCtx->dwInterfaceNum = dwInterfaceNum;
    pDevCtx->dwVendorId = pDeviceInfo->Descriptor.idVendor;
    pDevCtx->dwProductId = pDeviceInfo->Descriptor.idProduct;
    pDevCtx->dwAlternateSetting = dwAlternateSetting;
    
    OsMutexLock(pDrvCtx->hMutex);
    for (ppDevCtx = &pDrvCtx->deviceContextList; *ppDevCtx; ppDevCtx = &((*ppDevCtx)->pNext));
    *ppDevCtx = pDevCtx;
    pDrvCtx->dwDeviceCount++;
    OsMutexUnlock(pDrvCtx->hMutex);
    
    OsEventSignal(pDrvCtx->hEvent);
    // Accept control over this device
    return TRUE;
}

VOID DLLCALLCONV DeviceDetach(WDU_DEVICE_HANDLE hDevice, PVOID pUserData)
{
    DRIVER_CONTEXT *pDrvCtx = (DRIVER_CONTEXT *)pUserData;
    DEVICE_CONTEXT **pCur;
    DEVICE_CONTEXT *pTmpDev;
    BOOL bDetachActiveDev = FALSE;

    TRACE("DeviceDetach: received detach for device handle 0x%p\n", hDevice);

    OsMutexLock(pDrvCtx->hMutex);
    for (pCur = &pDrvCtx->deviceContextList; 
        *pCur && (*pCur)->hDevice != hDevice; 
        pCur = &((*pCur)->pNext));
    
    if (*pCur == pDrvCtx->pActiveDev)
    {
        bDetachActiveDev = TRUE;
        pDrvCtx->pActiveDev = NULL;
    }

    pTmpDev = *pCur;
    *pCur = pTmpDev->pNext;
    free(pTmpDev);
    
    pDrvCtx->dwDeviceCount--;
    OsMutexUnlock(pDrvCtx->hMutex);

    // Detach callback must not return as long as hDevice is being used.
    if (bDetachActiveDev)
        OsEventWait(pDrvCtx->hDeviceUnusedEvent, INFINITE);
}

int OnlyForTest(WDU_DEVICE_HANDLE hDevice)
{
	return 0;
}

int CaptureRawFrameData(unsigned char *ptr)
{
	int i, k, j;
	BYTE *pBuffer, *ptemp;
	DWORD dwError, dwNum, dwBytesTransferred;

	pBuffer = (BYTE*)malloc(232562 * sizeof(BYTE));
	ptemp = pBuffer;
	for(i = 0; i < 2; i++)
	{
		dwError = WDU_TransferIsoch(DrvCtx.pActiveDev->hDevice, 0x81, TRUE, USB_ISOCH_ASAP, pBuffer,
			232562, &dwNum, 0);

		if(dwError != WD_STATUS_SUCCESS)
		{
			WDU_ResetPipe(DrvCtx.pActiveDev->hDevice, 0x81);
			WDU_ResetPipe(DrvCtx.pActiveDev->hDevice, 0x81);
		}
		else
		{
			for(j = 0; j < dwNum; j++)
			{
				//查找帧开始标志
				int k = (ptemp[0] | ptemp[1] | ptemp[2] | ptemp[3] | 
					 ptemp[4] | ptemp[5] | ptemp[6] | ptemp[7]);
				int k1 = (ptemp[8] & 0xff);
				int k2 = (ptemp[8] & 0xff);
				if (k == 0 && (k1 == 24 || k2 ==25))
					 break;
				ptemp++;
			}
			ptemp += 9;
			//复制一帧原始数据,同时去除帧内的包序号
			memmove(ptr, ptemp, 951);    //复制第一包
			ptr += 951;
			ptemp += 952;
			for(k = 0; k < 119; k++)     //复制其余包
			{
				memmove(ptr, ptemp, 960); 
				ptr += 960;
				ptemp += 961;
			}
			memmove(ptr, ptemp, 32);
			break;
		}

	}
	free(pBuffer);
	return 0;
}

/*************************************************************************
以下代码显得如此繁琐,其原因以下代码是直接利用bushound捕获的文件作为输入,
然后编程直接生成所致。
*************************************************************************/
int InitReg(WDU_DEVICE_HANDLE hDevice)
{
	DWORD dwError,dwBytesTransferred;
	BYTE SetupPacket1[8]={0x40,0x02,0x00,0x00,0x53,0x00,0x01,0x00};
	BYTE Sd1=0x01;
	BYTE SetupPacket2[8]={0x40,0x02,0x00,0x00,0x50,0x00,0x01,0x00};
	BYTE Sd2=0x3d;
	BYTE SetupPacket3[8]={0xc0,0x03,0x00,0x00,0x5f,0x00,0x01,0x00};
	BYTE Sd3=0x6c;
	BYTE SetupPacket4[8]={0x40,0x02,0x00,0x00,0x41,0x00,0x01,0x00};
	BYTE Sd4=0xc0;
	BYTE SetupPacket5[8]={0x40,0x02,0x00,0x00,0x44,0x00,0x01,0x00};
	BYTE Sd5=0xc1;
	BYTE SetupPacket6[8]={0x40,0x02,0x00,0x00,0x42,0x00,0x01,0x00};
	BYTE Sd6=0x12;
	BYTE SetupPacket7[8]={0x40,0x02,0x00,0x00,0x45,0x00,0x01,0x00};
	BYTE Sd7=0x80;
	BYTE SetupPacket8[8]={0x40,0x02,0x00,0x00,0x40,0x00,0x01,0x00};
	BYTE Sd8=0x01;
	BYTE SetupPacket9[8]={0x40,0x02,0x00,0x00,0x41,0x00,0x01,0x00};
	BYTE Sd9=0xc0;
	BYTE SetupPacket10[8]={0x40,0x02,0x00,0x00,0x44,0x00,0x01,0x00};
	BYTE Sd10=0xc1;
	BYTE SetupPacket11[8]={0x40,0x02,0x00,0x00,0x43,0x00,0x01,0x00};
	BYTE Sd11=0x29;
	BYTE SetupPacket12[8]={0x40,0x02,0x00,0x00,0x40,0x00,0x01,0x00};
	BYTE Sd12=0x03;
	BYTE SetupPacket13[8]={0x40,0x02,0x00,0x00,0x40,0x00,0x01,0x00};
	BYTE Sd13=0x05;
	BYTE SetupPacket14[8]={0xc0,0x03,0x00,0x00,0x45,0x00,0x01,0x00};
	BYTE Sd14=0xff;
	BYTE SetupPacket15[8]={0x40,0x02,0x00,0x00,0x42,0x00,0x01,0x00};
	BYTE Sd15=0xff;
	BYTE SetupPacket16[8]={0x40,0x02,0x00,0x00,0x45,0x00,0x01,0x00};
	BYTE Sd16=0x00;
	BYTE SetupPacket17[8]={0x40,0x02,0x00,0x00,0x40,0x00,0x01,0x00};
	BYTE Sd17=0x01;
	BYTE SetupPacket18[8]={0x40,0x02,0x00,0x00,0x41,0x00,0x01,0x00};
	BYTE Sd18=0xc0;
	BYTE SetupPacket19[8]={0x40,0x02,0x00,0x00,0x44,0x00,0x01,0x00};
	BYTE Sd19=0xc1;
	BYTE SetupPacket20[8]={0x40,0x02,0x00,0x00,0x43,0x00,0x01,0x00};
	BYTE Sd20=0x29;
	BYTE SetupPacket21[8]={0x40,0x02,0x00,0x00,0x40,0x00,0x01,0x00};
	BYTE Sd21=0x03;
	BYTE SetupPacket22[8]={0x40,0x02,0x00,0x00,0x40,0x00,0x01,0x00};
	BYTE Sd22=0x05;
	BYTE SetupPacket23[8]={0xc0,0x03,0x00,0x00,0x45,0x00,0x01,0x00};
	BYTE Sd23=0xff;
	BYTE SetupPacket24[8]={0x40,0x02,0x00,0x00,0x42,0x00,0x01,0x00};
	BYTE Sd24=0xff;
	BYTE SetupPacket25[8]={0x40,0x02,0x00,0x00,0x45,0x00,0x01,0x00};
	BYTE Sd25=0x00;
	BYTE SetupPacket26[8]={0x40,0x02,0x00,0x00,0x40,0x00,0x01,0x00};
	BYTE Sd26=0x01;
	BYTE SetupPacket27[8]={0x40,0x02,0x00,0x00,0x41,0x00,0x01,0x00};
	BYTE Sd27=0xc0;
	BYTE SetupPacket28[8]={0x40,0x02,0x00,0x00,0x44,0x00,0x01,0x00};
	BYTE Sd28=0xc1;
	BYTE SetupPacket29[8]={0x40,0x02,0x00,0x00,0x42,0x00,0x01,0x00};
	BYTE Sd29=0x12;
	BYTE SetupPacket30[8]={0x40,0x02,0x00,0x00,0x45,0x00,0x01,0x00};
	BYTE Sd30=0x80;
	BYTE SetupPacket31[8]={0x40,0x02,0x00,0x00,0x40,0x00,0x01,0x00};
	BYTE Sd31=0x01;
	BYTE SetupPacket32[8]={0x40,0x02,0x00,0x00,0x41,0x00,0x01,0x00};
	BYTE Sd32=0xc0;
	BYTE SetupPacket33[8]={0x40,0x02,0x00,0x00,0x44,0x00,0x01,0x00};
	BYTE Sd33=0xc1;
	BYTE SetupPacket34[8]={0x40,0x02,0x00,0x00,0x43,0x00,0x01,0x00};
	BYTE Sd34=0x29;
	BYTE SetupPacket35[8]={0x40,0x02,0x00,0x00,0x40,0x00,0x01,0x00};
	BYTE Sd35=0x03;
	BYTE SetupPacket36[8]={0x40,0x02,0x00,0x00,0x40,0x00,0x01,0x00};
	BYTE Sd36=0x05;
	BYTE SetupPacket37[8]={0xc0,0x03,0x00,0x00,0x45,0x00,0x01,0x00};
	BYTE Sd37=0xff;
	BYTE SetupPacket38[8]={0x40,0x02,0x00,0x00,0x42,0x00,0x01,0x00};
	BYTE Sd38=0xff;
	BYTE SetupPacket39[8]={0x40,0x02,0x00,0x00,0x45,0x00,0x01,0x00};
	BYTE Sd39=0x00;
	BYTE SetupPacket40[8]={0x40,0x02,0x00,0x00,0x40,0x00,0x01,0x00};
	BYTE Sd40=0x01;
	BYTE SetupPacket41[8]={0x40,0x02,0x00,0x00,0x41,0x00,0x01,0x00};
	BYTE Sd41=0xc0;
	BYTE SetupPacket42[8]={0x40,0x02,0x00,0x00,0x44,0x00,0x01,0x00};
	BYTE Sd42=0xc1;
	BYTE SetupPacket43[8]={0x40,0x02,0x00,0x00,0x43,0x00,0x01,0x00};
	BYTE Sd43=0x29;
	BYTE SetupPacket44[8]={0x40,0x02,0x00,0x00,0x40,0x00,0x01,0x00};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -