阅读:3220回复:21
拙见:找到你自己驱动的USB设备
我也是一个初次和USB打交道的“低手”,在编写驱动程序的时候,拜读了无数高手的文章,还买了ZhouLiGong的书,可惜,资质愚顿,始终没有“开窍”。
就连使用ZhouLiGong书里面的例子都没有成功。 后来只好自己动手,摸石头过河,没想到误打误撞,居然小有进展。 总结一下,可能会对和我一样初涉此地的兄弟们有抛砖的功效。 也请各位高手多多批评指正。 |
|
最新喜欢:![]() |
沙发#
发布于:2004-08-25 09:12
首先要在自己的机器上安装DDK,偶找到了一个Win2KDDK.EXE。
安装之后,你就可以开发和编译了。 最重要的是,这里会有很多例子的。 偶就是在其中的“bulkusb”这个例子的基础上改动的。 |
|
板凳#
发布于:2004-08-25 09:17
接下来,编写INF文件。
这个INF嘛,是和安装驱动关系密切的,详细的各个部分的含义,在DDK的帮助中有。 以下是BULKUSB.INF的内容: ; Installation inf for the Intel 82930 USB Bulk IO Test Board ; ; (c) Copyright 1999 Microsoft ; [Version] Signature="$CHICAGO$" Class=USB ClassGUID={36FC9E60-C465-11CF-8056-444553540000} provider=%MSFT% DriverVer=08/05/1999 [SourceDisksNames] 1="BulkUsb Installation Disk",,, [SourceDisksFiles] BULKUSB.sys = 1 BULKUSB.inf = 1 [Manufacturer] %MfgName%=Microsoft [Microsoft] %USB\VID_045E&PID_930A.DeviceDesc%=BULKUSB.Dev, USB\VID_045E&PID_930A ;[PreCopySection] ;HKR,,NoSetupUI,,1 [DestinationDirs] BULKUSB.Files.Ext = 10,System32\Drivers BULKUSB.Files.Inf = 10,INF [BULKUSB.Dev] CopyFiles=BULKUSB.Files.Ext, BULKUSB.Files.Inf AddReg=BULKUSB.AddReg [BULKUSB.Dev.NT] CopyFiles=BULKUSB.Files.Ext, BULKUSB.Files.Inf AddReg=BULKUSB.AddReg [BULKUSB.Dev.NT.Services] Addservice = BULKUSB, 0x00000002, BULKUSB.AddService [BULKUSB.AddService] DisplayName = %BULKUSB.SvcDesc% ServiceType = 1 ; SERVICE_KERNEL_DRIVER StartType = 3 ; SERVICE_DEMAND_START ErrorControl = 1 ; SERVICE_ERROR_NORMAL ServiceBinary = %10%\System32\Drivers\BULKUSB.sys LoadOrderGroup = Base [BULKUSB.AddReg] HKR,,DevLoader,,*ntkern HKR,,NTMPDriver,,BULKUSB.sys HKLM,"System\Currentcontrolset\Services\BulkUsb\Parameters","MaximumTransferSize",0x10001,4096 HKLM,"System\Currentcontrolset\Services\BulkUsb\Parameters","DebugLevel",0x10001,2 [BULKUSB.Files.Ext] BULKUSB.sys [BULKUSB.Files.Inf] BulkUsb.Inf ;---------------------------------------------------------------; [Strings] MSFT="Microsoft" MfgName="Intel" USB\VID_045E&PID_930A.DeviceDesc="BulkUsb.Sys Intel 82930 USB Bulk IO Test Board" BULKUSB.SvcDesc="BulkUsb.Sys i82930 Bulk IO test driver" 不能原样照搬,其中与自己的设备相关的部分要修改,其中最重要的有: 1 GUID 2 VID 3 PID |
|
地板#
发布于:2004-08-25 09:22
系统缺省的USB设备的GUID是:{36FC9E60-C465-11CF-8056-444553540000}
不能用啊,偶用了多次,都不能找到自己的设备。 估计这是留给USB的HostHub这样的设备用的吧。 所以要给自己的设备一个自定义的GUID,GUID的生成有一些工具。 只要不和系统缺省的那些GUID冲突,自己编一个GUID也可以。 不过,最好用GUID工具来生成。 偶的设备的GUID是{6309DF86-017C-410e-9D7E-B897F0EECFB6} |
|
地下室#
发布于:2004-08-25 09:23
PID和你的USB芯片有关。
偶用的是D12,PID是0471 |
|
5楼#
发布于:2004-08-25 09:25
VID和USB芯片也有关
偶的是0888 |
|
6楼#
发布于:2004-08-25 09:30
最简单的,把 BulkUsb.INF中:
ClassGuid改为自己的GUID 把所有“VID_045E&PID_930A”改为自己的,偶的是“VID_0471&PID_0888” 就可以了, 其他的,你可以适当修改标识的内容,变成自己的设备,具体看帮助吧。 |
|
7楼#
发布于:2004-08-25 09:37
接下来,在你的驱动程序指明自己设备的GUID
例子程序的guid829.h中有: DEFINE_GUID(GUID_CLASS_I82930_BULK, 0x873fdf, 0x61a8, 0x11d1, 0xaa, 0x5e, 0x0, 0xc0, 0x4f, 0xb1, 0x72, 0x8b); 你要替换成自己的GUID. |
|
8楼#
发布于:2004-08-25 09:40
按照DDK语法,make自己的驱动程序。
|
|
9楼#
发布于:2004-08-25 09:49
在应用程序中找自己的设备很关键。
我按照高手们的建议找了,总找不到,即使我的设备连接上也找不到。 于是只好自己动手做了。 关键是直接找自己的设备,不要用HidD_GetHidGuid(&hidGuid);找 反正偶没有用这个函数成功找到过。 |
|
10楼#
发布于:2004-08-25 09:57
把偶的代码放上来吧,见笑啊,写的不好:(
const GUID DiskClassGuid = {这里是你自己的GUID}; GUID hidGuid ; hidGuid=DiskClassGuid; HDEVINFO hDevInfo = SetupDiGetClassDevs(&hidGuid, NULL, // no enumerator NULL, // no parent (DIGCF_PRESENT | DIGCF_INTERFACEDEVICE)); if(!hDevInfo) { AfxMessageBox("Couldn't get handle for HID devices"); return; } SP_INTERFACE_DEVICE_DATA devInfoData; devInfoData.cbSize = sizeof (SP_INTERFACE_DEVICE_DATA); int deviceNo = 0; SetLastError(NO_ERROR); while(GetLastError() != ERROR_NO_MORE_ITEMS){ if(SetupDiEnumInterfaceDevice (hDevInfo, 0,//lpDeviceInfoData, &hidGuid, deviceNo, &devInfoData)){ ULONG requiredLength = 0; SetupDiGetInterfaceDeviceDetail(hDevInfo, &devInfoData, NULL, 0, &requiredLength, NULL); PSP_INTERFACE_DEVICE_DETAIL_DATA devDetail = (SP_INTERFACE_DEVICE_DETAIL_DATA*) malloc (requiredLength); devDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA); if(! SetupDiGetInterfaceDeviceDetail(hDevInfo, &devInfoData, devDetail, requiredLength, NULL, NULL)) { AfxMessageBox("Couldn't get HID details"); free(devDetail); return; } AfxMessageBox(devDetail->DevicePath); char sDevPath[512]; strcpy(sDevPath,devDetail->DevicePath); strcat(sDevPath,"\\PIPE1"); //打开设备句柄 HANDLE hDeviceHandle = CreateFile(sDevPath,//devDetail->DevicePath , GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (hDeviceHandle == INVALID_HANDLE_VALUE) AfxMessageBox("打开设备路径出错!\n"); else { char sBuf[512]; ULONG l; if (!WriteFile(hDeviceHandle, sBuf, 512, &l, NULL)){ AfxMessageBox("写入设备出错!\n"); int i=::GetLastError(); char sBuf[128]; ltoa(i,sBuf,10); AfxMessageBox(sBuf); } CloseHandle(hDeviceHandle); } free(devDetail); deviceNo++; } else { int i=::GetLastError(); char sBuf[128]; ltoa(i,sBuf,10); AfxMessageBox(sBuf); if (i==ERROR_NO_MORE_ITEMS) break; } } |
|
11楼#
发布于:2004-08-25 09:59
虽然很糊涂,但好歹找到了自己的设备。
就可以编写读写处理了。 不足之处,还请有经验的网友指正。 谢谢。 |
|
12楼#
发布于:2004-08-25 10:48
首先要在自己的机器上安装DDK,偶找到了一个Win2KDDK.EXE。 呵呵,好文章,先顶一下!!想请教一下,你的Win2KDDK.EXE是在那里下载的,大概有多大啊!能不能把网址贴出啊!! |
|
13楼#
发布于:2004-08-25 10:51
首先要在自己的机器上安装DDK,偶找到了一个Win2KDDK.EXE。 呵呵,好文章,先顶一下!!想请教一下,你的Win2KDDK.EXE是在那里下载的,大概有多大啊!能不能把网址贴出啊!!我下载了一个67。5M的,不是是不是这个啊??? |
|
14楼#
发布于:2004-08-25 12:42
我安装这个DDK时,机箱的都的都的报警,重新启动以后也没有发现多出什么东西!!这是怎么回事啊!!我的机器是win2000 professional,没有安装VC6.0
|
|
15楼#
发布于:2004-08-25 12:54
应该是对的,我的是65.7M正常使用!
|
|
16楼#
发布于:2004-08-26 12:37
好好好,哈哈,谢谢了,对我有帮助 :D
|
|
17楼#
发布于:2004-08-26 13:20
兄弟,我实在是撑不下去了,自己开了哥新的帖子,请你帮帮忙!!!
http://www.driverdevelop.com/forum/html_76447.html?1093497576 谢谢 |
|
18楼#
发布于:2004-08-26 14:31
好文章! :)
|
|
19楼#
发布于:2004-08-26 17:31
[quote呵呵,好文章,先顶一下!!想请教一下,你的Win2KDDK.EXE是在那里下载的,大概有多大啊!能不能把网址贴出啊!! [/quote]
多谢鼓励。 我在哪里下载的记不清了,sorry! 大小是65.7MB. |
|
上一页
下一页