对于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驱动程序解析的更多相关文章

  1. USB2.0学习笔记连载(十四):USB驱动安装及固件程序的编写

    在之前的博客中已经讲过,驱动程序最核心的两个文件,一个是xxx.sys文件,一个是xxx.inf文件,主机是寻找xxx.inf文件. 在下面的文件中有相关关于USB驱动的说明.对于用户来说,xxx.s ...

  2. USB2.0学习笔记连载(九):USB设备驱动的安装

    在第一次插入USB设备时(笔者用的是自己做的USB最小系统来测试),插入电脑后,在设备管理器中会显示 未知设备,如下图所示: 点击右键,选择属性,在详细信息中可以看到硬件ID以及PID等,如下图所示. ...

  3. USB2.0学习笔记连载(二):USB基础知识简介

    USB接口分为USB A型.USB B型.USBmini型.USBmicro型.USB3.0其中每种都有相应的插座和插头. 图1 图2 上图是USBA型接口,图1为插座,图2为插头.插座指向下行方向, ...

  4. USB2.0学习笔记连载(一):CY7C68013特性简介

    上一篇博客已经给出了整个视频板卡架构,那么对于USB接口部分需要着重理解和学习. 对于目前来说,若是利用FPGA去模拟USB2.0内核,难度还是挺大的,整个状态的收发都不好控制.现在目前都在使用桥接芯 ...

  5. USB2.0学习笔记连载(十九):EZ-USB TRM手册重要部分介绍

        TRM手册中给出了所有的寄存器配置,在 slave fifo模式或者 GPIF模式等,所以对于用到的各种寄存器配置需要查看此手册,当然还可以配合着应用手册<AN61345>.   ...

  6. USB2.0学习笔记连载(十七):keil实现寄存器的配置及相关函数讲解(一)

    首先要实现对寄存器的配置,可以参考手册<Development kit  User Guide>,如下图所示: 此文件包含在 文件中.上述的应用文档详细介绍了如何利用KEIL实现对固件程序 ...

  7. USB2.0学习笔记连载(六):USB2.0硬件设计需要注意事项

    笔者在设计USB2.0时找到了一个官方给的硬件设计正确设计指南,其中有些内容还挺nice的.不单单只是USB的设计,其中有些思想可以应用到其他的场合中. 对于USB2.0而言,全速状态下可以达到480 ...

  8. USB2.0学习笔记连载(五):EZ-USB重要寄存器的配置

    本篇博客主要讲解EZ-USB一些重要寄存器的配置,首先对于本篇博客所讲的内容,读者应该到官网上去下载相关的手册,其中包括<EZ-USB Technical Reference Manual> ...

  9. USB2.0学习笔记连载(四):安装Cypress官网套件

    上一篇博客大概讲了一下USB通用驱动程序的解析.笔者使用Cypress官网给定的资料去完成USB驱动开发.官网资料地址:http://www.cypress.com/?rID=14321 下载如下图的 ...

随机推荐

  1. Android中判断网络连接是否可用及监控网络状态

    Android中判断网络连接是否可用及监控网络状态 作者: 字体:[增加 减小] 类型:转载 获取网络信息需要在AndroidManifest.xml文件中加入相应的权限,接下来详细介绍Android ...

  2. opencv源代码分析:icvGetTrainingDataCallback简单介绍

    /* *函数icvGetTrainingDataCallback介绍 *功能:对全部样本计算特征编号从first開始的num个特征,并保存到mat里. *输入: *CvMat* mat矩阵样本总数个行 ...

  3. DNS与NS、NS记录

    DNS:人们习惯记忆域名,但机器间互相只认IP地址,域名与IP地址之间是一一对应的,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,整个过程是自动进行的. 当你的网站制作完成 ...

  4. [转载]Class-AB Amplifier 笔记

    Class-AB Amplifier 笔记 Reading Notes from Mikko Loikkanen “Design and Compensation of High Performanc ...

  5. Java的spi介绍和简单应用

    1.什么是java的spi SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制. 目前有不少框架用它来做服务的扩展发现, 简单来说,它就是一 ...

  6. 《Effective Java》读书笔记八(异常)

    No57 只针对异常的情况才使用异常 异常应该只用于异常的情况下,它们永远不应该用于正常的控制流. No58 对可恢复的情况使用受检异常,对编程错误使用运行时异常 Java程序设计语言提供了三种可抛出 ...

  7. 一些常见的关于Linux系统的问题

    1 如何看当前Linux系统有几颗物理CPU和每颗CPU的核数? 答:[root@centos6 ~ 10:55 #35]# cat /proc/cpuinfo|grep -c 'physical i ...

  8. android笔记-----消息提示

    在/res/values目录下的文件中定义要显示的字符串,主要是考虑到后期可能需要换成英文之类的 <string name="login_checkBlank">用户名 ...

  9. JDK自带工具之问题排查场景示例

    最近看到了大量关于java性能调优.故障排查的文章,自己也写了一篇< Java调优经验谈 >.接着此篇文章,其实一直打算写写一些常用调优工具以及它们的惯常用法的.后来在http://jav ...

  10. vim学习日志(5):vim下wimrc的配置,解决中文乱码问题

    解决linux下vim乱码的情况:(修改vimrc的内容) 全局的情况下:即所有用户都能用这个配置 文件地址:/etc/vimrc 在文件中添加: ,ucs-bom,gb18030,gbk,gb231 ...