资源预览内容
第1页 / 共15页
第2页 / 共15页
第3页 / 共15页
第4页 / 共15页
第5页 / 共15页
第6页 / 共15页
第7页 / 共15页
第8页 / 共15页
第9页 / 共15页
第10页 / 共15页
亲,该文档总共15页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
分类分类首页 标签 about love(8) recollect(6) Study DAY(17) FPGA(16) USB(3) VOIP(1) Linux(17) C Language(25) 日历日历日日一一二二三三四四五五六六12345678910111213141516171819202122232425262728293031登陆登陆用户名:密 码:记住密码登录用户注册 忘记密码最新文章最新文章鬼故事下载 鬼故事下载 OS 推荐 ARM 的开发步骤 s3c44b0x + uclinux 74 系列芯片资料 集成电路应用索引 密码学里的随机数发生器 研究密码学的网站集锦 10 分钟完成一个 USB 驱动程序 回复回复:签写留言: WISHBONE System-on 站点统计站点统计日志总数:96 评论数量:7 留言数量:1 访问次数:6461 加为好友 发送短信友情链接友情链接sunny sky with wind and rainWork Place10 分钟完成一个 USB 驱动程序2006-5-16 9:45:0010 分钟完成一个分钟完成一个 USB 驱动程序驱动程序很多写 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/161 IN/OUT Bulk 0x81/0x01 16/162 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 “.图 13. 在接下来的这个对话框中(如图 2), 我们需要选择驱动程序的类型. 由于 USB 设备驱 动程序是 WDM 类型的, 所以我们选择第二项并且点按钮“Next “.图 24. 在第 3 个对话框中(如图 3), 选择我们的驱动程序所操作的总线类型. 这里, 我们选择 USB. 在 USB Vendor ID 和 USB Product ID 中填入 USB 设备的 VID 和 PID. 假定我们 的 USB 设备的 VID 和 PID 分别是 16 进制的 0471 和 1801. 然后点按钮“Next “. 关于 VID 和 PID 的规定请参考 USB-IF 的规范.图 35. 在接下来的对话框中(如图 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图 76. 在如图 8 所示的对话框中, 可以填入我们需要的 Driver Class 的名字和文件名. 一般 我们不需要更改. 继续按“Next “按钮.图 87. 在如图 9 所示的对话框中, 因为不需要给其他的驱动程序提供接口, 也不需要提供 Flush 功能, 所以不需要任何修改, 直接按“Next “按钮.图 98. 在如图 10 所示的对话框中, 我们选择给端点 2 产生 BULK Read 的代码, 并且按“Next “按钮. DW 会给我们产生一套对端点 2 进行读的代码, 不用修改, 就可以直接使 用.图 109. 在如图 11 所示的对话框中, 我们选择给端点 2 产生 BULK Write 的代码, 并且按 “Next “按钮. 这样, DW 也会给我们产生一套对端点 2 进行写的代码, 不用修改, 就可以 直接使用.图 1110. 对于如图 12 的对话框, 我们直接按“Next “按钮. 这里是设置是否要将 I/O 请求排 队, 在这里, 我们不需要排队.图 1211. 在如图 13 所示的对话框中, 我们不需要创建任何注册表项, 所以直接按“Next “按钮.图 1312. 如图 14 所示的对话框, 是让我们设置一些驱动程序的属性, 比如接口, 缓冲区之类 的. 一般的都可以使用缺省设置. 继续按“Next “按钮.图 1413. 在如图 15 所示的对话框中, 是让我们给驱动程序增加一些 IOCTL 接口. 我们只增 加一个如图 16 所示的 IOCTL 来控制 USB 设备的 LED 灯. 然后按“Next “按钮.图 15图 1614. 在最后一个如图 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_PARAMETERif(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 buffer0, / transfer buffer size0, / request reserved bits(UCHAR)(*(PUCHAR)I.IoctlBuffer(), / request. 1 = LED_ON, 0 = LED_OFF0 / Value);/ transmitstatus = m_Lower.SubmitUrb(pUrb, NULL, NULL, 5000L);_finally/ TODO: Assuming that the request was handled here. Set I.Information / to indicate how much da
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号