📄 rwiso.c
字号:
printf("-u to dump USB configuration and pipe info \n");
printf("-g [s] Run Isochronous test stream for 's' seconds \n");
}
void
parse(
int argc,
char *argv[] )
/*++
Routine Description:
Called by main() to parse command line parms
Arguments:
argc and argv that was passed to main()
Return Value:
Sets global flags as per user function request
--*/
{
int i;
if ( argc < 2 ) // give usage if invoked with no parms
usage();
for (i=0; i<argc; i++) {
if (argv[i][0] == '-' ||
argv[i][0] == '/') {
switch(argv[i][1]) {
case 'r':
case 'R':
ReadLen = atoi(&argv[i+1][0]);
fRead = TRUE;
i++;
break;
case 'w':
case 'W':
WriteLen = atoi(&argv[i+1][0]);
fWrite = TRUE;
i++;
break;
case 'c':
case 'C':
IterationCount = atoi(&argv[i+1][0]);
i++;
break;
case 'i':
case 'I':
strcpy(inPipe, &argv[i+1][0]);
i++;
break;
case 'u':
case 'U':
fDumpUsbConfig = TRUE;
i++;
break;
case 'v':
case 'V':
fDumpReadData = TRUE;
i++;
break;
case 'o':
case 'O':
strcpy(outPipe, &argv[i+1][0]);
i++;
break;
case 'g':
case 'G':
gMS = 1000 * atoi(&argv[i+1][0]);
StartIsoStream();
break;
case 'x':
case 'X':
StopIsoStream();
break;
default:
usage();
}
}
}
}
BOOL
compare_buffs(char *buff1, char *buff2, int length)
/*++
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
--*/
{
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;
}
#define NPERLN 8
void
dump(
UCHAR *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 "rwiso -u" )
char
*usbDescriptorTypeString(UCHAR bDescriptorType )
/*++
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
--*/{
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!!";
}
}
char
*usbEndPointTypeString(UCHAR bmAttributes)
/*++
Routine Description:
Called to get ascii string of endpt descriptor type
Arguments:
PUSB_ENDPOINT_DESCRIPTOR->bmAttributes
Return Value:
ptr to string
--*/
{
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!!";
}
}
char
*usbConfigAttributesString(UCHAR bmAttributes)
/*++
Routine Description:
Called to get ascii string of USB_CONFIGURATION_DESCRIPTOR attributes
Arguments:
PUSB_CONFIGURATION_DESCRIPTOR->bmAttributes
Return Value:
ptr to string
--*/
{
UINT typ = bmAttributes & USB_CONFIG_POWERED_MASK;
switch( typ) {
case USB_CONFIG_BUS_POWERED:
return "USB_CONFIG_BUS_POWERED";
case USB_CONFIG_SELF_POWERED:
return "USB_CONFIG_SELF_POWERED";
case USB_CONFIG_REMOTE_WAKEUP:
return "USB_CONFIG_REMOTE_WAKEUP";
default:
return "??? UNKNOWN!!";
}
}
void
print_USB_CONFIGURATION_DESCRIPTOR(PUSB_CONFIGURATION_DESCRIPTOR cd)
/*++
Routine Description:
Called to do formatted ascii dump to console of a USB config descriptor
Arguments:
ptr to USB configuration descriptor
Return Value:
none
--*/
{
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
);
}
void
print_USB_INTERFACE_DESCRIPTOR(PUSB_INTERFACE_DESCRIPTOR id, UINT ix)
/*++
Routine Description:
Called to do formatted ascii dump to console of a USB interface descriptor
Arguments:
ptr to USB interface descriptor
Return Value:
none
--*/
{
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
);
}
void
print_USB_ENDPOINT_DESCRIPTOR(PUSB_ENDPOINT_DESCRIPTOR ed, int i)
/*++
Routine Description:
Called to do formatted ascii dump to console of a USB endpoint descriptor
Arguments:
ptr to USB endpoint descriptor,
index of this endpt in interface desc
Return Value:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -