10分钟完成一个USB驱动程序 作者:Rayyang2000 ,如转载请保证本文档的完整性,并注明出处。 欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=438 很多写Windows Device Driver的开发人员基本上都是使用Windows DDK进行开发的。但是,现在也有不少人都开始借助一些辅助工具。笔者去年开始接触到riverStudio,发现它真的是一个不错的开发工具,不仅写代码的时候思路清晰,而且和DDK的结合很好。
当然,也有很多人觉得用DriverStudio不够正宗,或者说不能很好的理解Windows Device Driver的架构。我感觉这就有点像MFC和SDK的关系,关于这个问题在很多地方都有争论,比如在万千新闻组上,就讨论了将近2个月。每个人都有自己的最爱,都有自己的习惯,只要你能把事情做好,我想用什么方法应该都是一样的。如果你已经习惯了用DDK开发,那完全还可以继续用下去;如果你觉得DriverStudio不错,那尝试用一个可以给你按照OOP概念来编程的工具有什么不好呢?
在驱动开发网上,经常看到有人询问一些关于DriverStudio的使用的问题。我正好很有幸用它作了几个驱动程序,包括VXD, KMD和WDM,稍微有点心得,因此想写下来给大家作一个小小的参考。如果其中有错误,欢迎大家给我指出,谢谢。
下面我就介绍一下用DriverStudio开发一个USB驱动程序的过程。这个USB设备有3个双向端点,每个端点的配置如下:
EP 类型 地址 buffer(Bytes)
0 IN/OUT Control 0x80/0x00 16/16
1 IN/OUT Bulk 0x81/0x01 16/16
2 IN/OUT Bulk 0x82/0x02 64/64
我们的驱动程序需要实现的功能就是控制设备上的LED灯的亮和灭,以及通过Endpoint 2对设备进行读写。
由于DriveStudio由几个部分组成,我们写这个驱动程序只要用到DriverWorks,因此下面我们就简称它为DW。在这里,我们假定读者已经正确的安装了DW,并且已经编译好了各个库文件。
1. 首先,我们通过快捷方式“Setup DDK and Start MSVC“来启动VC IDE。这个快捷方式所指向的程序,会进行一些必要的设置,然后再启动VC IDE,这样我们的程序就可以使用DDK和DW的头文件和库了。
2. 从VC IDE的菜单"DriverStudio"中选择"DriverWizard", 在如图1所示的对话框中, 写上项目名称. 在这里, 我们将这个项目称为: TEST, 所在的目录为D:\TEST. 然后点按钮"Next >".
图1
3. 在接下来的这个对话框中(如图2), 我们需要选择驱动程序的类型. 由于USB设备驱动程序是WDM类型的, 所以我们选择第二项并且点按钮"Next >".
图2
4. 在第3个对话框中(如图3), 选择我们的驱动程序所操作的总线类型. 这里, 我们选择USB. 在USB Vendor ID和USB Product ID中填入USB设备的VID和PID. 假定我们的USB设备的VID和PID分别是16进制的0471和1801. 然后点按钮"Next >". 关于VID和PID的规定请参考USB-IF的规范.
图3
5. 在接下来的对话框中(如图4), 我们需要加入Endpoint 1和Endpoint 2的定义. 由于在USB中规定Endpoint 0是必须存在的, 所以我们不需要对Endpoint 0进行定义. 点"Add..."按钮, 弹出一个如图5所示的对话框. 我们将它修改成如图6所示. 其中, 按照USB的规定, 对于端点, 它的地址是1; 按照前面说明的设备的特点, Endpoint 1的最大的包大小为16字节, 因此在"Max Transer Size"中填入16; Endpoint Name可以通过"Suggest Name"得到. 按照这些原则, 继续设置其他的配置, 以使对话框4变成如图7所示. 接下来, 继续按"Next >"按钮.
图4
图5
图6
图7
6. 在如图8所示的对话框中, 可以填入我们需要的Driver Class的名字和文件名. 一般我们不需要更改. 继续按"Next >"按钮.
图8
7. 在如图9所示的对话框中, 因为不需要给其他的驱动程序提供接口, 也不需要提供Flush功能, 所以不需要任何修改, 直接按"Next >"按钮.
图9
8. 在如图10所示的对话框中, 我们选择给端点2产生BULK Read的代码, 并且按"Next >"按钮. DW会给我们产生一套对端点2进行读的代码, 不用修改, 就可以直接使用.
图10
9. 在如图11所示的对话框中, 我们选择给端点2产生BULK Write的代码, 并且按"Next "按钮. 这样, DW也会给我们产生一套对端点2进行写的代码, 不用修改, 就可以直接使用.
图11
10. 对于如图12的对话框, 我们直接按"Next >"按钮. 这里是设置是否要将I/O请求排队, 在这里, 我们不需要排队.
图12
11. 在如图13所示的对话框中, 我们不需要创建任何注册表项, 所以直接按"Next >"按钮.
图13
12. 如图14所示的对话框, 是让我们设置一些驱动程序的属性, 比如接口, 缓冲区之类的. 一般的都可以使用缺省设置. 继续按"Next >"按钮.
图14
13. 在如图15所示的对话框中, 是让我们给驱动程序增加一些IOCTL接口. 我们只增加一个如图16所示的IOCTL来控制USB设备的LED灯. 然后按"Next >"按钮.
图15
图16
14. 在最后一个如图17所示的对话框中, 可以设置一些驱动程序的属性, 产生一个console测试程序. 按下"Finish"按钮, 就结束了Wizard.
图17
这样, 我们就创建好了一个基本的驱动程序, 下面来看看还要做哪些工作才可以和我们的设备以及上层的应用程序通讯.
把函数NTSTATUS TESTDevice::TEST_IOCTL_LED_Handler(KIrp I)改成如下面的样子:
NTSTATUS TESTDevice::TEST_IOCTL_LED_Handler(KIrp I)
{
NTSTATUS status = STATUS_INVALID_PARAMETER;
t << "Entering TESTDevice::TEST_IOCTL_LED_Handler, " << I << EOL;
__try
{
// TODO: Verify that the input parameters are correct
// If not, return STATUS_INVALID_PARAMETER
if(I.IoctlOutputBufferSize() || !I.IoctlBuffer() ||
(I.IoctlInputBufferSize() != sizeof(UCHAR)))
__leave;
// TODO: Handle the the ZBUARD_IOCTL_LED_ON request, or
// defer the processing of the IRP (i.e. by queuing) and set
// status to STATUS_PENDING.
PURB pUrb = m_Lower.BuildVendorRequest(
NULL, // transfer buffer
0, // transfer buffer size
0, // request reserved bits
(UCHAR)(*(PUCHAR)I.IoctlBuffer()), // request. 1 = LED_ON, 0 = LED_OFF
0 // Value
);
// transmit
status = m_Lower.SubmitUrb(pUrb, NULL, NULL, 5000L);
}
__finally
{
// TODO: Assuming that the request was handled here. Set I.Information
// to indicate how much data to copy back to the user.
I.Information() = 0;
I.Status() = status;
}
return status;
}
这个函数是控制LED灯的,它是通过USB Vendor Request来向设备传送的。其中,request=1的时候表示让LED亮,request=0的时候让LED灭。它是通过DeviceIoControl由上层应用程序传下来。
再看看读写部分,经过检查NTSTATUS TESTDevice::Read(KIrp I)和NTSTATUS TESTDevice::Write(KIrp I)可以发现,DW已经给我们写好了读写的代码,我们可以直接使用了。这些代码就是在上面的第8和第9步中产生的代码。
最后,修改编译一下DriverStudio产生的测试程序Test_TEST程序,我们就可以通过命令行来测试我们的驱动程序了。对于LED的控制,我们可以直观的在设备上看到,但对于读写的操作就需要和firmware程序配合,这已经超出了本文的范围,不在这里讨论了。
通过上面的讲解,我们可以看到有了DriverStudio,就可以快速的产生一个驱动程序,然后在里面作一些小的改动就可以使用了。即使是写一个比较复杂的USB驱动程序,我们也可以不用管一些系统的IRP处理,只要专注于我们自己的特定应用就可以了。而且它把一个驱动程序概括成几个类的概念,并且DW还附带有一些很有用的STL类,在VC IDE里面有了一个很清晰直观的表示。这样,对一些从上层应用转向驱动程序的开发人员,或者一些对C++/OOP很熟悉但不太了解系统内核的开发人员,都比较容易上手。即使对于推崇直接用DDK编程的人来说,通过阅读DriverStudio附带的源代码,也可以对驱动程序的开发有一个更加深入的了解。
|
相关推荐
10分钟完成一个USB驱动程序,轻松开发usb设备
帮助你10分钟完成一个USB驱动程序 串口通信 以单片机的串口通信为基础
10分钟完成一个USB驱动程序.pdf
studio10分钟完成一个USB驱动程序.pdf
DriverStudio培训教程 10分钟完成一个USB驱动程序,驱动开发软件熟悉教程。
使用driverstudio,可以快速完成一个USB驱动程序.然后做一下小的改动就可以使用
介绍用Driver_stiduo快速开发USB驱动的流程!
本款西门子usb ppi驱动程序是西门子200PLC通讯线USB转PPI驱动程序,本站提供该驱动程序的软件下载,看到很多朋友都找不到,所以给大家分享一下。需要的朋友们可以前来下载使用。 使用方法 下载解压,在文件夹中...
这个Altera USB-Blaster win10 X64驱动是可以在WIN10 X64位系统下运行的,里面2个压缩包文件,都可以用,其中X64文件夹里有8个驱动文件。把这个压缩包解压在某个盘的根目录下,然后来尝试以下步骤,一路试下来就好了...
统下的USB设备驱动程序的设计与实现。该设计根据USB的特点,通过合理的层次划分,将驱动程序 摘要分为硬件抽象层和设备类驱动层,在硬件抽象层完成对USB设备控制器的操作,在设备类驱动层实现对 各类USB设备命令的...
CP210x USB驱动 程序 这是CP210x VCP Drivers的USB转串口驱动程序,该CP210X驱动支持Win7、Win8和Win10,兼容32位和64位系统,安装完成后即可正常使用CP210x VCP Drivers。
XDS100V2 USB仿真器驱动程序。可适用于windows Xp系统,可加载与CCS3.3以上版本。
手机usb通用驱动程序是一款适合所有手机usb接口与电脑通信的驱动程序,是您手机连接电脑的必要帮手,现在下载驱动安装完成以后,重新起动计算机即可使用!安装说明自动安装:运行Setup.exe。安装成功后重新启动电脑。...
选择:不要搜索,我要自己选择要安装的驱动程序.单击下一步, 选择:从磁盘安装,打开浏览,从驱动盘中找到hidcom.INF文件,打开,单击确定, 选择下一步,此时系统会提示微软的数字签证,选择仍然继续,单击完成...
PL2303作为一款常用USB转串口芯片,在移动终端中进行驱动程序的适配移植,完成一转一或一转多串口功能。
为保证您正常使用网上银行,认证方式为USBKEY的客户若未安装USBKEY驱动程序请务必要下载安装。 功能介绍 解决“usbkey驱动安装不成功”的问题 识别usbkey设备 安装方法 首先要保证在安装前不要插入usb...
CH340 USB 2.0-serial USB串口,USB转485驱动 内含exe和直接的驱动安装包两种,可以通过以下方式安装 1. 直接点击exe,点击信任,然后完成安装 2. 通过设备管理器加载该驱动 网上很多驱动都不能用,这个亲自下载,...