USB应用程序开发.docx

上传人:b****1 文档编号:2462268 上传时间:2023-05-03 格式:DOCX 页数:17 大小:38.10KB
下载 相关 举报
USB应用程序开发.docx_第1页
第1页 / 共17页
USB应用程序开发.docx_第2页
第2页 / 共17页
USB应用程序开发.docx_第3页
第3页 / 共17页
USB应用程序开发.docx_第4页
第4页 / 共17页
USB应用程序开发.docx_第5页
第5页 / 共17页
USB应用程序开发.docx_第6页
第6页 / 共17页
USB应用程序开发.docx_第7页
第7页 / 共17页
USB应用程序开发.docx_第8页
第8页 / 共17页
USB应用程序开发.docx_第9页
第9页 / 共17页
USB应用程序开发.docx_第10页
第10页 / 共17页
USB应用程序开发.docx_第11页
第11页 / 共17页
USB应用程序开发.docx_第12页
第12页 / 共17页
USB应用程序开发.docx_第13页
第13页 / 共17页
USB应用程序开发.docx_第14页
第14页 / 共17页
USB应用程序开发.docx_第15页
第15页 / 共17页
USB应用程序开发.docx_第16页
第16页 / 共17页
USB应用程序开发.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

USB应用程序开发.docx

《USB应用程序开发.docx》由会员分享,可在线阅读,更多相关《USB应用程序开发.docx(17页珍藏版)》请在冰点文库上搜索。

USB应用程序开发.docx

USB应用程序开发

USB应用程序开发

 

1前言

USB开发跟其他文件设备(如串口)开发一样,难点是找到该USB设备的路径,本文以DDK里src/usb/bulkusb例子为参考,阐述一个非HID的USB调试器软件的开发过程。

2设备GUID

一般设备会有两个GUID,一个为ClassGUID,在INF文件中,另一个为DeviceGUID,在SYS文件中。

CreateFile使用的是SYS中的GUID,想得到它有两个办法:

1跟设备的提供者索要。

2在注册表里找,一般在:

HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001/Control/DeviceClasses/

3设备路径

根据设备GUID,枚举所有USB HOST,找匹配的USB设备,然后获取其路径。

3.1头文件usbport.h

#defineWINVER0x0500

#include

#include

#include

#include

#include

#include

 

#pragmacomment(lib,"setupapi.lib")

#pragmacomment(lib,"hid.lib")

#pragmacomment(lib,"comctl32.lib")

 

#ifndefBULKUSBH_INC

#defineBULKUSBH_INC

 

#defineBULKUSB_IOCTL_INDEX 0x0000

 

 

#defineIOCTL_BULKUSB_GET_CONFIG_DESCRIPTOR    CTL_CODE(FILE_DEVICE_UNKNOWN, /

                                                  BULKUSB_IOCTL_INDEX,/

                                                  METHOD_BUFFERED, /

                                                  FILE_ANY_ACCESS)

                                                  

#defineIOCTL_BULKUSB_RESET_DEVICE  CTL_CODE(FILE_DEVICE_UNKNOWN, /

                                                  BULKUSB_IOCTL_INDEX+1,/

                                                  METHOD_BUFFERED, /

                                                  FILE_ANY_ACCESS)                                                             

                                                  

#defineIOCTL_BULKUSB_RESET_PIPE CTL_CODE(FILE_DEVICE_UNKNOWN, /

                                                  BULKUSB_IOCTL_INDEX+2,/

                                                  METHOD_BUFFERED, /

                                                  FILE_ANY_ACCESS)            

externHANDLE           open_file(char*filename);

externint             GetUsbPath(char*path);

externint              WriteUsb(HANDLEhUsb,char*Outbuff,intlen);

externint              ReadUsb(HANDLEhUsb,BYTEinbuff[],DWORD&nBytesRead,intnToRead);

3.2源文件usbport.cpp

#include"usbport.h"

 

//8a3bf75d-83c7-440e-8276-5ae3f3ea6e77

DEFINE_GUID(GUID_CLASS_I82930_BULK,0x8a3bf75d,0x83c7,0x440e,0x82,0x76,0x5a,0xe3,0xf3,0xea,0x6e,0x77);

 

BOOL           GetUsbDeviceFileName(LPGUID pGuid,char*outNameBuf);

