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

📄 usb_lib.cpp

📁 不可不看的USB_C51源码 内有C和VC6.0两种方式的编码
💻 CPP
字号:
//////////////////////////////////////////////////////////////////////
// File - usb_lib.c
//
// Library for accessing the USB device.
// Code was generated by DriverWizard.
// It accesses the hardware via WinDriver functions.
// 
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "usb_lib.h"
#ifndef __KERNEL__
	#include <stdio.h>
#endif
#include "usb_diag_lib.h"

// this string is set to an error message, if one occurs
CHAR USB_ErrorString[1024];

typedef struct USB_STRUCT
{
    HANDLE              hWD;
    WD_USB_DEVICE_INFO  deviceInfo;
    DWORD               hDevice;
} USB_STRUCT;

void USB_RegisterWinDriver()
{
    HANDLE hWD;
    WD_LICENSE lic;

    hWD = WD_Open();
    if (hWD!=INVALID_HANDLE_VALUE)
    {
         strcpy(lic.cLicense, "68C9BECCEDE89D50638A21ECD7B87900.Warlock//SSG");
         WD_License(hWD, &lic);
         WD_Close(hWD);
    }
}

DWORD USB_CountDevices (DWORD dwVendorID, DWORD dwProductID)
{
    WD_VERSION ver;
    WD_USB_SCAN_DEVICES usbScan;
    HANDLE hWD;

    USB_RegisterWinDriver();

    hWD = WD_Open();
     // check whether the handle is valid & the version is OK
    if (hWD==INVALID_HANDLE_VALUE) 
    {
        sprintf (USB_ErrorString, "Failed opening WinDriver device\n");
        return 0;
    }

    BZERO(ver);
    WD_Version(hWD, &ver);
    if (ver.dwVer<WD_VER) 
    {
        sprintf (USB_ErrorString, "Incorrect WinDriver version\n");
        WD_Close (hWD);
        return 0;
    }

    BZERO(usbScan);
    usbScan.searchId.dwVendorId = dwVendorID;
    usbScan.searchId.dwProductId = dwProductID;  
    WD_UsbScanDevice(hWD,&usbScan);
    WD_Close (hWD);
    if (usbScan.dwDevices==0)
        sprintf (USB_ErrorString, "No devices found\n");
    return usbScan.dwDevices;
}


USB_HANDLE USB_Open(DWORD uniqueId, DWORD configIndex, DWORD dwInterface, DWORD dwAlternate)
{
    USB_HANDLE hUSB = (USB_HANDLE) malloc (sizeof (USB_STRUCT));

    WD_VERSION ver;
    WD_USB_DEVICE_REGISTER devReg;

    BZERO(*hUSB);

    USB_RegisterWinDriver();

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

    // check whether the handle is valid & the version is OK
    if (hUSB->hWD==INVALID_HANDLE_VALUE)
    {
        sprintf (USB_ErrorString, "Failed opening WinDriver device\n");
        free(hUSB);
        return NULL;
    }

    BZERO(ver);
    WD_Version(hUSB->hWD, &ver);
    if (ver.dwVer<WD_VER)
    {
        sprintf (USB_ErrorString, "Incorrect WinDriver version\n");
        WD_Close(hUSB->hWD);
        free(hUSB);
        return NULL;
    }

    BZERO(devReg);
    devReg.uniqueId = uniqueId;
    devReg.dwConfigurationIndex = configIndex;
    devReg.dwInterfaceNum = dwInterface;
    devReg.dwInterfaceAlternate = dwAlternate;
    WD_UsbDeviceRegister(hUSB->hWD, &devReg);
    if (!devReg.hDevice)
    {
        sprintf (USB_ErrorString, "Could not open device\n");
        WD_Close(hUSB->hWD);
        free(hUSB);
        return NULL;
    }
    hUSB->hDevice = devReg.hDevice;
    hUSB->deviceInfo = devReg.Device;

        // Open finished OK
        return hUSB;
    }

void USB_Close(USB_HANDLE hUSB)
{
    WD_USB_DEVICE_REGISTER devReg;

    BZERO(devReg);
    devReg.hDevice = hUSB->hDevice;
    WD_UsbDeviceUnregister(hUSB->hWD, &devReg);

    // close WinDriver
    WD_Close(hUSB->hWD);
    free (hUSB);
}

void USB_GetDeviceInfo(USB_HANDLE hUSB, WD_USB_DEVICE_INFO *pDevInfo)
{
    *pDevInfo = hUSB->deviceInfo;
}

BOOL USB_ResetPipe(USB_HANDLE hUSB, DWORD pipeNum)
{
    WD_USB_RESET_PIPE resetPipe;
    BZERO(resetPipe);
    resetPipe.hDevice = hUSB->hDevice;
    resetPipe.dwPipe = pipeNum;
    WD_UsbResetPipe(hUSB->hWD, &resetPipe);
    return TRUE;
}

void USB_ResetDevice(USB_HANDLE hUSB)
{
    WD_UsbResetDevice(hUSB->hWD, hUSB->hDevice);
}

DWORD USB_ReadPipe00(USB_HANDLE hUSB, PVOID pBuffer, DWORD dwSize, BYTE setupPacket[8])
{
    WD_USB_TRANSFER transfer;
    DWORD i;

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

    if (transfer.fOK)
        return transfer.dwBytesTransfered;
    return 0xffffffff;
}

DWORD USB_WritePipe00(USB_HANDLE hUSB, PVOID pBuffer, DWORD dwSize, BYTE setupPacket[8])
{
    WD_USB_TRANSFER transfer;
    DWORD i;

    BZERO(transfer);
    transfer.dwPipe = 0x00;
    transfer.dwBytes = dwSize;
    for (i=0; i<8; i++)
        transfer.SetupPacket[i] = setupPacket[i];
    transfer.pBuffer = pBuffer;
    transfer.hDevice = hUSB->hDevice;
    transfer.dwTimeout = 10000;
    WD_UsbTransfer(hUSB->hWD, &transfer);

    if (transfer.fOK)
        return transfer.dwBytesTransfered;
    return 0xffffffff;
}

void USB_StopTransferPipe00(USB_HANDLE hUSB)
{
    WD_USB_TRANSFER transfer;

    BZERO(transfer);
    transfer.dwPipe = 0x00;
    transfer.dwOptions = USB_TRANSFER_HALT;
    transfer.hDevice = hUSB->hDevice;
    WD_UsbTransfer(hUSB->hWD, &transfer);
}

DWORD USB_ReadPipe81(USB_HANDLE hUSB, PVOID pBuffer, DWORD dwSize)
{
    WD_USB_TRANSFER transfer;

    BZERO(transfer);
    transfer.dwPipe = 0x81;
    transfer.dwBytes = dwSize;
    transfer.fRead = TRUE;
    transfer.pBuffer = pBuffer;
    transfer.hDevice = hUSB->hDevice;
    transfer.dwTimeout = 300000;
    WD_UsbTransfer(hUSB->hWD, &transfer);

    if (transfer.fOK)
        return transfer.dwBytesTransfered;
    return 0xffffffff;
}

void USB_StopTransferPipe81(USB_HANDLE hUSB)
{
    WD_USB_TRANSFER transfer;

    BZERO(transfer);
    transfer.dwPipe = 0x81;
    transfer.dwOptions = USB_TRANSFER_HALT;
    transfer.hDevice = hUSB->hDevice;
    WD_UsbTransfer(hUSB->hWD, &transfer);
}

⌨️ 快捷键说明

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