USB系列七:通用USB驱动程序解析(重要)

USB设备的驱动程序是USB主机应用程序与USB外部设备之间沟通的桥梁,高效的USB驱动程序开发是USB设备研发的关键。用户可以使用WindowsDDK、DriverStudio等多种工具来开发USB设备驱动程序,但驱动程序的开发过程都比较复杂,而且很容易致使USB主机内存泄漏而死机。

一、驱动程序文件简介

在Windows操作系统中,一个硬件设备的驱动程序是由驱动程序文件(*.sys)和相应的INF文件(*.inf)来描述的。

驱动程序文件(*.sys):硬件设备驱动程序的核心文件,提供了应用程序与外部硬件设备的通信通道和方法。

INF文件(*.inf):即DeviceInformationFile(设备信息文件),用来指示安装Windows驱动程序(*.sys)。INF文件包含了相应的硬件设备及其驱动程序的详细信息,这些信息包括硬件设备名称、使用什么驱动程序文件,硬件设备信息在系统注册表中的存储等等。

一般来说,一个硬件设备的Windows驱动程序需要配合一个INF文件才可以进行安装虽然INF文件后缀名为*.inf,但INF文件本质上是文本类型的文件,可以使用记事本、UltraEdit等软件工具打开、查看以及执行编辑操作。INF文件可以确保硬件设备能够在连接到计算机主机的时候被正确地配置。USB设备也就是采用这种驱动程序形式来完成安装、识别和通信操作的

1、USB设备驱动程序安装

USB设备驱动程序的安装,大致经历如下几个步骤,如图14.1所示:

(1)首先,在Windows操作系统中插入USB硬件设备。此时操作系统发现新硬件,驱动程序会自动搜索驱动程序,如果搜索不到合适的驱动程序,将提示用户给予一个合适的驱动程序。

(2)用户安装提示指定一个驱动程序。这里其实指示的是该驱动程序的INF文件,该文件中包含了该USB硬件设备的全部信息。

(3)操作系统读取INF文件中的硬件ID,并与USB硬件设备的ID进行比对,如果符合则安装此驱动,否则将提示用户重新指定驱动程序INF文件。

(4)对于符合该硬件的驱动程序,操作系统将驱动程序文件(*.sys)和相应的INF文件复制到指定的系统目录中。

(5)操作系统按照INF文件的指示,将USB硬件设备的一些基本信息保存在操作系统注册表中。(6)最后,重新启动操作系统便可以完成USB硬件设备驱动程序的安装。重新启动之后,USB设备便可以正常工作。注意:最后一步重新启动系统并非必须的,有的设备无需重新启动也可以进入正常工作状态。

2、USB设备的识别

在Windows操作系统中,当USB设备连接到计算机上的时候,操作系统将检测到USB设备的连接。然后将系统中所有的INF文件中的数据信息与该USB设备进行比较,逐个找到与之相符合的INF文件。USB设备的识别过程如图14.2所示,大致可以分为如下几个步骤:

(1)首先,在Windows操作系统中插入USB硬件设备。此时操作系统发现新硬件

(2)Windows操作系统读取USB硬件ID,包括设备描述符的供应商字段(idVender)和产品字段(idProduct)。

(3)然后在操作系统内查找与该硬件ID相符合的INF文件。如果不存在,则系统提示用户自己安装该USB设备的驱动程序。

(4)如果找到符合的INF文件,将加载对应的驱动程序文件,并为该硬件设备分配指定的硬件资源。此时USB设备便可以正常工作。

二、驱动程序INF文件的结构

虽然对于USB硬件设备来说,驱动程序文件(*.sys)是核心,但是该文件对于用户来说是不可读的。相反,用户可以读取INF文件(*.inf)的内容,来了解驱动程序的信息。因此,INF文件便成为用户了解驱动程序功能的主要对象。

INF文件其实是一个文本格式的文件,在Winodws操作系统下用来描述设备或文件等数据信息。INF文件是由标准的ASCII码组成,您以用任何一款文字编辑器查看修改其中的内容,例如记事本、UltraEdit等等。

我们可以将INF文件看成是Windows系统底下的超强批处理,其功能非常强大,几乎能完成日常操作的所有功能。

