📄 usbapp.c
字号:
#include <windows.h>
#include <winioctl.h>
#include <process.h>
#include <stdio.h>
#include <time.h>
#include <usb100.h>
#include <usbdi.h>
#include "usbdriver.h"
#include "resource.h"
#include "main.h"
BOOL UsbOpenDriver (HANDLE *phDeviceHandle, PCHAR devicename)
{
char completeDeviceName[64] = "";
strcat (completeDeviceName,"\\\\.\\");
strcat (completeDeviceName,devicename);
*phDeviceHandle = CreateFile(completeDeviceName,
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
if (*phDeviceHandle == INVALID_HANDLE_VALUE)
return (FALSE);
else
return (TRUE);
}
void FillBuffer(PUCHAR buffer, PUCHAR value, int length)
{
int i;
for (i = 0; i < length; i++) {
if(*value>255)
value=0;
buffer[i] = *value;
if (TestValueIncrement==TRUE)
(*value)++;
}
}
BOOL BufferHasErrors(PUCHAR buffer, PUCHAR value, int length)
{
int i;
for (i = 0; i < length; i++) {
if (buffer[i] != ((~(*value)) & 0xFF)) {
return TRUE;
}
if (TestValueIncrement==TRUE)
(*value)++;
}
return FALSE;
}
void TransferThread( PTHREAD_CONTROL threadControl)
{
threadControl->status = DeviceIoControl (threadControl->hDevice,
threadControl->Ioctl,
threadControl->InBuffer,
threadControl->InBufferSize,
threadControl->OutBuffer,
threadControl->OutBufferSize,
&threadControl->BytesReturned,
NULL);
if (threadControl->completionEvent)
SetEvent(threadControl->completionEvent);
return;
}
void TestThread(LPVOID lpParameter) {
HWND hDlg = (HWND) lpParameter;
Testing=TRUE;
{
HWND hOutList;
HWND hTestList;
int nItems = 0;
char DeviceName[MAX_DEVICE_NAME] = "";
char tempbuff[512];
char buff[512];
char temp[512];
UCHAR outValue;
BOOL preCheckedList=TRUE;
BOOL preCheckedTest=TRUE;
time_t StartTime,CurrentTime,CountTime;
DWORD pass=0;
unsigned long i,j;
unsigned long MaxTransferSize, CurrentTransferSize;
unsigned long InPipeNum;
unsigned long OutPipeNum;
HANDLE hInDevice = NULL;
HANDLE hOutDevice = NULL;
unsigned char * inBuffer = NULL;
unsigned char * outBuffer = NULL;
HANDLE ReadCompleteEvent;
HANDLE WriteCompleteEvent;
BULK_TRANSFER_CONTROL inBulkControl,outBulkControl;
THREAD_CONTROL inThreadControl,outThreadControl;
time( &StartTime);
hOutList = GetDlgItem (hDlg, IDC_OUTPUT_LIST);
hTestList = GetDlgItem (hDlg, IDC_TEST_LIST);
SendMessage (hOutList, LB_SETHORIZONTALEXTENT,1500,0);
SendMessage (hTestList, LB_SETHORIZONTALEXTENT,3500,0);
GetDlgItemText (hDlg, IDC_DEVICE_NAME, DeviceName, MAX_DEVICE_NAME);
if (UsbOpenDriver (&hInDevice, DeviceName) != TRUE) {
MessageBox(hDlg, "无效设备,请重试!","错误",MB_ICONERROR);
Testing=FALSE;
return;
}
if (UsbOpenDriver (&hOutDevice, DeviceName) != TRUE) {
MessageBox(hDlg, "无效设备,请重试!","错误",MB_ICONERROR);
Testing=FALSE;
return;
}
SetDlgItemText (hDlg, IDC_INFORMATION, "测试-块传输(Bulk Transfer):");
SendMessage (hOutList, LB_RESETCONTENT, 0, 0);
SendMessage (hTestList, LB_RESETCONTENT, 0, 0);
if(End24Radio) {
InPipeNum = 2;
OutPipeNum = 0;
}
else {
InPipeNum = 3;
OutPipeNum = 1;
}
sprintf(tempbuff,"IN PIPE = %d OUT PIPE = %d",InPipeNum,OutPipeNum);
SendMessage (hOutList, LB_ADDSTRING, 0, (LPARAM)tempbuff);
MaxTransferSize = 8192;
CurrentTransferSize = MaxTransferSize;
outBuffer = malloc(MaxTransferSize);
inBuffer = malloc(MaxTransferSize);
pass=0;
SetDlgItemInt(hDlg,IDC_TEST_PASS,pass,FALSE);
ReadCompleteEvent = CreateEvent(0,FALSE,FALSE,NULL);
WriteCompleteEvent = CreateEvent(0,FALSE,FALSE,NULL);
outValue = TestValue;
CurrentTransferSize = PacketSize;
while (!StopTest)
{
FillBuffer(&outBuffer[0], &outValue, CurrentTransferSize);
memset(inBuffer, 0, MaxTransferSize);
inBulkControl.pipeNum = InPipeNum;
inThreadControl.hDevice = hInDevice;
inThreadControl.Ioctl = IOCTL_EZUSB_BULK_READ;
inThreadControl.InBuffer = (PVOID)&inBulkControl;
inThreadControl.InBufferSize = sizeof(BULK_TRANSFER_CONTROL);
inThreadControl.OutBuffer = inBuffer;
inThreadControl.OutBufferSize = CurrentTransferSize;
inThreadControl.completionEvent = ReadCompleteEvent;
inThreadControl.status = FALSE;
inThreadControl.BytesReturned = 0;
outBulkControl.pipeNum = OutPipeNum;
outThreadControl.hDevice = hOutDevice;
outThreadControl.Ioctl = IOCTL_EZUSB_BULK_WRITE;
outThreadControl.InBuffer = (PVOID)&outBulkControl;
outThreadControl.InBufferSize = sizeof(BULK_TRANSFER_CONTROL);
outThreadControl.OutBuffer = outBuffer;
outThreadControl.OutBufferSize = CurrentTransferSize;
outThreadControl.completionEvent = WriteCompleteEvent;
outThreadControl.status = FALSE;
outThreadControl.BytesReturned = 0;
_beginthread(TransferThread,0,&inThreadControl);
_beginthread(TransferThread,0,&outThreadControl);
WaitForSingleObject(ReadCompleteEvent,INFINITE);
WaitForSingleObject(WriteCompleteEvent,INFINITE);
if (!inThreadControl.status) {
sprintf(tempbuff,"IN传输数据量错误,管道%d!",InPipeNum);
MessageBox(hDlg, tempbuff,"错误",MB_ICONERROR);
StopTest = TRUE;
}
if (!outThreadControl.status) {
sprintf(tempbuff,"OUT块传输失败,管道%d!",OutPipeNum);
MessageBox(hDlg, tempbuff,"错误",MB_ICONERROR);
StopTest = TRUE;
}
if (inThreadControl.BytesReturned != CurrentTransferSize) {
sprintf(tempbuff,"IN传输数据量错误,管道%d!",InPipeNum);
MessageBox(hDlg, tempbuff,"错误",MB_ICONERROR);
StopTest = TRUE;
}
for (i=0;i<CurrentTransferSize;i++) {
if (inBuffer[i] != outBuffer[i]) {
MessageBox(hDlg, "读写数据不一致!","错误",MB_ICONINFORMATION);
StopTest = TRUE;
}
}
if (IsDlgButtonChecked(hDlg,IDC_LIST_DETAIL) == BST_CHECKED) {
sprintf (buff, "测试%d:写%d字节,管道%d",pass+1,CurrentTransferSize,OutPipeNum);
sprintf (temp, ";读%d字节,管道%d.",inThreadControl.BytesReturned,InPipeNum);
strcat(buff,temp);
if(preCheckedList==FALSE) {
SendMessage (hOutList, LB_RESETCONTENT, 0, 0);
SendMessage (hOutList, LB_ADDSTRING, 0, (LPARAM)buff);
}
else
SendMessage (hOutList, LB_ADDSTRING, 0, (LPARAM)buff);
}
if(IsDlgButtonChecked(hDlg,IDC_LIST_DETAIL) == BST_CHECKED)
preCheckedList=TRUE;
else
preCheckedList=FALSE;
if (IsDlgButtonChecked(hDlg,IDC_TEST_DETAIL) == BST_CHECKED) {
sprintf (tempbuff, "测试:%d 写 [0]:%d",pass+1,outBuffer[0]);
for(j=1;j<10;j++) {
sprintf (temp, " [%d]:%d",j,outBuffer[j]);
strcat(tempbuff,temp);
}
if(preCheckedTest==FALSE) {
SendMessage (hTestList, LB_RESETCONTENT, 0, 0);
SendMessage (hTestList, LB_ADDSTRING, 0, (LPARAM)tempbuff);
preCheckedTest=TRUE;
}
else
SendMessage (hTestList, LB_ADDSTRING, 0, (LPARAM)tempbuff);
}
if (IsDlgButtonChecked(hDlg,IDC_TEST_DETAIL) == BST_CHECKED) {
wsprintf (tempbuff, "测试:%d 读 [0]:%d",pass+1,inBuffer[0]);
for(j=1;j<10;j++) {
wsprintf (temp, " [%d]:%d",j,inBuffer[j]);
strcat(tempbuff,temp);
}
if(preCheckedTest==FALSE) {
SendMessage (hTestList, LB_RESETCONTENT, 0, 0);
SendMessage (hTestList, LB_ADDSTRING, 0, (LPARAM)tempbuff);
preCheckedTest=TRUE;
}
else
SendMessage (hTestList, LB_ADDSTRING, 0, (LPARAM)tempbuff);
}
if(IsDlgButtonChecked(hDlg,IDC_TEST_DETAIL) == BST_CHECKED)
preCheckedTest=TRUE;
else
preCheckedTest=FALSE;
if (PacketSizeIncrement == TRUE) {
CurrentTransferSize++;
if (CurrentTransferSize > MaxTransferSize)
CurrentTransferSize = PacketSize;
}
pass++;
SetDlgItemInt(hDlg,IDC_TEST_PASS,pass,FALSE);
time(&CurrentTime);
CountTime=CurrentTime-StartTime+3600*16;
sprintf(tempbuff,"%.8s",ctime( &CountTime )+11);
SetDlgItemText (hDlg, IDC_TEST_TIME,tempbuff);
MAINTAIN_OUTPUT_LIST (hOutList, nItems);
MAINTAIN_OUTPUT_LIST (hTestList, nItems);
}
free(inBuffer);
free(outBuffer);
CloseHandle(hInDevice);
CloseHandle(hOutDevice);
Testing=FALSE;
StopTest = FALSE;
PacketSize=10;
PacketSizeIncrement=TRUE;
TestValue = 10;
TestValueIncrement=FALSE;
SendMessage (hOutList, LB_ADDSTRING,0, (LPARAM)"块传输测试结束!");
return;
}
}
void OpenDeviceTest(HWND hdlg)
{
if (Testing ==TRUE) {
MessageBox(hdlg, "测试中,请先退出当前测试,再连接设备!","警告",MB_ICONINFORMATION);
return;
}
Testing=TRUE;
{
HANDLE hDevice=NULL;
HWND htestlist;
char DeviceName[MAX_DEVICE_NAME] = "";
htestlist = GetDlgItem (hdlg, IDC_TEST_LIST);
GetDlgItemText (hdlg, IDC_DEVICE_NAME, DeviceName, MAX_DEVICE_NAME);
if (UsbOpenDriver (&hDevice, DeviceName) != TRUE)
MessageBox(hdlg, "无效设备,请重试!","错误",MB_ICONERROR);
else {
SendMessage (htestlist, LB_RESETCONTENT, 0, 0);
SendMessage (htestlist, LB_ADDSTRING,0, (LPARAM)"连接设备已成功!");
CloseHandle(hDevice);
}
Testing=FALSE;
return;
}
}
void GetDeviceDescriptorTest(HWND hdlg)
{
if (Testing ==TRUE) {
MessageBox(hdlg, "测试中,请先退出当前测试,再读取描述符!","警告",MB_ICONINFORMATION);
return;
}
Testing=TRUE;
{
HANDLE hDevice=NULL;
HWND houtputlist;
HWND htestlist;
BOOL bResult = FALSE;
ULONG nBytes;
char DeviceName[MAX_DEVICE_NAME] = "";
char tempbuff[18][256];
int i;
USB_DEVICE_DESCRIPTOR output;
houtputlist = GetDlgItem (hdlg, IDC_OUTPUT_LIST);
htestlist = GetDlgItem (hdlg, IDC_TEST_LIST);
GetDlgItemText (hdlg, IDC_DEVICE_NAME, DeviceName, MAX_DEVICE_NAME);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -