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

📄 osrbulk.cpp

📁 USBFX2LK WDM drive for OSR s USB FX2 Learning Kit
💻 CPP
📖 第 1 页 / 共 3 页
字号:
                ReadLen = atoi(&argv[i+1][0]);
                WriteLen = ReadLen;
                fWrite = TRUE;
                fRead = TRUE;
                i++;
                break;
            case 'c':
            case 'C':
                IterationCount = atoi(&argv[i+1][0]);
                i++;
                break;
            case 'u':
            case 'U':
                fDumpUsbConfig = TRUE;
                i++;
                break;
            case 'v':
            case 'V':
                fDumpReadData = TRUE;
                i++;
                break;
            default:
                usage();
                }
            }
    }
}

/*++
Routine Description:

Called to verify read and write buffers match for loopback test

Arguments:

buffers to compare and length

Return Value:

TRUE if buffers match, else FALSE

--*/
BOOL compare_buffs(char *buff1, char *buff2, int length)
{
    int ok = 1;

    if (memcmp(buff1, buff2, length )) {

        // Edi, and Esi point to the mismatching char and ecx indicates the
        // remaining length.
        ok = 0;
    }


    return ok;
}

///////////////////////////////////////////////////////////////////////////////
//
// Dump
//
//  Called to do formatted ascii dump to console from io buffer.
//
//  INPUTS:
//
//      b  -  Address of buffer
//      len - length
//
//  OUTPUTS:
//
//      None
//
//  RETURNS:
//
//      None
//
//  NOTES:
//
///////////////////////////////////////////////////////////////////////////////
void Dump(CHAR *b,int len)
     /*++
     Routine Description:

     Called to do formatted ascii dump to console of the io buffer

     Arguments:

     buffer and length

     Return Value:

     none

     --*/
{
    ULONG i;
    ULONG longLen = (ULONG)len / sizeof( ULONG );
    PULONG pBuf = (PULONG) b;

    // dump an ordinal ULONG for each sizeof(ULONG)'th byte
    printf("\n****** BEGIN DUMP LEN decimal %d, 0x%x\n", len,len);
    for (i=0; i<longLen; i++) {
        printf("%04X ", *pBuf++);
        if (i % NPERLN == (NPERLN - 1)) {
            printf("\n");
        }
    }
    if (i % NPERLN != 0) {
        printf("\n");
    }
    printf("\n****** END DUMP LEN decimal %d, 0x%x\n", len,len);
}





// Begin, routines for USB configuration dump (Cmdline "rwbulk -u" )


/*++
Routine Description:

Called to get ascii string of USB descriptor

Arguments:

PUSB_ENDPOINT_DESCRIPTOR->bDescriptorType or
PUSB_DEVICE_DESCRIPTOR->bDescriptorType or
PUSB_INTERFACE_DESCRIPTOR->bDescriptorType or
PUSB_STRING_DESCRIPTOR->bDescriptorType or
PUSB_POWER_DESCRIPTOR->bDescriptorType or
PUSB_CONFIGURATION_DESCRIPTOR->bDescriptorType

Return Value:

ptr to string

--*/
char *usbDescriptorTypeString(UCHAR bDescriptorType )
{

switch(bDescriptorType) {

        case USB_DEVICE_DESCRIPTOR_TYPE:
            return "USB_DEVICE_DESCRIPTOR_TYPE";

        case USB_CONFIGURATION_DESCRIPTOR_TYPE:
            return "USB_CONFIGURATION_DESCRIPTOR_TYPE";


        case USB_STRING_DESCRIPTOR_TYPE:
            return "USB_STRING_DESCRIPTOR_TYPE";


        case USB_INTERFACE_DESCRIPTOR_TYPE:
            return "USB_INTERFACE_DESCRIPTOR_TYPE";


        case USB_ENDPOINT_DESCRIPTOR_TYPE:
            return "USB_ENDPOINT_DESCRIPTOR_TYPE";


#ifdef USB_POWER_DESCRIPTOR_TYPE // this is the older definintion which is actually obsolete
            // workaround for temporary bug in 98ddk, older USB100.h file
        case USB_POWER_DESCRIPTOR_TYPE:
            return "USB_POWER_DESCRIPTOR_TYPE";
#endif

#ifdef USB_RESERVED_DESCRIPTOR_TYPE  // this is the current version of USB100.h as in NT5DDK

        case USB_RESERVED_DESCRIPTOR_TYPE:
            return "USB_RESERVED_DESCRIPTOR_TYPE";

        case USB_CONFIG_POWER_DESCRIPTOR_TYPE:
            return "USB_CONFIG_POWER_DESCRIPTOR_TYPE";

        case USB_INTERFACE_POWER_DESCRIPTOR_TYPE:
            return "USB_INTERFACE_POWER_DESCRIPTOR_TYPE";
#endif // for current nt5ddk version of USB100.h

        default:
            return "??? UNKNOWN!!"; 
}
}


