📄 ov511_diag.cpp
字号:
////////////////////////////////////////////////////////////////
//
// 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 + -