USB2.0学习笔记连载(三):通用USB驱动程序解析
对于USB驱动的开发,读者可以使用Windows DDK、DriverStudio等多种开发工具来实现USB的驱动,但是驱动程序的开发过程都比较复杂,而且很容易致使USB主机内存泄露而死机。那么对于笔者这样喜欢做硬件的研发对软件不是很感冒的孩纸,怎么快速上手开发出USB驱动。其实很多USB芯片公司已经给很多用户提供了开发包,譬如笔者使用的Cypress公司提供的开发包可以满足广大用户的要求,这一点还是值的称道的,关于后续怎么使用这些开发包进行USB2.0驱动的开发,笔者会在后续的博客中一一写出。
那么在完成USB驱动之前,先了解一下USB驱动程序的架构。
笔者之前没有了解过USB驱动,但自己时常在想,我将USB设备到电脑的USB接口上,那么主机会识别我这个设备,进行驱动安装,然后进行通信和管理,那么这个过程是如何去实现的呢?
带着这个问题,笔者搜索了一些资料。
USB设备的驱动程序是USB主机应用程序与USB外部设备之间沟通的桥梁,高校的USB驱动程序是USB设备研发的关键。那么驱动程序中最关键的两个文件,一个是驱动程序文件(*.sys):硬件设备驱动程序的核心文件,提供了应用程序与外部硬件设备通信信道和方法,另外一个是设备信息文件(*.inf):包含了相应的硬件设备及其驱动程序的详细信息,这些信息包括硬件设备名称、使用什么驱动程序文件,硬件设备信息在系统注册表中的存储等等。一个驱动程序需要配合一个inf文件才可以进行安装。
由上面可以看出,驱动程序有两个文件必须配合使用,(*.sys)和(*.inf)。让我们回顾一下USB设备的安装过程,如下图所示:
首先主机检测到USB设备后,需要对USB设备进行检索安装。这个安装过程就是在寻找对应USB设备ID的(*.inf)文件,若是主机自动检索中找到了(*.inf)文件,会显示安装成功,若是找不到该inf文件,那么会提示找不到驱动,这时候需要手工进行(*.inf)文件的配置。可见inf文件里面的配置信息也是至关重要的,下图是笔者随便打开的一个驱动的inf文件。对于inf文件里面有什么信息呢?哪些我们用户可以修改?各个信息是什么意思呢?
inf文件包括三个重要部分:节(section),键(key),值(value),如上图所示的[version]就是一个节,class是键,USB是给键class的值。每个节下面可以包含过个键和值;如上图所示。
那么上图中对应各节是什么意思呢?
Version:版本节,在 INF 文件的开始,主要用于版本控制和版本描述信息。
Version版本节一般位于inf文件的开始,重要用于版本控制,主要包括内容如下图示: signature :定义了该inf文件需要在何系统下运行,一般有下面几个操作系统版本
$Windows NT$
$Chicago$
$Windows 95$
class用来说明驱动程序所属的类别,常用的类别如下:
classGUID一般是固定值,如下图所示:
Provider 项
版本节(Version)的 Provider 项用于指明该驱动程序 INF 文件的供应商名称。
CatalogFile 项
版本节(Version)的 CatalogFile 项,用于指明驱动程序数字签名文件的文件名,其扩展
名为.cat。
DriverVer 项
版本节( Version)的 DriverVer 项,用于指明该驱动程序的版本信息。版本的格式为
mm/dd/yyyy[,x.y.v.z]。其中
mm/dd/yyyy:表示月 /日 /年。
x.y.v.z:表示驱动程序的版本号。
源文件盘符节(SourceDisksNames)
源文件盘符节(SourceDisksNames)用于罗列源文件所在盘符序列码、盘描述符、盘卷
标号和盘序列号。源文件盘符节( SourceDisksNames)内语句的语法格式如下:
disk-ordinal=“disk-description”,disk-label,disk-serial-number
其中各项的含义如下:
disk-ordinal:表示盘符序列码。 disk-ordinal 标识一个源盘,具有惟一性。一般其可
以设置为从 1 开始递增的整数,当存在多个源盘时,盘符序列码之间不能重复。值
得注意的是, 0 不是一个有效的盘符序列码。
disk-description:表示盘描述符,其是采用双引号括起的字符串或字符串宏,以达到
描述盘的内容等目的。安装引擎将该字符串显示在对话框内以提示用户。
disk-label:表示源盘的卷标识。
disk-serial-number:一般不使用,但必须被设置为 0。
这里需要注意的是,对于一个驱动程序 INF 文件来说, disk-ordinal 和 disk-description 为
必选项。典型的源文件盘符节( SourceDisksNames)的示例代码如下:
[SourceDisksNames]
1=%CYUSB_INSTALL%,,,
源文件节(SourceDisksFiles)
源文件节(SourceDisksFiles)用于指定安装时使用的源文件和盘符序列码、盘描述符。
源文件节(SourceDisksFiles)内语句的语法如下:
file-name=disk-number[,subdir] [,file-size]
其中各项的含义如下:
file-name:表示源盘上文件的名称。
disk-number:表示包含 file-name 指定文件所在源盘的盘符序列码,该盘符序列码需
在源文件盘符节(SourceDisksNames)中列出,并大于或等于 1。
Subdir:用于指定文件所在源盘的子目录,如省略则源盘为缺省安装路径。
file-size:用于表明文件的大小,以字节( Byte)为单位。
这里需要注意的是,对于一个驱动程序 INF 文件来说, file-name 为必选项。典型的源文
件节(SourceDisksFiles)的示例代码如下:
[SourceDisksFiles]
HTDGHUsbME.sys = 1
HTDGHUsb.sys = 1
HTDGHUsb.spd = 1
目标磁盘节(DestinationDirs)
目标磁盘节(DestinationDirs)用于指定 CopyFiles、 RenFiles 或 DelFiles 入口的缺省操作
目录,其语法格式如下:
file-list-section=LDID, [Subdir]
其中, Subdir 代表目录地址,而 LDID 为目标目录类型, LDID 的取值如下所示:
LDID=01 时,表示目标目录为当前目录;
LDID=04 时,表示目标目录为后退目录;
LDID=10 时,表示目标目录为 Windows 目录;
LDID=11 时,表示目标目录为系统目录;
LDID=12 时,表示目标目录为驱动程序目录;
LDID=13 时,表示目标目录为命令目录;
LDID=14 时,表示目标目录为控制面板目录;
LDID=15 时,表示目标目录为打印机目录;
LDID=16 时,表示目标目录为工作组目录;
LDID=17 时,表示目标目录为 INF 目录;
LDID=18 时,表示目标目录为帮助目录;
LDID=19 时,表示目标目录为管理员目录;
LDID=20 时,表示目标目录为字体目录;
LDID=21 时,表示目标目录为阅读器目录;
LDID=22 时,表示目标目录为 VMM 目录;
LDID=23 时,表示目标目录为颜色目录;
LDID=25 时,表示目标目录为共享目录;
LDID=26 时,表示目标目录为 winboot 目录;
LDID=28 时,表示目标目录为主机 winboot 目录;
LDID=30 时,表示目标目录为当前根目录;
LDID=50 时,表示目标目录为 System 目录;
LDID=51 时,表示目标目录为 Spool 目录;
LDID=52 时,表示目标目录为 Spool 驱动目录;
LDID=53 时,表示目标目录为用户配置目录;
LDID=55 时,表示目标目录为打印处理器目录。
典型的目标磁盘节(DestinationDirs)的示例代码如下:
[DestinationDirs]
HTDGHUsbME.Files.Ext = 10,System32\Drivers
HTDGHUsb.Files.Ext = 10,System32\Drivers
字符串节(String)
字符串节(String)中用于定义字符串变量。字符串节(String)长用于在 INF 文件中频
繁地出现某些字符串的场合。此时使用一个字符串变量来代替,可以达到简化输入的目的。
然后用该字符串变量代表该字符串出现在 INF 文件中。其定义格式如下:
StrKey=”String”
其中各项的含义如下:
StrKey 表示字符串的名称,其由数字和字母组成。
String 表示字符串的内容。
典型的字符串节(String)的示例代码如下:
[Strings]
PROVIDER="Cypress"
MFGNAME="Cypress"
CYUSB_INSTALL="Cypress Generic USB Driver Installation Disk"
VID_04B4&PID_8614.DeviceDesc="Cypress EZ-USB FX2LP - EEPROM missing"
VID_04B4&PID_6473.DeviceDesc="Cypress EZ-USB FX1 - EEPROM missing"
VID_04B4&PID_1004.DeviceDesc="Cypress EZ-USB Example Device"
CyUsb.SvcDesc="Cypress Generic USB Driver"
USB2.0学习笔记连载(三):通用USB驱动程序解析的更多相关文章
- USB2.0学习笔记连载(十四):USB驱动安装及固件程序的编写
在之前的博客中已经讲过,驱动程序最核心的两个文件,一个是xxx.sys文件,一个是xxx.inf文件,主机是寻找xxx.inf文件. 在下面的文件中有相关关于USB驱动的说明.对于用户来说,xxx.s ...
- USB2.0学习笔记连载(九):USB设备驱动的安装
在第一次插入USB设备时(笔者用的是自己做的USB最小系统来测试),插入电脑后,在设备管理器中会显示 未知设备,如下图所示: 点击右键,选择属性,在详细信息中可以看到硬件ID以及PID等,如下图所示. ...
- USB2.0学习笔记连载(二):USB基础知识简介
USB接口分为USB A型.USB B型.USBmini型.USBmicro型.USB3.0其中每种都有相应的插座和插头. 图1 图2 上图是USBA型接口,图1为插座,图2为插头.插座指向下行方向, ...
- USB2.0学习笔记连载(一):CY7C68013特性简介
上一篇博客已经给出了整个视频板卡架构,那么对于USB接口部分需要着重理解和学习. 对于目前来说,若是利用FPGA去模拟USB2.0内核,难度还是挺大的,整个状态的收发都不好控制.现在目前都在使用桥接芯 ...
- USB2.0学习笔记连载(十九):EZ-USB TRM手册重要部分介绍
TRM手册中给出了所有的寄存器配置,在 slave fifo模式或者 GPIF模式等,所以对于用到的各种寄存器配置需要查看此手册,当然还可以配合着应用手册<AN61345>. ...
- USB2.0学习笔记连载(十七):keil实现寄存器的配置及相关函数讲解(一)
首先要实现对寄存器的配置,可以参考手册<Development kit User Guide>,如下图所示: 此文件包含在 文件中.上述的应用文档详细介绍了如何利用KEIL实现对固件程序 ...
- USB2.0学习笔记连载(六):USB2.0硬件设计需要注意事项
笔者在设计USB2.0时找到了一个官方给的硬件设计正确设计指南,其中有些内容还挺nice的.不单单只是USB的设计,其中有些思想可以应用到其他的场合中. 对于USB2.0而言,全速状态下可以达到480 ...
- USB2.0学习笔记连载(五):EZ-USB重要寄存器的配置
本篇博客主要讲解EZ-USB一些重要寄存器的配置,首先对于本篇博客所讲的内容,读者应该到官网上去下载相关的手册,其中包括<EZ-USB Technical Reference Manual> ...
- USB2.0学习笔记连载(四):安装Cypress官网套件
上一篇博客大概讲了一下USB通用驱动程序的解析.笔者使用Cypress官网给定的资料去完成USB驱动开发.官网资料地址:http://www.cypress.com/?rID=14321 下载如下图的 ...
随机推荐
- GO1.6语言学习笔记1-基础篇
一.GO语言优势 可直接编译成机器码,Go编译生成的是一个静态可执行文件,除了glibc外没有其他外部依赖 静态类型语言,但是有动态语言的感觉 语言层面支持并发.Goroutine和channel ...
- codeforces #296 div2 (527C) STL中set的运用
题意:在一块H*M的玻璃上每次划一刀(仅仅能水平或竖直).输出每次划开之后剩下的玻璃中面积最大的一块的面积. 做题的时候.觉得这么大的数据量,有每次查询输出,应该是数据结构的内容. 这道题能够用STL ...
- 局域网不同用户同时登录同一个网站,会出现session乱窜的问题
出现这种问题的情景再现: 1.有一部分人访问网站会出现session乱窜的问题. 2.这部分人是在同一个局域网中. 3.不同菜单看到的信息是不同人的,或者同一个菜单翻页时有的时候看到的是自己的数据,有 ...
- jenkins 发送邮件模板
jenkins 发送邮件模板 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...
- 编程中的幂等性 — HTTP幂等性
幂等(idempotent.idempotence)是一个数学与计算机学概念,常见于抽象代数中. 在编程中.一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同.幂等函数,或幂等方法, ...
- unity, 延迟执行代码
使用协程实现比较方便,可以带参数. void Start(){ StartCoroutine(delayLaunchRocket(rocket,2.0f)); } IEnumerator delayL ...
- JavaScript:零星知识
1. 关于document.write() 如果在文档已完成加载后执行 document.write,整个HTML 页面将被覆盖. 2. 对代码行进行折行 您可以在文本字符串中使用反斜杠对代码行进行换 ...
- Socket网络编程 详细过程(转)
我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠so ...
- ISE联合modelsim功能仿真和综合后仿真
1.代码输入 (1).新建一个ISE工程,名字为count4. (2).新建一个verilog文件 (3).选择verilog module 输入file name为count4,单击next默认知道 ...
- IServerChannelSinkProvider
(一) Remoting框架图 这是msdn上关于Remoting客户端与服务器端进行通信的示意图.客户端与服务端的通信是通过发送消息来实现的.消息的处理是由客户端,服务端创建的一系列的通信信道来处理 ...