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"


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM