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

📄 usbapp.c

📁 | Target | | 芯片固件程序 | keil C51 uVision2 | Windows98 | Loader | USB2.0接口 | loader.sys设备驱动程序
💻 C
📖 第 1 页 / 共 3 页
字号:
#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 + -