INF文件的结构包括节(Sections),键(Key)和值(value)三部分。其中,INF文件的节(Sections)以方括号的形式开始,并按照层次结构排列。INF文件的节(Sections)后面紧跟该节中的各个项,也就是键(Key)和值(value)。INF文件的节中各项的基本定义格式如下:

Key=value[,value…]其中,各个参数的含义如下:

Key:代表项目名称,也就是键(Key)。

Value:表示项目的值,也就是值(value)。

注意,在INF文件中,所有名称都不区分大小写。Windows操作系统中的INF文件可以包含多个节(Sections),每个节(Sections)下可以包含多个键(Key)和值(value)。INF文件中的主要节包括如下几类:

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

DestinationDirs:目标磁盘节,用于指定驱动安装的系统路径信息。

SourceDisksNames:源文件盘符节,用于指定源盘信息。

SourceDisksFiless:源文件节,用于指定源盘文件名。

DefaultInstall:默认安装节,表示开始执行安装以及安装过程的各项操作。

Manufacturer:供应商节,指明供应商及其对应的Models节的名称

Strings:字符串节,用于常量定义,包含多个字符串信息。

Models:Models节,用于指明Install/DDInstall节的名称,设备的硬件ID等信息。

1、版本节(Version)

版本节(Version)一般位于INF文件的开始,主要用于版本控制。

版本节中描述了该驱动程序的主要版本信息。版本节(Version)包括很多项,其中最主要的是Signature项、Class项、ClassGUID项、Provider项、LayoutFile项、CatalogFile项和DriverVer项这几项。

1.1、Signature项

版本节(Version)的Signature项定义了该INF文件需要运行在何种操作系统版本中,有如下值可供选择:

$WindowsNT$

$Chicago$

$Windows95$一般来说,版本节(Version)的Signature项选择$Chicago$即可。

1.2、Class项

版本节(Version)的Class项用于指明驱动程序所属的类别。在Windows系统下,为每个类型的设备指定了一个类别名称,如表14.1所示。

1.3、 ClassGUID 项

版本节(Version)的 ClassGUID 项用于指明设备驱动程序类别的 GUID,对于常用的设 备类别其 GUID 值是固定的。在 Windows 系统中,常用设备类别的 GUID 值如表 14.2 所示。 说 明 : 关 于 更 为 详 细 的 介 绍 , 读 者 可 以 参 阅 Microsoft MSDN 的 官 方 网 站 http://msdn2.microsoft.com/en-us/library/ms791134.aspx。

1.4、Provider项

版本节(Version)的Provider项用于指明该驱动程序INF文件的供应商名称。

1.5、LayoutFile项

版本节(Version)的LayoutFile项比较特殊,其仅在Windows操作系统内部提供的INF文件中使用,供应商提供的INF文件一般不使用。

1.6、CatalogFile项

版本节(Version)的CatalogFile项,用于指明驱动程序数字签名文件的文件名,其扩展名为.cat。

1.7、.DriverVer项

版本节(Version)的DriverVer项,用于指明该驱动程序的版本信息。版本的格式为mm/dd/yyyy[,x.y.v.z]。其中

mm/dd/yyyy:表示月/日/年。

x.y.v.z:表示驱动程序的版本号。这里需要注意的是,虽然版本节(Version)可以有很多项,但是所有的INF文件都必须包含Version节和Signature项。典型的版本节(Version)的示例代码如下:

2、源文件盘符节(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)的示例代码如下:

3、源文件节(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)的示例代码如下:

4、供应商节(Manufacturer)

供应商节(Manufacturer)用于指明供应商及其对应Models节的名称。供应商节(Manufacturer)中各项的语法格式如下:%StrKey%=Models-Name其中各项的含义如下:

StrKey:表示设备制造商的名称,其字符串的值在String节中定义;
Models-Name:指明了Models节的名称。典型的供应商节(Manufacturer)的示例代码如下:

[Manufacturer]

%MFGNAME%=Cypress

5、默认安装节(DefaultInstall)

默认安装节(DefaultInstall)指明添加注册表的子节,等号后面的为自定义节名。默认安装节(DefaultInstall)包含如下几项:

LogConfigLog,表示日志文件配置;

Copyfiles,表示复制文件;

Renfiles,表示文件改名;

Delfiles,表示删除文件;

UpdateInis,表示更新Inis;

UpdateIniFields,表示更新Ini字段;

AddReg,表示添加注册项;

