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

📄 usbdriver.cpp

📁 基于ARM的应用Source6
💻 CPP
字号:
/*----------------------------------------------------------------------------
 *  Copyright (c) 2001 by National Semiconductor Corporation
 *  National Semiconductor Corporation
 *  2900 Semiconductor Drive
 *  Santa Clara, California 95051
 *
 *  All rights reserved
 *
 *<<<-------------------------------------------------------------------------
 * File Contents:
 *	USBDriver.cpp - this class handles USB driver interface. It calls API functions of WinDriver
 *					as defined by Jungo.
 *					The class impements Singleton design pattern, i.e there is one 
 *					single object of this class in the application, acessed by all the tests.
 *
 *  Project: USB Demo Application
 *  Author : Yan Nosovitsky
 *  Date   : Dec 2001
 *----------------------------------------------------------------------->>>*/

#include "stdafx.h"
#include <conio.h>
#include <stdio.h>
#include "USBDriver.h"

USBDriver* USBDriver::curUSBDriver = NULL;

USBDriver::USBDriver()
{
  HANDLE hWD;

  DWORD  configNum = 0, dwInterface = 0, dwAlternate = 0;
  WD_USB_SCAN_DEVICES usbScan;

  errorCode = NO_USB_ERROR;
  driverHandle = NULL;

  //RegisterWinDriver();

  
  if (!USB_Get_WD_handle(&hWD))
	  return;

  BZERO(usbScan);

  usbScan.searchId.dwVendorId = DRIVER_DEFAULT_VENDOR_ID;
  usbScan.searchId.dwProductId = DRIVER_DEFAULT_PRODUCT_ID;
    

  WD_UsbScanDevice(hWD, &usbScan);
  if (!usbScan.dwDevices)
  {
        errorCode = NO_USB_DEVICE_FOUND;
        WD_Close(hWD);
        return ;
  }

  uniqueId = usbScan.uniqueId[0];
  deviceGeneralInfo = usbScan.deviceGeneralInfo[0];

  configNum = DRIVER_DEFAULT_CONFIG;
  dwInterface = DRIVER_DEFAULT_INTERFACE;
  dwAlternate = DRIVER_DEFAULT_ALTERNATE;

  if (!OpenUSBDriver(uniqueId, configNum, dwInterface, dwAlternate))
  {
        WD_Close(hWD);
        return ;
  }

  WD_Close(hWD);

  numOfUSBUsers = 0;
  bulkOutTestRun = FALSE;
  intTestRun = FALSE;
}

USBDriver::~USBDriver()
{
	CloseUSBDriver();
}

bool USBDriver::OpenUSBDriver(DWORD uniqueId, DWORD configIndex, DWORD dwInterface, DWORD dwAlternate)
{
   
    WD_VERSION ver;
    WD_USB_DEVICE_REGISTER devReg;

	driverHandle = (DRIVER_HANDLE) malloc (sizeof (DRIVER_STRUCT));

    driverHandle->hDevice = 0;
    driverHandle->hWD = WD_Open();

    // check whether the handle is valid & the version is OK
    if (driverHandle->hWD==INVALID_HANDLE_VALUE)
    {
		errorCode = FAIL_OPEN_WINDRIVER;
        return FALSE;
    }

    BZERO(ver);
    WD_Version(driverHandle->hWD, &ver);
    if (ver.dwVer<WD_VER)
    {
		errorCode = INCORRECT_WINDRIVER_VER;
        WD_Close(driverHandle->hWD);
        return FALSE;
    }

    BZERO(devReg);
    devReg.uniqueId = uniqueId;
    devReg.dwConfigurationIndex = configIndex;
    devReg.dwInterfaceNum = dwInterface;
    devReg.dwInterfaceAlternate = dwAlternate;
    WD_UsbDeviceRegister(driverHandle->hWD, &devReg);
    if (!devReg.hDevice)
    {
		errorCode = FAIL_OPEN_USB_DEVICE;
        WD_Close(driverHandle->hWD);
        return FALSE;
    }
    driverHandle->hDevice = devReg.hDevice;
    driverHandle->deviceInfo = devReg.Device;


    return TRUE;
}

void USBDriver::CloseUSBDriver()
{
    WD_USB_DEVICE_REGISTER devReg;

    BZERO(devReg);
	if (driverHandle)
	{
		devReg.hDevice = driverHandle->hDevice;
		WD_UsbDeviceUnregister(driverHandle->hWD, &devReg);

		// close WinDriver
		WD_Close(driverHandle->hWD);
		free (driverHandle);
		driverHandle = NULL;
	}
}

bool USBDriver::USB_Get_WD_handle(HANDLE *phWD)
{
    WD_VERSION ver;

	*phWD = INVALID_HANDLE_VALUE;
    *phWD = WD_Open();

    // Check whether handle is valid and version OK
    if (*phWD==INVALID_HANDLE_VALUE) 
    {
		errorCode = FAIL_OPEN_WINDRIVER;
        return FALSE;
    }

    BZERO(ver);
    WD_Version(*phWD, &ver);
    if (ver.dwVer<WD_VER) 
    {
        errorCode = INCORRECT_WINDRIVER_VER;
        WD_Close (*phWD);
        *phWD = INVALID_HANDLE_VALUE;
        return FALSE;
    }

    return TRUE;
}

USBDriver* USBDriver::GetUSBDriver()
{
	if (curUSBDriver == NULL) /* first call */
		curUSBDriver = new USBDriver();
	else
	{
		if (curUSBDriver->errorCode)
		{
			delete curUSBDriver;
			curUSBDriver = new USBDriver();
		}
	}
	return curUSBDriver;
}

void USBDriver::ChangeConfig(int configNum)
{
}

void USBDriver::ChangeInterface(int interfaceNum)
{
}
	
bool USBDriver::CheckPipe(USB_PIPE_TYPE pipeType, int pipeNum, WD_USB_PIPE_INFO *pipeInfo)
{
	if (driverHandle->deviceInfo.Pipe[pipeNum].type == pipeType)
	{
		*pipeInfo = driverHandle->deviceInfo.Pipe[pipeNum];
		return TRUE;
	}
	return FALSE;
}

int USBDriver::WorkWithPipe(int pipeAddress, BYTE *buffer, int size, BOOL isRead)
{
    WD_USB_TRANSFER transfer;

    BZERO(transfer);
    transfer.dwPipe = pipeAddress;
    transfer.dwBytes = size;
    transfer.fRead = isRead;
    transfer.pBuffer = buffer;
    transfer.hDevice = driverHandle->hDevice;
	if (size < 100000)
		 /* default timeout */
		transfer.dwTimeout = 300000;
	else
		transfer.dwTimeout = 300000*(size/100000);
    WD_UsbTransfer(driverHandle->hWD, &transfer);

    if (transfer.fOK)
        return transfer.dwBytesTransfered;
	errorCode = DEVICE_WAS_DISCONNECTED;
    return 0xffffffff;
}
	
int USBDriver::WorkWithZeroPipe( BYTE setupPacket[8], BYTE *buffer, int size, BOOL isRead)
{
	WD_USB_TRANSFER transfer;
    int i;

    BZERO(transfer);
    transfer.dwPipe = 0x00;
    transfer.dwBytes = size;
    transfer.fRead = isRead;
    for (i=0; i<8; i++)
        transfer.SetupPacket[i] = setupPacket[i];
    transfer.pBuffer = buffer;
    transfer.hDevice = driverHandle->hDevice;
    transfer.dwTimeout = 300000;
    WD_UsbTransfer(driverHandle->hWD, &transfer);

    if (transfer.fOK)
        return transfer.dwBytesTransfered;
	errorCode = DEVICE_WAS_DISCONNECTED;
    return 0xffffffff;

}

void USBDriver::StopTransferPipe(int pipeAddress)
{
	WD_USB_TRANSFER transfer;

    BZERO(transfer);
    transfer.dwPipe = pipeAddress;
    transfer.dwOptions = USB_TRANSFER_HALT;
    transfer.hDevice = driverHandle->hDevice;
    WD_UsbTransfer(driverHandle->hWD, &transfer);
}

void USBDriver::ResetPipe(int pipeAddress)
{
}

CString USBDriver::GetErrorDescriptor()
{
	CString error;

	switch (errorCode)
	{
	case NO_USB_ERROR :
		break;
	case NO_USB_DEVICE_FOUND:
		error.Format(_T("Cannot find USB Device."));
		break;
	case FAIL_OPEN_WINDRIVER:
		error.Format(_T("Cannot open WinDriver."));
		break;
	case INCORRECT_WINDRIVER_VER:
		error.Format(_T("Incorrect WinDriver version."));
		break;
	case FAIL_OPEN_USB_DEVICE:
		error.Format(_T("Cannot open USB driver."));
		break;
	case DEVICE_WAS_DISCONNECTED:
		error.Format(_T("USB Device was disconnected."));
	}
	return error;
}

void USBDriver::RegisterWinDriver()
{
    HANDLE hWD;
    WD_LICENSE lic;  

	hWD = WD_Open();
    if (hWD!=INVALID_HANDLE_VALUE)
    {
            // replace the following string with your license string
			// strcpy(lic.cLicense, "12345678.license.sting"");
            WD_License(hWD, &lic);
            WD_Close(hWD);
    }
}

⌨️ 快捷键说明

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