USB应用程序开发.docx
《USB应用程序开发.docx》由会员分享,可在线阅读,更多相关《USB应用程序开发.docx(17页珍藏版)》请在冰豆网上搜索。
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