HANDLE       OpenUsbDevice(LPGUID pGuid,char*outNameBuf);

HANDLE       OpenOneDevice(HDEVINFO HardwareDeviceInfo,PSP_INTERFACE_DEVICE_DATA  DeviceInfoData,char*devName);

int                 GetUsbPath(char*path);

int                 WriteUsb(HANDLEhUsb,char*Outbuff,intlen);

int                 ReadUsb(HANDLEhUsb,BYTEinbuff[],DWORD&nBytesRead,intnToRead);

 

/*名称:

open_file

 功能:

打开USB设备

 参数:

filename定义为”PIPE00”pipenameforbulkinputpipeonourtestboard ,”PIPE01”pipenameforbulkoutputpipeonourtestboard。

PIPE00和PIPE01 是参考src/usb/bulkusb,我实际在用时这两个效果一样,为了避免USB异常引起的死机,我文件打开采用非阻塞模式。

*/

HANDLEopen_file(char*filename)

{

 

      intsuccess=1;

      HANDLEh;

      charcompleteDeviceName[256]=""; //generatedfromtheGUIDregisteredbythedriveritself

 

      if(!

GetUsbDeviceFileName((LPGUID)&GUID_CLASS_I82930_BULK,completeDeviceName))

      {

             //NOISY(("FailedtoGetUsbDeviceFileName/n",GetLastError()));

             return INVALID_HANDLE_VALUE;

      }

 

   strcat(completeDeviceName,      "//");                    

 

   strcat(completeDeviceName,      filename);                                  

 

      //printf("completeDeviceName=(%s)/n",completeDeviceName);

 

      h=CreateFile(completeDeviceName,

             GENERIC_WRITE|GENERIC_READ,

             FILE_SHARE_WRITE|FILE_SHARE_READ,

             NULL,

             OPEN_EXISTING,

             FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,

             NULL);

 

      if(h==INVALID_HANDLE_VALUE){

             //NOISY(("Failedtoopen(%s)=%d",completeDeviceName,GetLastError()));

             success=0;

      }else{

                    //NOISY(("Openedsuccessfully./n"));

   }           

 

      returnh;

}

/*名称:

GetUsbDeviceFileName

 功能:

获取USB设备路径

 参数:

pGUID

 返回:

outNameBufUSB设备路径

*/

BOOLGetUsbDeviceFileName(LPGUID pGuid,char*outNameBuf)

{

      HANDLEhDev=OpenUsbDevice(pGuid,outNameBuf);

      if(hDev!

=INVALID_HANDLE_VALUE)

      {

             CloseHandle(hDev);

             returnTRUE;

      }

      returnFALSE;

 

}

/*名称:

OpenUsbDevice

 功能:

获取USB设备路径

 参数:

pGUID设备GUID

 返回:

outNameBufUSB设备路径

*/

HANDLEOpenUsbDevice(LPGUID pGuid,char*outNameBuf)

