阅读:28468回复:46
USB应用程序开发
建议由浅入深开展针对USB的应用程序开发。
探讨与USB驱动程序通信技巧。 探讨与USB设备通信技巧。 相关连接: 在《WDM驱动程序---USB驱动开发》中,我想和网友共同探讨USB设备驱动WDM开发问题。 在《D12->C51驱动程序开发》中,我想和网友共同探讨USB硬件设备开发问题。 [编辑 - 5/11/02 by plasma] |
|
沙发#
发布于:2002-03-21 08:54
建立设备驱动程序与Windows应用程序接口有两种方法
1:设备驱动程序创建内核设备名和符号连接名 Windows应用程序调用 CreateFile( \"\\\\.\\\\符号连接名\", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 2:设备驱动程序创建设备接口 Windows应用程序可调用下列包装好的函数打开一个设备 这种方法是推荐使用的新方法 /* USB_Createfile :打开一个设备接口文件 pGuid: 指向设备接口标识Guid InterfaceIndex: 设备接口号 Example: HANDLE hUsb1 = USB_Createfile((LPGUID)&USB1_GUID,0); */ HANDLE USB_Createfile( GUID* pGuid, DWORD InterfaceIndex) { // Get handle to relevant device information set HDEVINFO info = SetupDiGetClassDevs(pGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE); if(info==INVALID_HANDLE_VALUE) { return NULL; } // Get interface data for the requested MemberIndex SP_INTERFACE_DEVICE_DATA ifdata; ifdata.cbSize = sizeof(ifdata); if(!SetupDiEnumDeviceInterfaces(info, NULL, pGuid, InterfaceIndex, &ifdata)) { SetupDiDestroyDeviceInfoList(info); return NULL; } // Get size of symbolic link name DWORD ReqLen; SetupDiGetDeviceInterfaceDetail(info, &ifdata, NULL, 0, &ReqLen, NULL); PSP_INTERFACE_DEVICE_DETAIL_DATA ifDetail = (PSP_INTERFACE_DEVICE_DETAIL_DATA)(new char[ReqLen]); if( ifDetail==NULL) { SetupDiDestroyDeviceInfoList(info); return NULL; } // Get symbolic link name ifDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA); if( !SetupDiGetDeviceInterfaceDetail(info, &ifdata, ifDetail, ReqLen, NULL, NULL)) { SetupDiDestroyDeviceInfoList(info); delete ifDetail; return NULL; } // Open file HANDLE pDevicefile = CreateFile( ifDetail->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if( pDevicefile==INVALID_HANDLE_VALUE) pDevicefile = NULL; delete ifDetail; SetupDiDestroyDeviceInfoList(info); return pDevicefile; } |
|
板凳#
发布于:2002-03-21 09:28
//为应用USB_Createfile需包含下列头文件
//常用方法 ReadFile WriteFile DeviceIoControl CloseHandle #include \"setupapi.h\" #include \"initguid.h\" #include \"winioctl.h\" |
|
地板#
发布于:2002-03-23 19:20
Windows应用程序控制方法 DeviceIoControl
Example: DeviceIoControl( hUsb1, IOCTL_CHANGER_ZERO_BUFFER, NULL, 0, // Input Buffer, BufferSize, // Output &BytesReturned, NULL) WINBASEAPI BOOL WINAPI DeviceIoControl( HANDLE hDevice, DWORD dwIoControlCode, LPVOID lpInBuffer,DWORD nInBufferSize, LPVOID lpOutBuffer,DWORD nOutBufferSize, LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped); dwIoControlCode 是32位控制码,由CTL_CODE宏形成 Example: #define IOCTL_CHANGER_ZERO_BUFFER CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) CTL_CODE( DeviceType 设备类型 ContgrolCode 0x800~0xFFF之间的自定义功能码 TransferType METHOD_BUFFERED METHOD_IN_DIRECT METHOD_OUT_DIRECT METHOD_NEITHER RequiredAccess FILE_ANY_ACCESS FILE_READ_ACCESS FILE_WRITE_ACCESS FILE_WRITE_ACCESS | FILE_WRITE_ACCESS ) 设备类型: FILE_DEVICE_BEEP FILE_DEVICE_CD_ROM FILE_DEVICE_CD_ROM_FILE_SYSTEM FILE_DEVICE_CONTROLLER FILE_DEVICE_DATALINK FILE_DEVICE_DFS FILE_DEVICE_DISK FILE_DEVICE_DISK_FILE_SYSTEM FILE_DEVICE_FILE_SYSTEM FILE_DEVICE_INPORT_PORT FILE_DEVICE_KEYBOARD FILE_DEVICE_MAILSLOT FILE_DEVICE_MIDI_IN FILE_DEVICE_MIDI_OUT FILE_DEVICE_MOUSE FILE_DEVICE_MULTI_UNC_PROVIDER FILE_DEVICE_NAMED_PIPE FILE_DEVICE_NETWORK FILE_DEVICE_NETWORK_BROWSER FILE_DEVICE_NETWORK_FILE_SYSTEM FILE_DEVICE_NULL FILE_DEVICE_PARALLEL_PORT FILE_DEVICE_PHYSICAL_NETCARD FILE_DEVICE_PRINTER FILE_DEVICE_SCANNER FILE_DEVICE_SERIAL_MOUSE_PORT FILE_DEVICE_SERIAL_PORT FILE_DEVICE_SCREEN FILE_DEVICE_SOUND FILE_DEVICE_STREAMS FILE_DEVICE_TAPE FILE_DEVICE_TAPE_FILE_SYSTEM FILE_DEVICE_TRANSPORT FILE_DEVICE_UNKNOWN FILE_DEVICE_VIDEO FILE_DEVICE_VIRTUAL_DISK FILE_DEVICE_WAVE_IN FILE_DEVICE_WAVE_OUT FILE_DEVICE_8042_PORT FILE_DEVICE_NETWORK_REDIRECTOR FILE_DEVICE_BATTERY FILE_DEVICE_BUS_EXTENDER FILE_DEVICE_MODEM FILE_DEVICE_VDM FILE_DEVICE_MASS_STORAGE FILE_DEVICE_SMB FILE_DEVICE_KS FILE_DEVICE_CHANGER FILE_DEVICE_SMARTCARD FILE_DEVICE_ACPI FILE_DEVICE_DVD FILE_DEVICE_FULLSCREEN_VIDEO FILE_DEVICE_DFS_FILE_SYSTEM FILE_DEVICE_DFS_VOLUME [编辑 - 3/23/02 作者: plasma] |
|
地下室#
发布于:2002-03-25 16:22
多谢。
不知您对firmware的理解如何,我现在用的是AN2131Q,PC端,至少能够作到能读写EP,但是firmware端,还是理解不深,不知您对这 片子是否熟悉。 |
|
|
5楼#
发布于:2002-04-08 14:59
Plasma,能不能请教你几个问题,我现在使用的是CYPRESS公司的AN2131开发板,根据文档的说明,可以使用CYPRESS\\USB\\DRIVERS\\HEX2C下面的HEX2C将我自己的HEX文件转换成***.C文件,然后用该文件代替CYPRESS\\USB\\DRIVERS\\EZLOADER下的firmware.C,再用DDK编译生成***.SYS文件。我想请教你,如何使用DDK编译,是不是需要对安装完的DDK进行一些环境的配置,还是直接使用CHECKED或FREE进行编译,再修改一些相关的文件就可以让计算机能使用新的USB设备?在这个过程中是否需要C++?请各位高手不要笑我的问题而不吝赐教,在下非常感谢!!
[编辑 - 4/15/02 作者: yxy3115] |
|
6楼#
发布于:2002-04-08 16:57
以上大侠们讲的都是window下usb应用程序的开发?
请问各位大侠,在Linux下,怎么找到USB设备并对其通讯? |
|
7楼#
发布于:2002-04-08 21:39
将16进制文件从PC主机向下灌入USB设备,可以用应用程序通过USB设备驱动写入USB设备。
|
|
8楼#
发布于:2002-04-11 10:05
cool
|
|
9楼#
发布于:2002-05-16 10:46
//USB_Open.cpp
/** / USB 操作过程:打开管道(文件)->读 IN 管道/写 OUT 管道->关闭管道(文件) D12管道名: PIPE00 写入管道(端点2) PIPE01 读取管道(端点3) PIPE02 写入管道(端点4) PIPE03 读取管道(端点5) HANDLE hFile; char pipe_name[20]; strcpy(pipe_name, (LPCSTR)\"PIPE01\"); hFile = USB_open_file(pipe_name); BOOLEAN bResult; bResult = ReadFile(hFile, threadParam->pcIoBuffer, threadParam->uiLength, &nBytes, NULL); bResult = WriteFile(hFile, threadParam->pcIoBuffer, threadParam->uiLength, &nBytes, NULL); CloseHandle(hFile); /**/ #include \"stdafx.h\" #include <setupapi.h> //#include \"c:\\98ddk\\inc\\win98\\setupapi.h\" #include <basetyps.h> //#include <wdm.h> #include <c:\\98ddk\\inc\\win98\\usbdi.h> #include \"GUID.h\" HANDLE USB_OpenOneDevice ( IN HDEVINFO HardwareDeviceInfo, IN PSP_INTERFACE_DEVICE_DATA DeviceInfoData, IN char *devName ); HANDLE USB_open_file(char *filename) { ULONG NumberDevices; HANDLE hOut = INVALID_HANDLE_VALUE; HDEVINFO hardwareDeviceInfo; SP_INTERFACE_DEVICE_DATA deviceInfoData; ULONG i; BOOLEAN done; PUSB_DEVICE_DESCRIPTOR usbDeviceInst; PUSB_DEVICE_DESCRIPTOR *UsbDevices = &usbDeviceInst; LPGUID pGuid = (LPGUID)&GUID_CLASS_D12_BULK; *UsbDevices = NULL; NumberDevices = 0; // // Open a handle to the plug and play dev node. // SetupDiGetClassDevs() returns a device information set that contains info on all // installed devices of a specified class. // hardwareDeviceInfo = SetupDiGetClassDevs ( pGuid, NULL, // Define no enumerator (global) NULL, // Define no (DIGCF_PRESENT | // Only Devices present DIGCF_INTERFACEDEVICE)); // Function class devices. // // Take a wild guess at the number of devices we have; // Be prepared to realloc and retry if there are more than we guessed // 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) { // SetupDiDestroyDeviceInfoList destroys a device information set // and frees all associated memory. SetupDiDestroyDeviceInfoList (hardwareDeviceInfo); return INVALID_HANDLE_VALUE; } usbDeviceInst = *UsbDevices + i; for (; i < NumberDevices; i++) { // SetupDiEnumDeviceInterfaces() returns information about device interfaces // exposed by one or more devices. Each call returns information about one interface; // the routine can be called repeatedly to get information about several interfaces // exposed by one or more devices. if (SetupDiEnumDeviceInterfaces (hardwareDeviceInfo, 0, // We don\'t care about specific PDOs pGuid, i, &deviceInfoData)) { hOut = USB_OpenOneDevice (hardwareDeviceInfo, &deviceInfoData, filename); if ( hOut != INVALID_HANDLE_VALUE ) { done = TRUE; break; } } else { if (ERROR_NO_MORE_ITEMS == GetLastError()) { done = TRUE; break; } } } } NumberDevices = i; // SetupDiDestroyDeviceInfoList() destroys a device information set // and frees all associated memory. SetupDiDestroyDeviceInfoList (hardwareDeviceInfo); if (*UsbDevices) free(*UsbDevices); return hOut; } HANDLE USB_OpenOneDevice ( IN HDEVINFO HardwareDeviceInfo, IN PSP_INTERFACE_DEVICE_DATA DeviceInfoData, IN char *devName ) { char completeDeviceName[256] = \"\"; 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, // probing so no output buffer yet 0, // probing so output buffer length of zero &requiredLength, NULL); // not interested in the specific dev-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); // // Retrieve the information from Plug and Play. // if (! SetupDiGetInterfaceDeviceDetail ( HardwareDeviceInfo, DeviceInfoData, functionClassDeviceData, predictedLength, &requiredLength, NULL)) { return INVALID_HANDLE_VALUE; } strcpy(completeDeviceName,functionClassDeviceData->DevicePath) ; strcat (completeDeviceName,\"\\\\\"); strcat (completeDeviceName,devName); hOut = CreateFile ( completeDeviceName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, // no SECURITY_ATTRIBUTES structure OPEN_EXISTING, // No special create flags 0, // No special attributes NULL); // No template file if (INVALID_HANDLE_VALUE == hOut) { } free(functionClassDeviceData); return hOut; } |
|
10楼#
发布于:2002-05-16 13:07
请问plasma我现在要在PC和POCKET PC两端各写一个应用程序,请问在HANDLE USB_Createfile( GUID* pGuid, DWORD InterfaceIndex)
中pGuid参数怎么设定? |
|
11楼#
发布于:2002-05-16 13:16
别的我不清楚,只知道
pGuid指向要调用的驱动程序Guid |
|
12楼#
发布于:2002-05-16 15:36
那这个GUID在哪里可以找到呢?
|
|
13楼#
发布于:2002-05-16 18:08
如果自己做驱动,用VC++提供的GUID生成工具生成,如果用现有的驱动就找该驱动的GUID。
|
|
14楼#
发布于:2002-05-17 09:06
to plasma:
那如何找别人做的驱动的GUID呢? |
|
15楼#
发布于:2002-05-17 10:09
search in .sys
|
|
|
16楼#
发布于:2002-05-17 12:21
有没有通用一点的方法,并且pc可以用createfile,但是设备要和pc通讯它怎么建立呢?
|
|
17楼#
发布于:2002-05-17 12:23
或者是两台主机,主机又没有GUID
|
|
18楼#
发布于:2002-05-17 17:11
请问怎么打开.sys找GUID?
|
|
19楼#
发布于:2002-05-22 11:42
我想起来了,不用在sys里面search,只要到注册表里面找
HKLM\\CurrentControlSet\\Enum\\USB里面找对应的设备的键值,里面有一个SymbolicName,它的value里面有一部分就是GUID。 |
|
|
上一页
下一页