USB2.0学习笔记连载(三):通用USB驱动程序解析

对于USB驱动的开发,读者可以使用Windows DDK、DriverStudio等多种开发工具来实现USB的驱动,但是驱动程序的开发过程都比较复杂,而且很容易致使USB主机内存泄露而死机。那么对于笔者这样喜欢做硬件的研发对软件不是很感冒的孩纸,怎么快速上手开发出USB驱动。其实很多USB芯片公司已经给很多用户提供了开发包,譬如笔者使用的Cypress公司提供的开发包image可以满足广大用户的要求,这一点还是值的称道的,关于后续怎么使用这些开发包进行USB2.0驱动的开发,笔者会在后续的博客中一一写出。

那么在完成USB驱动之前,先了解一下USB驱动程序的架构。

笔者之前没有了解过USB驱动,但自己时常在想,我将USB设备到电脑的USB接口上,那么主机会识别我这个设备,进行驱动安装,然后进行通信和管理,那么这个过程是如何去实现的呢?

带着这个问题,笔者搜索了一些资料。

USB设备的驱动程序是USB主机应用程序与USB外部设备之间沟通的桥梁,高校的USB驱动程序是USB设备研发的关键。那么驱动程序中最关键的两个文件,一个是驱动程序文件(*.sys):硬件设备驱动程序的核心文件,提供了应用程序与外部硬件设备通信信道和方法,另外一个是设备信息文件(*.inf):包含了相应的硬件设备及其驱动程序的详细信息,这些信息包括硬件设备名称、使用什么驱动程序文件,硬件设备信息在系统注册表中的存储等等。一个驱动程序需要配合一个inf文件才可以进行安装。

由上面可以看出,驱动程序有两个文件必须配合使用,(*.sys)和(*.inf)。让我们回顾一下USB设备的安装过程,如下图所示:

image

首先主机检测到USB设备后,需要对USB设备进行检索安装。这个安装过程就是在寻找对应USB设备ID的(*.inf)文件,若是主机自动检索中找到了(*.inf)文件,会显示安装成功,若是找不到该inf文件,那么会提示找不到驱动,这时候需要手工进行(*.inf)文件的配置。可见inf文件里面的配置信息也是至关重要的,下图是笔者随便打开的一个驱动的inf文件。对于inf文件里面有什么信息呢?哪些我们用户可以修改?各个信息是什么意思呢?

image

inf文件包括三个重要部分:节(section),键(key),值(value),如上图所示的[version]就是一个节,class是键,USB是给键class的值。每个节下面可以包含过个键和值;如上图所示。

那么上图中对应各节是什么意思呢?

Version:版本节,在 INF 文件的开始,主要用于版本控制和版本描述信息。

Version版本节一般位于inf文件的开始,重要用于版本控制,主要包括内容如下图示:image signature :定义了该inf文件需要在何系统下运行,一般有下面几个操作系统版本

 $Windows NT$
 $Chicago$
 $Windows 95$

class用来说明驱动程序所属的类别,常用的类别如下:

image

image

classGUID一般是固定值,如下图所示:

image

image

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"

posted @ 2015-12-18 22:24  raymon_tec  阅读(5851)  评论(2编辑  收藏  举报