/*++
Routine Description:

Called to get ascii string of endpt descriptor type

Arguments:

PUSB_ENDPOINT_DESCRIPTOR->bmAttributes

Return Value:

ptr to string

--*/
char *usbEndPointTypeString(UCHAR bmAttributes)
{
    UINT typ = bmAttributes & USB_ENDPOINT_TYPE_MASK;


    switch( typ) {
        case USB_ENDPOINT_TYPE_INTERRUPT:
            return "USB_ENDPOINT_TYPE_INTERRUPT";

        case USB_ENDPOINT_TYPE_BULK:
            return "USB_ENDPOINT_TYPE_BULK";        

        case USB_ENDPOINT_TYPE_ISOCHRONOUS:
            return "USB_ENDPOINT_TYPE_ISOCHRONOUS"; 

        case USB_ENDPOINT_TYPE_CONTROL:
            return "USB_ENDPOINT_TYPE_CONTROL";     

        default:
            return "??? UNKNOWN!!"; 
    }
}


/*++
Routine Description:

Called to get ascii string of USB_CONFIGURATION_DESCRIPTOR attributes

Arguments:

PUSB_CONFIGURATION_DESCRIPTOR->bmAttributes

Return Value:

ptr to string

--*/
char *usbConfigAttributesString(UCHAR bmAttributes)
{
    UINT typ = bmAttributes & USB_CONFIG_POWERED_MASK;
    static CHAR usbAttributesBuffer[256];

    memset(usbAttributesBuffer,0,sizeof(usbAttributesBuffer));

    switch( typ) {

        case USB_CONFIG_BUS_POWERED:
            strcat(usbAttributesBuffer,"USB_CONFIG_BUS_POWERED");
            break;

        case USB_CONFIG_SELF_POWERED:
            strcat(usbAttributesBuffer,"USB_CONFIG_SELF_POWERED");
            break;

        default:
            break;

    }

    if(bmAttributes & USB_CONFIG_REMOTE_WAKEUP) {
        strcat(usbAttributesBuffer," USB_CONFIG_REMOTE_WAKEUP");
    }

    return usbAttributesBuffer;
}


/*++
Routine Description:

Called to do formatted ascii dump to console of a USB config descriptor

Arguments:

ptr to USB configuration descriptor

Return Value:

none

--*/
void print_USB_CONFIGURATION_DESCRIPTOR(PUSB_CONFIGURATION_DESCRIPTOR cd)
{
    printf("\n===================\nUSB_CONFIGURATION_DESCRIPTOR\n");

    printf(
        "bLength = 0x%x, decimal %d\n", cd->bLength, cd->bLength
        );

    printf(
        "bDescriptorType = 0x%x ( %s )\n", cd->bDescriptorType, usbDescriptorTypeString( cd->bDescriptorType )
        );

    printf(
        "wTotalLength = 0x%x, decimal %d\n", cd->wTotalLength, cd->wTotalLength
        );

    printf(
        "bNumInterfaces = 0x%x, decimal %d\n", cd->bNumInterfaces, cd->bNumInterfaces
        );

    printf(
        "bConfigurationValue = 0x%x, decimal %d\n", cd->bConfigurationValue, cd->bConfigurationValue
        );

    printf(
        "iConfiguration = 0x%x, decimal %d\n", cd->iConfiguration, cd->iConfiguration
        );

    printf(
        "bmAttributes = 0x%x ( %s )\n", cd->bmAttributes, usbConfigAttributesString( cd->bmAttributes )
        );

    printf(
        "MaxPower = 0x%x, decimal %d\n", cd->MaxPower, cd->MaxPower
        );
}


