usb客户驱动程序及应用程序

来源:互联网 发布:centos ftp传文件 编辑:程序博客网 时间:2024/05/01 19:14

向一块USB的测试板子发送数据.请问怎么以中断的方式进行块传输?  

usb设备的访问分为三个部分,usb固件驱动程序 usb客户驱动程序 usb应用程序.
---------------------------------------------------------------  
 
推荐:  
 
http://www.usb.org/developers  
 
http://www.lvr.com/usbcode.htm  
---------------------------------------------------------------  
 
HANDLE  OpenDevice(LPGUID  pGuid,  char  *outNameBuf)  
{  
       HANDLE                                      hOut  =  INVALID_HANDLE_VALUE;  
       HDEVINFO                                  hardwareDeviceInfo;  
       SP_INTERFACE_DEVICE_DATA  deviceInfoData;  
 
       hardwareDeviceInfo  =  SetupDiGetClassDevs  (pGuid,  NULL,  NULL,  (DIGCF_PRESENT    ¦  DIGCF_INTERFACEDEVICE));  
 
       deviceInfoData.cbSize  =  sizeof  (SP_INTERFACE_DEVICE_DATA);  
 
       if  (SetupDiEnumDeviceInterfaces  (hardwareDeviceInfo,  0,  pGuid,  0,  &deviceInfoData))  
       {  
               hOut  =  OpenOneDevice  (hardwareDeviceInfo,  &deviceInfoData,  outNameBuf);  
 
               if  (hOut==INVALID_HANDLE_VALUE)  
                       return  INVALID_HANDLE_VALUE;  
       }  
 
           DWORD            reErr  =  GetLastError(  );  
 
       SetupDiDestroyDeviceInfoList  (hardwareDeviceInfo);  
 
       return  hOut;  
}  
 
HANDLE  OpenOneDevice(HDEVINFO  HardwareDeviceInfo,  PSP_INTERFACE_DEVICE_DATA  DeviceInfoData,  char  *devName)  
{  
       PSP_INTERFACE_DEVICE_DETAIL_DATA    functionClassDeviceData  =  NULL;  
       ULONG                                                          predictedLength                  =  0;  
       ULONG                                                          requiredLength                    =  0;  
       HANDLE                                                        hOut                                        =  INVALID_HANDLE_VALUE;  
 
       //  allocate  a  function  class  device  data  structure  to  receive  the  goods  about  this  particular  device.  
       SetupDiGetInterfaceDeviceDetail  (HardwareDeviceInfo,  DeviceInfoData,  NULL,  0,  &requiredLength,  NULL);  
 
       predictedLength  =  requiredLength;  
       //  sizeof  (SP_FNCLASS_DEVICE_DATA)  +  512;  
 
       functionClassDeviceData                  =  (PSP_INTERFACE_DEVICE_DETAIL_DATA)malloc  (predictedLength);  
       functionClassDeviceData->cbSize  =  sizeof  (SP_INTERFACE_DEVICE_DETAIL_DATA);  
 
       //  Retrieve  the  information  from  Plug  and  Play.  
       if  (!SetupDiGetInterfaceDeviceDetail(  
                             HardwareDeviceInfo,  
                             DeviceInfoData,  
                             functionClassDeviceData,  
                             predictedLength,  
                             &requiredLength,  
                             NULL))  
       {  
               free(functionClassDeviceData);  
               return  INVALID_HANDLE_VALUE;  
       }  
 
       strcpy(devName,functionClassDeviceData->DevicePath);  
       printf("Attempting  to  open  %s/n",  devName);  
 
       hOut  =  CreateFile  (functionClassDeviceData->DevicePath,  
                                   GENERIC_READ    ¦  GENERIC_WRITE,  
                                   FILE_SHARE_READ    ¦  FILE_SHARE_WRITE,  
                                   NULL,  
                                   OPEN_EXISTING,  
                                   0,  
                                   NULL);  
 
       if  (INVALID_HANDLE_VALUE  ==  hOut)  
               printf("FAILED  to  open  %s/n",  devName);  
 
       free(functionClassDeviceData);  
 
       return  hOut;  
}  
 
 
HANDLE  hDEV  =  OpenDevice((LPGUID)&GUID_BUS_UMSS,  completeDeviceName);  
       if  (hDEV==INVALID_HANDLE_VALUE)  
               return;  
 
           DeviceIoControl            (  
                                                           hDEV,  
                                                           IOCTL_Vender_VCMD_WRITE,  
                                                           buf,  
                                                           31,                        //CBW  
                                                           buf,  
                                                           13,            //  Data  +  CSW  
                                                           (LPDWORD)&nBytes,  
                                                           NULL  
                                                           );  
 
 
上面的OpenDevice函数就是演示如何根据设备GUID打开一个USB接口的设备,和设备读写通讯的时候就需要了解设备的驱动到底都支持什么方式了。可以使用UsbView工具查看USB设备到底支持几个Endpoint,每个都以什么方式读写。  
如果你的设备支持3个EndPoint,0号是控制的,1号是读,2号是写,那你直接读取0号Endpoint,搞不好就会发生重起的问题。仔细看看DDK中的一些例子代码可以解决你的问题