{

  ULONGNumberDevices;

  HANDLEhOut=INVALID_HANDLE_VALUE;

  HDEVINFO                hardwareDeviceInfo;

  SP_INTERFACE_DEVICE_DATAdeviceInfoData;

  ULONG                   i;

  BOOLEAN                 done;

  PUSB_DEVICE_DESCRIPTOR  usbDeviceInst;

  PUSB_DEVICE_DESCRIPTOR  *UsbDevices=&usbDeviceInst;

 

  *UsbDevices=NULL;

  NumberDevices=0;

 

  //

  //Openahandletotheplugandplaydevnode.

  //SetupDiGetClassDevs()returnsadeviceinformationsetthatcontainsinfoonall

  //installeddevicesofaspecifiedclass.

  //

  hardwareDeviceInfo=SetupDiGetClassDevs(

                          pGuid,

                          NULL,//Definenoenumerator(global)

                          NULL,//Defineno

                          (DIGCF_PRESENT|//OnlyDevicespresent

                           DIGCF_INTERFACEDEVICE));//Functionclassdevices.

 

  //

  //Takeawildguessatthenumberofdeviceswehave;

  //Bepreparedtoreallocandretryiftherearemorethanweguessed

  //

  NumberDevices=4;

  done=FALSE;

  deviceInfoData.cbSize=sizeof(SP_INTERFACE_DEVICE_DATA);

 

  i=0;

  while(!

done)

  {

     NumberDevices*=2;

 

     if(*UsbDevices)

       {

        *UsbDevices=(PUSB_DEVICE_DESCRIPTOR)realloc(*UsbDevices,(NumberDevices*sizeof(USB_DEVICE_DESCRIPTOR)));

     }

       else

       {

        *UsbDevices=(PUSB_DEVICE_DESCRIPTOR)calloc(NumberDevices,sizeof(USB_DEVICE_DESCRIPTOR));

     }

 

     if(NULL==*UsbDevices)

       {

 

        //SetupDiDestroyDeviceInfoListdestroysadeviceinformationset

        //andfreesallassociatedmemory.

 

        SetupDiDestroyDeviceInfoList(hardwareDeviceInfo);

        returnINVALID_HANDLE_VALUE;

     }

 

     usbDeviceInst=*UsbDevices+i;

 

     for(;i

       {

 

        //SetupDiEnumDeviceInterfaces()returnsinformationaboutdeviceinterfaces

        //exposedbyoneormoredevices.Eachcallreturnsinformationaboutoneinterface;

        //theroutinecanbecalledrepeatedlytogetinformationaboutseveralinterfaces

        //exposedbyoneormoredevices.

 

        if(SetupDiEnumDeviceInterfaces(hardwareDeviceInfo,

                                        0,//Wedon'tcareaboutspecificPDOs

                                                                      pGuid,

                                        i,

                                        &deviceInfoData)){

 

           hOut=OpenOneDevice(hardwareDeviceInfo,&deviceInfoData,outNameBuf);

                    if(hOut!

=INVALID_HANDLE_VALUE)

                    {

              done=TRUE;

              break;

                    }

        }

              else

              {

           if(ERROR_NO_MORE_ITEMS==GetLastError())

                    {

              done=TRUE;

              break;

           }

        }

     }

  }

 

  NumberDevices=i;

 

  //SetupDiDestroyDeviceInfoList()destroysadeviceinformationset

  //andfreesallassociatedmemory.

 

  SetupDiDestroyDeviceInfoList(hardwareDeviceInfo);

  free(*UsbDevices);

  returnhOut;

}

HANDLEOpenOneDevice(

   IN      HDEVINFO                   HardwareDeviceInfo,

   IN      PSP_INTERFACE_DEVICE_DATA  DeviceInfoData,

      IN         char*devName

   )

{

   PSP_INTERFACE_DEVICE_DETAIL_DATA    functionClassDeviceData=NULL;

   ULONG                               predictedLength=0;

   ULONG                               requiredLength=0;

      HANDLE                                                       hOut=INVALID_HANDLE_VALUE;

 

   //

   //allocateafunctionclassdevicedatastructuretoreceivethe

   //goodsaboutthisparticulardevice.

   //

   SetupDiGetInterfaceDeviceDetail(

           HardwareDeviceInfo,

           DeviceInfoData,

           NULL,//probingsonooutputbufferyet

           0,//probingsooutputbufferlengthofzero

           &requiredLength,

           NULL);//notinterestedinthespecificdev-node

 

 

   predictedLength=requiredLength;

   //sizeof(SP_FNCLASS_DEVICE_DATA)+512;

 

   functionClassDeviceData=(PSP_INTERFACE_DEVICE_DETAIL_DATA)malloc(predictedLength);

   functionClassDeviceData->cbSize=sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);

 

   //

   //RetrievetheinformationfromPlugandPlay.

   //

   if(!

SetupDiGetInterfaceDeviceDetail(

              HardwareDeviceInfo,

              DeviceInfoData,

              functionClassDeviceData,

              predictedLength,

              &requiredLength,

              NULL)){

             free(functionClassDeviceData);

       returnINVALID_HANDLE_VALUE;

   }

 

      strcpy(devName,functionClassDeviceData->DevicePath);

      //printf("Attemptingtoopen%s/n",devName);

 

   hOut=CreateFile(

                 functionClassDeviceData->DevicePath,

                 GENERIC_READ|GENERIC_WRITE,

                 FILE_SHARE_READ|FILE_SHARE_WRITE,

                 NULL,//noSECURITY_ATTRIBUTESstructure

                 OPEN_EXISTING,//No

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2