USB驱动程序编写

上传人:206****923 文档编号:41768683 上传时间:2018-05-30 格式:DOC 页数:15 大小:570.50KB
返回 下载 相关 举报
USB驱动程序编写_第1页
第1页 / 共15页
USB驱动程序编写_第2页
第2页 / 共15页
USB驱动程序编写_第3页
第3页 / 共15页
USB驱动程序编写_第4页
第4页 / 共15页
USB驱动程序编写_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《USB驱动程序编写》由会员分享,可在线阅读,更多相关《USB驱动程序编写(15页珍藏版)》请在金锄头文库上搜索。

1、分类分类首页 标签 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 分钟

2、完成一个 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 进行开发的。 但是,现在也有不少人都开始借助一些辅助工具。笔者去年开始接触到 riverStu

3、dio,发 现它真的是一个不错的开发工具,不仅写代码的时候思路清晰,而且和 DDK 的结合很 好。当然,也有很多人觉得用 DriverStudio 不够正宗,或者说不能很好的理解 Windows Device Driver 的架构。我感觉这就有点像 MFC 和 SDK 的关系,关于这个问题在很多地 方都有争论,比如在万千新闻组上,就讨论了将近 2 个月。每个人都有自己的最爱,都 有自己的习惯,只要你能把事情做好,我想用什么方法应该都是一样的。如果你已经习 惯了用 DDK 开发,那完全还可以继续用下去;如果你觉得 DriverStudio 不错,那尝试 用一个可以给你按照 OOP 概念来编程的工

4、具有什么不好呢?在驱动开发网上,经常看到有人询问一些关于 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 0x8

5、2/0x02 64/64我们的驱动程序需要实现的功能就是控制设备上的 LED 灯的亮和灭,以及通过 Endpoint 2 对设备进行读写。由于 DriveStudio 由几个部分组成,我们写这个驱动程序只要用到 DriverWorks,因此下 面我们就简称它为 DW。在这里,我们假定读者已经正确的安装了 DW,并且已经编译 好了各个库文件。1. 首先,我们通过快捷方式“Setup DDK and Start MSVC“来启动 VC IDE。这个快捷方 式所指向的程序,会进行一些必要的设置,然后再启动 VC IDE,这样我们的程序就可 以使用 DDK 和 DW 的头文件和库了。2. 从 VC I

6、DE 的菜单“DriverStudio“中选择“DriverWizard“, 在如图 1 所示的对话框中, 写 上项目名称. 在这里, 我们将这个项目称为: TEST, 所在的目录为 D:TEST. 然后点按钮 “Next “.图 13. 在接下来的这个对话框中(如图 2), 我们需要选择驱动程序的类型. 由于 USB 设备驱 动程序是 WDM 类型的, 所以我们选择第二项并且点按钮“Next “.图 24. 在第 3 个对话框中(如图 3), 选择我们的驱动程序所操作的总线类型. 这里, 我们选择 USB. 在 USB Vendor ID 和 USB Product ID 中填入 USB 设

7、备的 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;

8、按照前面说明的设备的特点, Endpoint 1 的最大 的包大小为 16 字节, 因此在“Max Transer Size“中填入 16; Endpoint Name 可以通过 “Suggest Name“得到. 按照这些原则, 继续设置其他的配置, 以使对话框 4 变成如图 7 所 示. 接下来, 继续按“Next “按钮.图 4图 5图 6图 76. 在如图 8 所示的对话框中, 可以填入我们需要的 Driver Class 的名字和文件名. 一般 我们不需要更改. 继续按“Next “按钮.图 87. 在如图 9 所示的对话框中, 因为不需要给其他的驱动程序提供接口, 也不需要提供 F

9、lush 功能, 所以不需要任何修改, 直接按“Next “按钮.图 98. 在如图 10 所示的对话框中, 我们选择给端点 2 产生 BULK Read 的代码, 并且按“Next “按钮. DW 会给我们产生一套对端点 2 进行读的代码, 不用修改, 就可以直接使 用.图 109. 在如图 11 所示的对话框中, 我们选择给端点 2 产生 BULK Write 的代码, 并且按 “Next “按钮. 这样, DW 也会给我们产生一套对端点 2 进行写的代码, 不用修改, 就可以 直接使用.图 1110. 对于如图 12 的对话框, 我们直接按“Next “按钮. 这里是设置是否要将 I/O

10、 请求排 队, 在这里, 我们不需要排队.图 1211. 在如图 13 所示的对话框中, 我们不需要创建任何注册表项, 所以直接按“Next “按钮.图 1312. 如图 14 所示的对话框, 是让我们设置一些驱动程序的属性, 比如接口, 缓冲区之类 的. 一般的都可以使用缺省设置. 继续按“Next “按钮.图 1413. 在如图 15 所示的对话框中, 是让我们给驱动程序增加一些 IOCTL 接口. 我们只增 加一个如图 16 所示的 IOCTL 来控制 USB 设备的 LED 灯. 然后按“Next “按钮.图 15图 1614. 在最后一个如图 17 所示的对话框中, 可以设置一些驱动

11、程序的属性, 产生一个 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_IOCT

12、L_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 th

13、e 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

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号