/*++
Routine Description:

Called to do formatted ascii dump to console of a USB interface descriptor

Arguments:

ptr to USB interface descriptor

Return Value:

none

--*/
void print_USB_INTERFACE_DESCRIPTOR(PUSB_INTERFACE_DESCRIPTOR id, UINT ix)
{
    printf("\n-----------------------------\nUSB_INTERFACE_DESCRIPTOR #%d\n", ix);


    printf(
        "bLength = 0x%x\n", id->bLength
        );


    printf(
        "bDescriptorType = 0x%x ( %s )\n", id->bDescriptorType, usbDescriptorTypeString( id->bDescriptorType )
        );


    printf(
        "bInterfaceNumber = 0x%x\n", id->bInterfaceNumber
        );
    printf(
        "bAlternateSetting = 0x%x\n", id->bAlternateSetting
        );
    printf(
        "bNumEndpoints = 0x%x\n", id->bNumEndpoints
        );
    printf(
        "bInterfaceClass = 0x%x\n", id->bInterfaceClass
        );
    printf(
        "bInterfaceSubClass = 0x%x\n", id->bInterfaceSubClass
        );
    printf(
        "bInterfaceProtocol = 0x%x\n", id->bInterfaceProtocol
        );
    printf(
        "bInterface = 0x%x\n", id->iInterface
        );
}
/*++
Routine Description:

Called to do formatted ascii dump to console of a USB pipe information

Arguments:

ptr to USB pipe information

Return Value:

none

--*/
void print_USBD_PIPE_INFORMATION(PUSBD_PIPE_INFORMATION PipeInfo,ULONG PipeNumber)
{
    PUCHAR text;
    printf("\n-----------------------------\nUSBD_PIPE_INFORMATION #%d\n", PipeNumber);

    printf(
        "MaximumPacketSize = 0x%x\n", PipeInfo->MaximumPacketSize
    );
    printf(
        "EndpointAddress = 0x%x\n", PipeInfo->EndpointAddress
    );
    printf(
        "Interval = 0x%x\n", PipeInfo->Interval
    );
    switch(PipeInfo->PipeType) {
        case UsbdPipeTypeControl:
            text = (PUCHAR) "UsbdPipeTypeControl";
            break;
        case UsbdPipeTypeIsochronous:
            text = (PUCHAR) "UsbdPipeTypeIsochronous";
            break;
        case UsbdPipeTypeBulk:
            text = (PUCHAR) "UsbdPipeTypeBulk";
            break;
        case UsbdPipeTypeInterrupt:
            text = (PUCHAR) "UsbdPipeTypeInterrupt";
            break;
    }
    printf(
        "PipeType = 0x%x %s\n", PipeInfo->PipeType,text
    );
    printf(
        "PipeHandle = 0x%p\n", PipeInfo->PipeHandle
    );
    printf(
        "MaximumTransferSize = 0x%x\n", PipeInfo->MaximumPacketSize
    );

}

/*++
Routine Description:

Called to do formatted ascii dump to console of a USB interface information

Arguments:

ptr to USB interface information

Return Value:

none

--*/
void print_USBD_INTERFACE_INFORMATION(PUSBD_INTERFACE_INFORMATION InterfaceInformation)
{
    printf("\n-----------------------------\nUSBD_INTERFACE_INFORMATION\n");


    printf(
        "Length = 0x%x\n", InterfaceInformation->Length
        );


    printf(
        "InterfaceNumber = 0x%x\n", InterfaceInformation->InterfaceNumber
        );


    printf(
        "AlternateSetting = 0x%x\n", InterfaceInformation->AlternateSetting
        );
    printf(
        "Class = 0x%x\n", InterfaceInformation->Class
        );
    printf(
        "SubClass = 0x%x\n", InterfaceInformation->SubClass
        );
    printf(
        "Protocol = 0x%x\n", InterfaceInformation->Protocol
        );
    printf(
        "InterfaceHandle = 0x%p\n", InterfaceInformation->InterfaceHandle
        );
    printf(
        "NumberofPipes = 0x%x\n", InterfaceInformation->NumberOfPipes
        );
    for(ULONG index = 0; index < InterfaceInformation->NumberOfPipes; index++) {
        print_USBD_PIPE_INFORMATION(&InterfaceInformation->Pipes[index],index);
    }
}

/*++
Routine Description:

⌨️ 快捷键说明

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