设为首页 加入收藏

TOP

USB2.0学习笔记连载(三):通用USB驱动程序解析(一)
2017-10-10 12:26:08 】 浏览:7766
Tags: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 时

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇USB2.0学习笔记连载(四):安装Cy.. 下一篇《FPGA全程进阶---实战演练》之搞..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目