zoukankan      html  css  js  c++  java
  • 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,System32Drivers
    HTDGHUsb.Files.Ext = 10,System32Drivers

    字符串节(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"

  • 相关阅读:
    验证码生成程序
    会话技术Cookie&Session
    jsp基础、el技术、jstl标签、javaEE的开发模式
    js原生的Ajax
    java基础-反射
    hibernate 联合主键 composite-id
    在ubuntu18 安装nginx过程,以及遇到的错误!
    报错解决:error: this statement may fall through [-Werror=implicit-fallthrough=]
    nginx.conf中关于nginx-rtmp-module配置指令详解
    搭建Nginx+nginx-rtmp-module的hls流媒体服务器并用OBS进行推流
  • 原文地址:https://www.cnblogs.com/raymon-tec/p/5058365.html
Copyright © 2011-2022 走看看