DelReg,表示删除注册项;

Ini2RegIni,表示文件转换为Reg文件;

6、字符串节(String)

字符串节(String)中用于定义字符串变量。字符串节(String)长用于在INF文件中频繁地出现某些字符串的场合。此时使用一个字符串变量来代替,可以达到简化输入的目的。然后用该字符串变量代表该字符串出现在INF文件中。其定义格式如下:StrKey=”String”其中各项的含义如下:StrKey表示字符串的名称,其由数字和字母组成。

String表示字符串的内容。典型的字符串节(String)的示例代码如下:

  • 42
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C 语言中的 USB 通信序主要涉及到 USB 接口的建立和数据传输的实现。以下是一个常见的 USB 通信序的步骤: 1. 引入 USB 库文件和头文件。C 语言需要引入与 USB 相关的库文件和头文件,以便后续编写通信序时可以调用相关函数和方法。 2. 初始化 USB 接口。USB 接口的初始化需要建立连接并配置相应参数,包括设备地址、端口号、通讯速率、数据位数、停止位数和校验方式等,不同的设备要求的初始化操作也有所不同。 3. 实现数据传输。通过USB接口实现数据的传输需要编写相关的数据传输函数和数据接收函数。数据的传输可以使用 USB 通用传输协议(USB Generic Transfer Protocol,简称 UGTP),在不同的操作系统和设备上的实现方式也有所不同。 4. 处理通信错误。USB 通信过中可能会出现传输错误或其他异常情况,需要对错误进行诊断和处理,避免影响通信服务质量。 5. 对接 USB外设。在 C 语言中,需要进行 USB 外设的驱动程序开发和测试。在开发过中,可以采用静态调试和动态调试相结合的方式进行测试,有效提高开发效率。 总之,C 语言的 USB 通信序实现需要详细了解 USB 通信协议、设备的硬件和软件要求、以及数据传输和接收相关的函数和方法,才能编写出高品质的 USB 通信序。 ### 回答2: C语言的usb通信序需要借助操作系统提供的相关库函数来实现。一般情况下,Windows操作系统提供的平台sdk里就包含了usb库函数,C语言编写的usb序可以通过调用这些库函数来实现usb通信。主要步骤如下: 1. 扫描USB设备:使用WinUSB命令格式,尝试与USB设备通信,获取设备PID和VID信息,确认通信协议和说明书。 2. 创建USB设备连接:打开USB设备文件,使用WinUSB库函数的CreateFile()创建USB设备连接。 3. 发送数据:按照USB协议规定的格式,构造数据包并使用WinUSB库函数WriteFile()发送数据包到USB设备。 4. 接收数据:使用WinUSB库函数ReadFile()读取USB设备发送的数据包,并对其进行解析和处理。 5. 关闭USB连接:使用WinUSB库函数CloseHandle()关闭USB设备连接,释放占用的系统资源。 需要注意的是,由于不同的USB设备可能采用不同的通信协议和数据格式,因此编写USB通信序需要有比较深入的了解和掌握相关技术。此外,为了提高序运行效率和可靠性,还需要开发人员具备较强的调试和优化能力。 ### 回答3: C的USB通信序主要包括初始化USB设备、读写数据的操作以及终止USB设备等几个部分。其具体实现步骤如下: 1. 初始化USB设备 首先,需要通过USB控制器的驱动程序USB设备初始化。该初始化过包括连接USB设备并识别其类型、配置USB接口及其传输协议等。在初始化完成后,序就可以通过USB接口与设备进行数据传输。 2. 读写数据操作 在USB通信中,数据读写分别通过IN和OUT两种方向进行。对于IN操作,数据从设备端传输到主机端,主机通过向设备发送控制请求来触发读操作;对于OUT操作,数据是从主机端传输到设备端,主机发送写操作请求来进行传输。在具体实现时,需要根据设备接口类型与传输方式来编写读写操作的代码。 3. 终止USB设备 在通信结束后,需要断开与USB设备的连接并释放资源。此时需要将USB设备设为非活动状态,关闭USB控制器,释放可能已分配的内存等。 总的来说,C的USB通信序需要部分硬件和驱动支持来实现。在编写具体代码时,需要深入理解USB协议及其细节,并正确使用相关的库函数或API接口,才能完成与USB设备的稳定数据传输。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值