第一章 WinDriver 概述 註 : 此手冊適用於使用 WinDriver 開發 PCI / PCMCIA / CardBus / ISA / EISA /CompactPCI / PCI Express 設備 WinDriver 亦支援 USB 設備的驅動開發, 請參閱 WinDriver U

Similar documents
The golden pins of the PCI card can be oxidized after months or years

TPM BIOS Infineon TPM Smart TPM Infineon TPM Smart TPM TPM Smart TPM TPM Advanced Mode...8

Autodesk Product Design Suite Standard 系統統需求 典型使用用者和工作流程 Autodesk Product Design Suite Standard 版本為為負責建立非凡凡產品的設計師師和工程師, 提供基本概念設計計和製圖工具, 以取得令人驚驚嘆

* 2

1

使用手冊

0 0 = 1 0 = 0 1 = = 1 1 = 0 0 = 1

Oxford iSolution下載及安裝指南

Microsoft Word zw

Microsoft Word - 封面.doc

4. 於 INF Processing Options 對話窗中, 選取 Automatic 後按 OK 5. 於 Import File 對話窗中, 按 Start Copyright by ICP DAS Co., Ltd. All rights are reserved. 2 / 12

CC213

epub83-1


1. Install the software Note: You should logon with administrator privileges to Windows 7, Vista or XP in order to install the software properly. You

投影片 1

一 產品說明 1. 誰需要使用 WinDriver? 硬體研發人員 : 使用 Driver Wizard 即可快速測試您的新硬體 軟體研發人員 : 使用 Driver Wizard 即可產生出硬體驅動程式編碼來驅動您的硬體, 使用 WinDriver 程式工具即可測試以及除錯您的驅動程式 2. Wi

10-2 SCJP SCJD 10.1 昇陽認證 Java 系統開發工程師 的認證程序 Java IT SCJD

EX-Z80

EK-STM32F

Oracle Solaris Studio makefile C C++ Fortran IDE Solaris Linux C/C++/Fortran IDE "Project Properties" IDE makefile 1.

封面-12

Microsoft Word - PS2_linux_guide_cn.doc

1 SQL Server 2005 SQL Server Microsoft Windows Server 2003NTFS NTFS SQL Server 2000 Randy Dyess DBA SQL Server SQL Server DBA SQL Server SQL Se

DeskJet F2180 DeskJet F4185 Deskjet F4280 DeskJet D2460 OK N/A N/A DeskJet 1660 OK ( 無提供 Win 2000 驅動 ) N/A N/A PSC 1315 Photosmart 2575 Photosmart C13

(Load Project) (Save Project) (OffLine Mode) (Help) Intel Hex Motor

1 IT IT IT IT Virtual Machine, VM VM VM VM Operating Systems, OS IT

Abstract arm linux tool-chain root NET-Start! 2

Bus Hound 5

ebook140-9

Symantec™ Sygate Enterprise Protection 防护代理安装使用指南

Oracle Oracle Solaris Studio IDE makefile C C++ Fortran makefile IDE Solaris Linux C/C++/Fortran Oracle IDE "P

SW cdr

indows CE 1996 Semiconductor Industry Association (SIA) Windows CE Windows Embedded CE 6.0 Windows CE Windows Embedded CE 6.0 Micr

Microsoft Word - Mail2000_SecurityPatch_

Mizuho Bank QR Code 匯出匯款申請書 ( 外匯用 ) 自動化 安裝手冊 ( 中文 ) 第 1 頁, 共 20 頁

網路安全:理論與實務 第二版

( )... 5 ( ) ( )

Measurement Studio Expands Your Test and Measurement Programming Power

SSL 數位憑證 OpenVPN 安裝說明

目 錄 版 次 變 更 記 錄... 2 原 始 程 式 碼 類 型 之 使 用 手 冊... 3 一 安 裝 軟 體 套 件 事 前 準 備... 3 二 編 譯 流 程 說 明

ebook 185-6

投影片 1

作 業 系 統 簡 介 光 有 電 腦 硬 體, 會 不 容 易 使 用 必 須 要 有 適 當 的 程 式, 才 方 便 操 作 硬 體 衍 生 作 業 系 統 需 求 : 提 供 方 便 使 用 者 執 行 程 式 平 台 有 效 使 用 各 種 電 腦 硬 體 資 源 Jingo C. Lia

Chapter 2

投影片 1

P4VM800_BIOS_CN.p65

<A4E2BEF7B4FAB8D5B3F8A F52322E786C7378>

第 15 章 程 式 編 写 語 言 15.1 程 式 編 写 語 言 的 角 色 程 式 編 寫 語 言 是 程 式 編 寫 員 與 電 腦 溝 通 的 界 面 語 法 是 一 組 規 則 讓 程 式 編 寫 員 將 字 詞 集 合 起 來 電 腦 是 處 理 位 元 和 字 節 的 機 器, 與

P4V88+_BIOS_CN.p65


投影片 1

ICD ICD ICD ICD ICD

桌上型個人電腦採購規格說明表

Windows 2000 Server for T100

單步除錯 (1/10) 打開 Android Studio, 點選 Start a new Android Studio project 建立專案 Application name 輸入 BMI 點下 Next 2 P a g e

目次 

AutoCAD 用戶如何使用 ArchiCAD

WebSphere Studio Application Developer IBM Portal Toolkit... 2/21 1. WebSphere Portal Portal WebSphere Application Server stopserver.bat -configfile..

Microsoft PowerPoint - SAGE 2010

桌上型個人電腦採購規格說明表

Ác Åé å Serial ATA ( Sil3132) S A T A (1) SATA (2) BIOS SATA (3)* RAID BIOS RAID (4) SATA (5) SATA (a) S A T A ( S A T A R A I D ) (b) (c) Windows XP

Mac 版之 Horizon Auton 系統安裝操作手冊 Page 1 of 25

11 for Server 教育版續約 for Server 教育版續約 套 5, for Virtual Host 教育版 for Virtual Host 教育版 套 29, for Virtual Host 教育版續約 for Virtual Host 教育版續約 套

Microsoft Word - LP doc

1.ai

<4D F736F F D20A7EBBCD0B6B7AABEAAFEA5F3322D3935A67EB2C432A6B8B2C433B2D5C5E3A5DCA564B357BD64AED12E646F63>

Microsoft Word - UserManualForEaton_SC.doc

ActiveX Control

2016 勒索軟體白皮書

電腦設備LP _第七組顯示卡規範書

PICkit2 燒寫器編程器調試器

JTAG ICE PC JTAG ICE JTAG ISP... 5 IDE AVR STUDIO JTAGICE JTAGICE... 12

T1028_Manual_KO_V3 0.pdf

桌上型個人電腦採購規格說明表

Acronis P.1 Acronis Anydata Engine P.2 P.4 Acronis Backup Advanced P.5 Acronis Backup Advanced for AP P.6 Vmware P.7 Acronis Backup P.8 IDC 80 % $20,0

Outlook 2010 設定說明 Offic 企業郵件 / 虛擬主機郵件 / Office 365

MSAC-EX1

Red Flag Linux Desktop 4.0 Red Flag Linux Desktop 4.0 1

<4D F736F F D20657A646C312D D30385FA670A6F3B35DA C A8C3B14EB8EAAEC6B04FBFFDA8ECBBB7BADDB8EAAEC6AE772E646F63>

Basic System Administration



mvc

RUN_PC連載_12_.doc

PowerPoint Presentation

LSI U320 SCSI卡用户手册.doc

IP505SM_manual_cn.doc

ebook140-8

Microsoft Word - 正文.doc

简 介 本 白 皮 书 高 度 概 述 了 支 持 移 动 互 联 网 设 备 (Mobile Internet Device) 的 Intel C++ Software Development Tool Suite for Linux* OS, 目 标 读 者 主 要 是 技 术 决 策 制 订

財金資訊-82期.indd

ARM JTAG实时仿真器安装使用指南

一个开放源码的嵌入式仿真环境 ― SkyEye

在 windows 7 執行 Freesurfer 之說明 心智影像研究中心葉丁瑞講授 下載軟體 : virtualbox4.3.40:

68369 (ppp quickstart guide)

Outlook 2007 設定說明 Offic 企業郵件 / 虛擬主機郵件 / Office 365

導讀 ASP.NET HTML ASP 第一篇 基礎篇第 1 章 認識 ASP.NET ASP.NET ASP.NET ASP.NET ASP.NET 第 2 章 認識 Visual Studio 20 開發環境 Visual Studio 20 Visual Studio 20 第二篇 C# 程式

Transcription:

目錄 第一章 WinDriver 概述..2 第二章了解設備驅動程式.9 第三章 WinDriver USB 概述 14 第四章安裝 WinDriver..22 第五章 DriverWizard 使用介紹.31 第六章開發驅動程式.40 第七章驅動程式除錯.43 第八章特別合作的晶片廠商....49 第九章 USB 傳輸 50 第十章動態加載驅動程式...59 第十一章發行驅動程式...62 第十二章安裝驅動程式 - 進階問題.. 71 1

第一章 WinDriver 概述 註 : 此手冊適用於使用 WinDriver 開發 PCI / PCMCIA / CardBus / ISA / EISA /CompactPCI / PCI Express 設備 WinDriver 亦支援 USB 設備的驅動開發, 請參閱 WinDriver USB 技術手冊 http://www.netguard.com.tw/saya_wd05.php 或者洽詢 Jugno 大中華地區代理商網護科技公司 windriver@netguard.com.tw 第 1.1 章 WinDriver 介紹 WinDriver 驅動程式開發工具可以大幅簡化設備驅動程式和訪問硬體設備的艱鉅任務 WinDriver 包括一個開發精靈和程式碼生成功能, 可以自動檢測您的硬體並生成適用的應用程式與驅動程式來訪問該硬體 驅動程式和應用程式開發使用 WinDriver 的源代碼與庫函數,WinDriver 的原始碼在所有支援的操作系統上都兼容 Binary 程式則可以在整個 Windows8/7/Vista/Server2008/Server2003/XP 的操作系統上兼容 匯流排的支援包括 :PCI/PCMCIA/CardBus/ISA/EISA/CompactPCI/PCI Express,PCMCIA 只有在 Windows 上支援 CardBus, ISA, and EISA 則只有在 Windows, Windows CE ( 包含 Windows Mobile), 與 Linux 支援 使用 WinDriver 開發設備驅動程式, 僅需要幾週即可完成月 本手冊介紹大多數的 WinDriver 提供的高級用戶功能, 然而, 許多開發人員會發現, 閱讀本章以及 DriverWizard 和 Function Reference 章節, 即可成功地編寫出專屬的驅動程式 WinDriver 支援所有 PCI / PCMCIA / CardBus/ ISA/ EISA/CompactPCI/ PCI Express 晶片組的驅動程式開發, 並且更與知名的晶片廠商廠商合作提供特定的晶片組支援, 請參閱本手冊的第 7 章 本手冊的第 10 章介紹如何調整您的驅動程序代碼, 以達到最佳的性能, 特別強調 WinDriver 的 Kernel Plugin 功能 此功能允許開發人員在用戶模式下開發和調適整個設備驅動程式, 將程式碼性的關鍵部分移植到內核模式, 這樣的內核模式驅動程式將會實現最佳的性能, 而開發人員不需要犧牲易用的用戶模式開發 關於 Kernel Plugin 的詳細介紹, 請參閱本手冊的第 11 章 第 12 章 請瀏覽 Jugno 大中華地區代理商網護科技公司官網 www.netguard.com.tw 以了解 WinDriver 的最新版本資訊 第 1.2 章背景第 1.2.1 章工程師面臨的挑戰 在受保護的作業系統中, 例如 :Windows 和 Linux, 工程師不能直接從應用程序中 ( 用戶模式 ) 存取硬體 硬體通常只能使用軟體模組來調用設備驅動程式進而與作業系統 ( 內核模式或 Ring-0) 做存取 為了從應用程式中存取客戶的硬體設備, 工程師必須做到下列步驟 : 學習作業系統內部工作原理與架構 學習如何攥寫設備驅動程式 學習在內核模式中, 開發 / 除錯的新工具 (WDK, ETK, DDI/DKI) 撰寫內核模式的基本硬體設備輸入 / 輸出程式碼 撰寫用戶模式下的應用程式, 並透過內核模式的硬體設備驅動程式來存取硬體設備 針對各種不同的操作系統平台, 重複上述第一點至第四點之步驟 2

第 1.2.2 章 WinDriver 解決方案 簡單開發 :WinDriver 支援 Windows Windows CE 與 Linux, 工程師可以在短時間內創建一個 PCI/PCMCIA/CardBus/ISA/EISA/CompactPCI/PCI Express 的基礎設備驅動程式,WinDriver 也允許您在熟習的應用程式開發介面下創建並編寫您的驅動程式, 可以使用 MS Visual Studio, Borland C++ Builder, Borland Delphi, Visual Basic 6.0, MS embedded Visual C++, MS Platform Builder C++, GCC, Windows GCC, 或其他任何適當的編譯器或開發環境 您不需要具有任何的設備驅動知識, 也不需要了解操作系統內部架構與內核知識, 也不用學習使用 DDK ETK DDI/DKI 平台轉移 : 使用 WinDriver, 創建的驅動程式可運行在 Windows 8 / 7 / Vista /Server 2008 / Server 2003 / XP, Windows CE (a.k.a. Windows Embedded Compact) 4.x 7.x(including Windows Mobile) 與 Linux 換句話說, 您只需撰寫一次, 便可以在多種平台上使用 易使用的自動化介面 :DriverWizard 是圖形化的診斷工具, 可以幫助您查看 / 定義設備的資源並且與硬件存取測試, 只需點擊幾下鼠標, 不用寫任何的程式碼 一旦設備如您預期的正確運行,DriverWizard 便可創建骨架驅動程序的原始代碼, 提供您存取硬體設備上所有資源的功能 Kernel-Mode 的高效能 : 若您的 WinDriver 驅動程序需要的內核模式性能,WinDriver 提供效能優化的 Kernel Plugin 此功能可以讓您在用戶模式創建和調配程式碼, 同時可以使某些運行性能的關鍵部分程式碼 ( 例如 : 中斷處理, 或訪問 I / O 映射內存範圍 ) 在內核模式中運行, 從而實現內核模式性能 ( 零性能退化 ) 此獨特的功能允許開發人員在 OS 內核運行用戶模式代碼, 而無需了解內核是如何工作 有關此功能的詳細介紹, 請參閱本手冊的第 11 章 Kernel Plugin 並不支援 Windows CE, 在此作業系統中, 內核模式和用戶模式之間沒有分別, 因此不使用 Kernel Plugin 便可實現最佳性能 為了提高在 Windows CE 的中斷處理效率, 請參考本手冊的第 9.2.8.1 章節 第 1.3 章 WinDriver 可以運行多快? 使用 WinDriver Kernel Plugin 絕對可以達到跟使用客製的內核驅動一樣的速度, 傳輸量的速度是由作業系統與硬體的極限所限制 簡單估計來說, 使用 WinDriver Kernel Plugin 可以達到約每秒十萬個中斷處理的速度 第 1.4 章結論 只需要依照以下步驟, 便可以創建一個可以存取硬體設備的應用程式 : Step 1. 開啟 DriverWizard, 偵測硬體的所有資源 Step 2. 使用 DriverWizard 自動生成骨架驅動程式碼, 若使用 WinDriver 特殊合作晶片廠商的範例程式, 請參閱本手冊的第七章 Step 3. 根據您的需求修改用戶模式中的應用程式, 亦可依據需要使用或刪除骨架 / 範例程式中的取樣功能, 以便根據您的需求完成您所需的驅動程式 您的硬件訪問應用程式將可運行在所有支援的平台 - 只需在目標平台重新編譯該程式碼 該程式碼是 binary 並且兼容於 Windows8/7 / Vista/ Server 2008/sever 2003 / XP 各平台 ; 在上述的平台做移植時, 不需要另外的程式碼編寫 3

第 1.5 章 WinDriver 優勢 簡單的用戶模式驅動程式開發 高性能的驅動程式内核組件 Kernel Plugin 容易使用的 DriverWizard, 無須編寫任何一行程式碼, 即可存取測試硬體設備 自動生成驅動程式的 project 檔, 可自行選擇 C, C#, Delphi (Pascal), or Visual Basic 6.0. 支援任何的 PCI/PCMCIA/CardBus/ISA/EISA/CompactPCI/PCI Express 設備, 不限定製造商 與知名大廠的晶片組合作, 使得開發者在開發該廠晶片時, 不須特別研究該硬體資訊 產生應用程式的原始碼, 並且可在所有支援的平台上移植, 例如 :Windows 8/7/Vista/Server 2008/Server 2003/XP, Windows CE (a.k.a. Windows Embedded Compact) 4.x 7.x (including Windows Mobile) 與 Linux 使用常見的開發環境, 包括微軟的 Visual Studio,Borland C++ Builder,Borland Delphi,Visual Basic 6.0,MS embedded Visual C ++,MS Platform Builder C ++,GCC,Windows GCC, 或任何其他合適的編譯器 / 環境 不需要 WDK ETK DDI 若任何操作系統內部的開發知識, 便可以輕易上手使用 支援 I/O DMA 中斷處理以及記憶體應設範圍的存取 支援多種的 CPUs, 以及多種的 PCI 匯流排平台 (PCI / PCMCIA / CardBus / ISA /EISA / CompactPCI / PCI Express) 支援 64 位元 PCI 資料傳輸 包含動態驅動加載 DDL 全面的技術文件與教學檔案 詳細的 C,C#,Delphi (Pascal), 或 Visual Basic 6.0 範例 具備 WHQL 認證能力的驅動 ( 只在 Windows) 中文的永久技術支援服務 不需要運行時間費用與權利金 4

第 1.6 章 WinDriver 架構 圖 1.1 WinDriver 架構 對於硬體存取, 您的應用程式會調用用戶模式的 WinDriver 函數, 而用戶模式的函數則調用 WinDriver 內核, 接著透過作業系統的調用來存取您的硬體設備 WinDriver 會以最低限度影響您的代碼性能, 即使它是運行在用戶模式 然而, 一些硬體驅動程式具有較高的性能要求, 在用戶模式下是無法達成此效能的 因此在簡單的創建並除錯您的代碼後, 您可以將程式碼中關鍵的效能部分 ( 例如 : 硬體中斷處理 ), 使用 WinDriver Kernel Plugin, 讓 WinDriver 在內核模式調用此模組, 進而實現最大效能 因此, 您可以在用戶模式下編碼並除錯, 並在需要的程式碼中實現內核的性能 Kernel Plugin 無法在 Windows CE 上實現, 因為此作業系統並沒有將用戶模式與核心模式分開, 因此可在不使用 Kernel Plugin 的情況下, 便可以達到最佳效能, 若要在 Windows CE 上增進中斷處理效能, 請參閱本手冊的第 9.2.8.1 章節 第 1.7 章 WinDriver 支援平台 WinDriver 支援下列的操作系統 : Windows 8/7/Vista/Server 2008/Server 2003/XP, 之後統稱 Windows Windows CE (a.k.a. Windows Embedded Compact) 4.x 7.x (including Windows Mobile), 之後統稱 5

Windows CE Linux 相同的原始碼在目標平台重新編譯後便可運行在所有支持的平台 原始碼可以兼容於 Windows8/7 / Vista/ Server 2008 中 / sever 2003 / XP; WinDriver 編譯後執行檔, 可以直接在上列的 Windows 平台移植, 不需要重新編譯 即使您的驅動程式, 只支援其中一種作業系統, 使用 WinDriver 將會大大增加您的靈活性, 不同的平台只需要移植並且重新編譯, 便可將您的驅動程式支援一個新的平台 第 1.8 章各種試用版本的限制 WinDriver 試用版並沒有功能上的限制, 試用版與正式版的差異如下 : 每次啟用 WinDriver 時, 會顯示未註冊的提醒視窗 當使用 DriverWizard, 在每次與硬體做存取互動時, 將會顯示一個試用訊息 在 Linux 與 Windows CE 版本的 WinDriver, 每次運行只能維持 60 分鐘, 超過後必須重新啟動 Windows 試用版期間為安裝的三十日內 第 1.9 章我該如何使用 WinDriver 進行開發第 1.9.1 章在 Windows 與 Linux 上 1. 開啟 DriverWzard 並診斷您的硬體設備 2. 使用 DriverWizard 來生成骨架驅動程式碼, 或使用 WinDriver 合作廠商之範例程式碼做為您的基礎應用程式 3. 依據您的應用需求, 修正該生成 / 範例之程式碼為您的驅動程式 4. 在用戶模式下, 針對您的驅動程式執行並除錯 5. 若您的程式包含關鍵效能的章節, 請參閱本手冊的第十章, 以增進您程式的效能 註 : 利用 DriverWizard 所生成的程式, 僅包含基礎的診斷應用程式, 例如 : 針對硬體設備資源與自訂 ( 包含客戶自訂的暫 存器 ) 的讀寫功能, 以及中斷監聽等 第 1.9.2 章在 Windows CE 1. 將您的硬體設備接入 Windows 開發主機 2. 使用 DriverWizard 偵測您的硬體設備 3. 讓 DriverWizard 生成您的骨架驅動程式碼 4. 使用 MS embedded Visual C++ 修改您的程式碼以符合您的需求, 若您使用 MS 平台 Builder, 並且將生成的 *.pbp 加 入至您的 workspace 5. 在您的嵌入式 Windows CE 平台上, 測試您的設備 6

註 : 若您無法將硬體接入 windows 開發主機上, 您仍可以使用 DriverWizard 來為硬體設備生成該程式碼, 但您需要手動將 硬體設備資源輸入到 Wizard 中 在 DriverWizard 生成代碼後, 並使用串型接口來測試您的硬體設備, 確認生成的程式碼動作正常後, 修改該程式碼以符合您的需求, 您也可以使用或結合其他的範例程式至您的骨架驅動程式中 第 1.10 章 WinDriver 工具包素材 本手冊的電子檔 WinDriver 的模組 WinDriver 應用程序 晶片組特殊支援 API 範例文件 第 1.10.1 章 WinDriver 模組 WinDriver (WinDriver/include): 通用的硬體存取工具包, 主要文件為 : windrvr.h:windriver 基本 API 的聲明和定義 wdc_lib.h 與 wdc_defs.h:windriver Card(WDC) 函式庫得聲明和定義, 它提供用來存取 PCI/ PCMCIA / CardBus/ ISA / EISA /CompactPCI/ PCI Express 設備的 API 簡便包 windrvr_int_thread.h: 簡便的包裝功能定義, 用以簡化中斷處理 windrvr_events.h: 處理隨插即用與電源管理的 API 聲明 utils.h: 通用的應用函式聲明 status_strings.h: 用來將 WinDriver 狀態程式碼轉換為描述錯誤字串的 API 聲明 DriverWizard (WinDriver/wizard/wdwizard): 圖形化的應用程式, 供您診斷您的硬體設備, 並且為您生成骨架驅動程式碼, 請參閱本手冊的第四章以獲得更多資訊 ) Debug Monitor: 蒐集您驅動程式運行時資訊的除錯工具, 此工具可以是一個完整的圖形化介面應用程式 : WinDriver/util/wddebug_gui, 或是一個控制台模式應用程式 :WinDriver/util/wddebug 由於 Windows CE 沒有支援令行提示字元下執行, 所以控制台模式的版本也支援在 Windows CE 平台上以圖形化執行 WinDrive 發行包 (WinDriver/redist): 此資料夾包含發行驅動時所需要之檔案 WinDriver Kernel Plugin: 創建內核模式的 Kernel Plugin 驅動程式時, 所需要的檔案與範例 技術手冊 : 各種完整的 WinDriver 技術手冊, 可以在 WinDriver/docs 中找到 第 1.10.2 章應用程式 pci_dump.exe (WinDriver/util/pci_dump.exe): 以獲取已安裝的 PCI 設備卡上鎖配置暫存器的轉存資料 pci_diag.exe (WinDriver/util/pci_diag.exe): 以讀寫 PCI 設備卡的配置暫存器, 存取 PCI 的 I/O 與記憶體範圍, 以及中斷處理的應用程式 pci_scan.exe (WinDriver/util/pci_scan.exe): 以獲取已安裝的 PCI 卡列表與資源, 並且可以鎖定其中一張設備卡 7

pcmcia_diag.exe (WinDriver/util/pcmcia_diag.exe): 來讀寫 PCMICA 設備卡的配置暫存器, 存取 PCMCIA 的 I/O 與記憶體範圍, 以及中斷處理的應用程式 pcmcia_scan.exe (WinDriver/util/pcmcia_scan.exe): 用來獲取已安裝的 PCMCIA 卡列表與資源, 並且可以鎖定其中一張設備卡 第 1.10.3 章 WinDriver 特殊合作支援晶片組 WinDriver 針對主要的晶片廠商提供自行定義包裝的 API 以及範例程式, 包含以下晶片組 : PLX 6466, 9030, 9050, 9052, 9054, 9056, 9080 and 9656 WinDriver/plx Altera Qsys design WinDriver/altera/qsys_design Xilinx Bus Master DMA (BMD) design WinDriver/xilinx/bmd_design 第 1.10.4 章範例程式 除了提供特殊晶片組的範例程式,WinDriver 亦包括其他各種範例程式, 示範如何使用 WinDriver 的 API 與您的設備進行溝通, 並執行各種驅動工作 C 範例 : 可以在 WinDriver/samples 資料夾中找到, 此範例包含在本手冊的第 1.10.2 章節描述的應用程式原始碼.NET C# 範例 (Windows): 可以在 WinDriver\csharp.net 資料夾中找到 第 1.11 章使用 WinDriver 開發的驅動程式是否可以發行 當您購買 WinDriver 驅動程式開發工具包的正式序號後, 任何使用 WinDriver 開發的驅動程式都可以被發行, 並且不須支付額外的權利金, 您可以依據您的需求進行發行並且不限數量 更多資訊, 請參閱存放於 WinDriver/docs/license.pdf 的序號協議 8

第二章了解設備驅動程式 本章節將介紹較廣泛的設備驅動程式, 並帶領您了解設備驅動程式的結構與元素 註 : 使用 WinDriver 開發驅動程式, 您不需要熟悉內部工作原理,WinDriver 可以讓您在用戶模式存取並且開發您的硬體設備, 若只使用 WinDriver 的範例 API, 您完全不需要內核開發知識 第 2.1 章設備驅動程式概述 設備驅動程式提供作業系統與硬體設備間的連結介面, 例如 : 接線端子 硬碟 光碟機 視訊卡和網路媒體 等, 設備驅動程式帶領硬體設備在作業系統進入和退出的服務, 並且設定硬體參數, 更能在核心與硬體間傳遞資料, 或是從設備接受數據並傳遞至作業系統核心, 以及處理硬體設備的錯誤, 這些皆是設備驅動的功能 設備驅動程式, 就像是當您在使用一個設備時, 該應用程式和硬體間的翻譯員 每個設備皆有自己一套專門規格的命令, 而此命令只有驅動程式可以解讀 相反的, 大部分的應用程式都只允許接受通用規格的命令 因此, 驅動程式便是接受此通用規格的命令, 並轉換為硬體設備專用規格的命令 第 2.2 章依功能區分驅動程式 驅動程式有許多不同功能的類型 本章節將介紹三種最常見的驅動程式類型 第 2.1 章單層式裝置驅動程式 (Monolithic Drivers) 單層式裝置驅動程式包含所有的硬體設備功能的設備驅動程式, 可以被一個或多個的用戶應用程式存取, 並直接驅動一個硬體設備, 驅動程式透過 I/O control commands (IOCTLs) 跟應用程式溝通, 並且藉由調用不同的 WDK, ETK, DDI/DKI 函式, 來驅動硬體設備 單層式裝置驅動程式可以支援所有的作業系統, 包含所有的 Windows 與 Unix 平台 圖 2.1 單層式裝置驅動程式 9

第 2.2 章分層式裝置驅動程式 (Layered Drivers) 分層式驅動程式是處理 I / O 請求的設備驅動程序堆棧的一部分 例如 : 分層式驅動程式可以擷取磁盤在加密 / 解密時, 被轉移到 / 從磁盤中的所有數據 在此案例中, 驅動程式會被掛在現有驅動程式的頂部, 並且只會處理加密 / 解密的工作 分層式驅動程式有時也被稱為過濾器驅動程序, 支持所有的作業系統, 包括 Windows 平台和 Unix 平台 圖 2.2 分層式驅動程式 第 2.2.3 章迷你埠裝置驅動程式 (Miniport Drivers) 迷你埠驅動程式是一種附加的驅動程式, 並無法實現驅動程式的所有功能需求 此類型的驅動程式, 為迷你埠驅動程式提供了標準的基礎功能 此類型的驅動程式用來支援一些普遍通用的功能設備, 例如 :HID 裝置與所有的網路連結設備 迷你埠驅動程式亦被稱為迷你類驅動程序或微型驅動程序, 可支援 Windows NT(2000) 的家族系列, 即為 Windows8/7/ Vista/ Sever 2008 / Server2003 / XP/2000 / NT 4.0 10

圖 2.3 迷你埠驅動程式 Windows8/7/Vista/Server2008/Server2003/XP/2000/NT4.0 提供多種驅動程序種類 (Classes)( 稱為端口 ), 常用的功能皆可以利用這些種類的驅動程式來處理 因此, 用戶可以自行針對特定的硬體設備, 而選用所需要的驅動程式類別以及所需功能 NDIS 迷你埠端口驅動程式就是類似的驅動程式例子 NDIS 迷你連接埠的框架用於創建網路驅動程式並掛接到 NT 的通信棧, 因此可以讓應用程式用來存取常見的通信要求 Windows NT 核心提供各種通信協議棧和其他的代碼, 包含常見通訊卡的驅動程式 因為 NDIS 框架, 網卡的開發者並不需要去攥寫所有的程式碼, 僅需針對特定的網路卡來開發部分程式 第 2.3 章作業系統的驅動程式種類第 2.3.1 章 WDM 驅動程式 Windows 驅動程序模組 (Windows Driver Model WDM) 是內核模式驅動程式, 應用在 Windows NT 和 Windows 98 作業系統家族 Windows NT 的系列包括 Windows8/7/Vista/Server2008/Server2003/XP/2000/NT4.0, 在 Windows 98 系列包括 Windows98 和 Windows Me WDM 工作是藉由一部分的工作引導至設備驅動程式, 並且集成為作業系統的一部分 此部分的程式處理所有的底層暫存器的管理, 包含 DAM 與隨插即用 (Pnp) 設備列舉 WDM 驅動程式是隨插即用 (Pnp) 的驅動程式, 並且支援電源管理協定, 並且包含單層式裝置驅動程式 分層式驅動程式與迷你埠驅動程式 11

第 2.3.2 章 VxD 驅動程式 VxD 驅動程式是 Windows 95/98/Me 的虛擬設備驅動程序, 因為通常檔案的副檔名為.vxd, 因此常被稱為 VxD 驅動程式,VxD 驅動程式通常是單層性質 它們提供直接存取硬體和作業系統功能的權力 VxD 驅動程式可以用任何方式做堆疊或分層, 但驅動程式結構本身並沒有任何層次 第 2.3.3 章 Unix 設備驅動程式 在傳統的 Unix 驅動程序模組中, 設備屬於三個類別 : 字元 (char) 設備, 塊設備和網絡設備, 實施這些設備的驅動程序則被稱為字元驅動 塊設備驅動程式或網絡驅動程式 在 Unix 下, 驅動程式的程式碼單元鏈接到內核, 並具有特權的運行在內核模式 一般來說, 驅動程式碼運行在用戶模式的應用程式, 從用戶模式的應用程式透過提供檔案系統來存取 Unix 驅動程式 換言之, 設備作為可以被開啟的特殊設備檔案, 被顯示在應用程式中 UNIX 設備驅動程式是分層或單層式的驅動程式, 單層驅動程式可以被看作是一個層的分層驅動程式 第 2.3.4 章 Linux 設備驅動程式 Linux 設備驅動程式是基於傳統的 Unix 設備驅動模組加以改編並引入新的特點 在 Linux 下, 塊設備可以與字元裝置一樣被存取, 如同在 Unix, 但也會有用戶或應用程式是不可見的區塊導向接口 傳統上, 在 Unix 下, 設備驅動程式連接至內核中, 系統需要被關閉並重新啟動後才會安裝新的驅動程式 Linux 引入可動態加載的驅動程式稱為模組的概念 Linux 模組可動態加載或移除, 而不需要關閉系統 Linux 驅動程式可以被寫成靜態連結, 或是被動態加載的模組, 因此 Linux 模組可以針對各個設備做編寫, 並且在找不到特定的設備時自行卸載 Linux 設備驅動程式如同 UNIX 設備驅動程式, 是可以分層式或單層式驅動程序 第 2.4 章驅動程式之進入點 每個設備驅動程序都必須有一個主進入點, 例如 : 在 C 控制台應用程序的 main() 函數 此進入點在 Windows 稱為 DriverEntry(), 在 Linux 被稱為 init_module() 當作業系統加載設備驅動程式時, 該驅動程式的進入點將被調用 每個驅動程式在首次被調用時, 皆需要使用一些全球性的初始化函數 該全球化的初始化函數負責 DriverEntry()/init_module() 例程 該進入函數會註冊作業系統調用驅動程式時使用的回調函數 這些驅動程式回調是作業系統對驅動程式的服務請求 在 Windows 中, 這些回調被稱為派遣例程 (dispatch routines), 在 Linux 中, 它們被稱為文件操作 (file operations) 每個註冊的回調被作業系統稱為標準的結果, 例如 : 拔除硬體連結 第 2.5 章驅動程式與硬體的連結 作業系統用不同的方式, 將硬體設備與特定的驅動程式做連結 在 Windows 環境, 硬體設備藉由.inf 檔案來跟驅動程式做連結, 並且註冊該設備的驅動程式, 此方式是在 DriverEntry() 12

例程被調用前執行的 作業系統會尋找資料庫是否有符合該設備資訊的.inf 檔案, 之後連結該.inf 檔案, 再調用該驅動程式的進入點函釋, 以識別該設備 在 Linux 環境, 硬體驅動程式的連結已經定義在驅動程式的 init_module() 例程中 該例程包含被指定用來處理該設備驅動程式的回調函數 作業系統呼叫基於程式碼中定義的驅動程式進入函示 第 2.6 章驅動程式溝通 在每個作業系統上, 用戶模式的應用程式與驅動硬體設備的驅動程式, 溝通實現的方式都不同, 需要使用個別自訂的 OS Application Programming Interfaces (APIs) 在 Windows Windows CE 和 Linux 的應用程式可以使用作業系統的檔案存取 API 來開啟處理程序至設備驅動程式, 例如 : 使用 Windows CreateFile() 函數, 或使用 Linux 的 open() 函數, 接著藉由該處理程序來傳遞相關資訊, 以達到跟硬體設備存取溝通 OS 的檔案存取功能 ( 例如 : 在 Windows 的 ReadFile() 和 WriteFile() 函數, 或 Linux 的 read() 和 write() 函數 應用程式藉由 I / O 控制 (IOCTL) 調用, 將請求發送至驅動程式, 並使用自定義的操作系統 API 來達成此目的, 例如 : 在 Windows 的 DeviceIoControl() 函數, 或 Linux 的 ioctl() 函數 ) 資料經過自訂的操作系統封裝後, 藉由 IOCTL 調用來達成資料在驅動程式與應用程式間的傳遞 例如 : 在 Windows 環境, 數據傳遞是通過 I / O 請求封包 (I/O Request Packet IRP) 結構, 並且由 I / O 管理器 (I/O Manager) 封裝 13

第三章 WinDriver USB 概述 本章介紹通用串行匯流排 (USB) 的基本特徵, 並介紹 WinDriver 的 USB 功能和體系結構 第 3.1 章 USB 簡介 USB (Universal Serial Bus) 是一種工業標準 PC 架構, 可將設備連接到電腦 它最初是在 1995 年由 PC 開發和電信行業領先的公司, 例如 : 英特爾, 康柏, 微軟和 NEC 共同制定 USB 開發用來滿足市場需求, 其中的需求為一種廉價並廣泛的連接解決方案可用於對一般電腦外圍設備和特別的電腦技術集成, 易於使用並且靈活應用, 可用於重新配置的 PC, 並且可以用於大量的外圍設備 該 USB 規範可允許和最多 127 個外圍設備 ( 包括集線器 ) 到系統的連接, 並且可以在同一端口或不同的端口上 USB 亦支援隨插即用安裝與熱插拔 USB 1.1 標準支持同步和非同步的數據傳輸, 並具有雙數據傳輸速度 :1.5 Mb / s 的低速 USB 設備和 12 Mb / s 的全速 USB 設備 ( 比原來的串行端口來的快 ) 設備連接到 PC 的線材可長達 5 米 (16.4 英尺 ) 長 並且可以由 USB 配電給低功耗設備, 可提供有限的電源功率 ( 電流高達 500 ma) 給連接在總線上的設備 USB 2.0 標準的支持訊號傳輸速率為 480 MB/ 秒, 被稱為 高速, 比 USB 1.1 全速傳輸速率還要高 40 倍的速度 USB 2.0 是完全向前和向後兼容 USB 1.1, 並使用現有的電纜和連接器 USB 2.0 支援外圍設備與 PC 的連結, 提供需要更大的傳輸擴展功能 另外, 它可以同時處理更多數量的外圍設備 USB2.0 加強了用戶的許多應用, 包括互動遊戲, 寬頻上網, 電腦連結和 Web 發布, 互聯網服務和電話會議功能 由於它的好處 ( 如下文第 3.2 節 ), USB 目前已經受到市場的廣泛認可 第 3.2 章 USB 優勢 本節介紹 USB 標準的主要優點和支援該標準的 WinDriver USB 工具包 : 最大限度地提高外部連接易用性 自動識別外圍設備, 並支援自動映射功能的驅動程序和配置 可動態連結, 並且可重新配置外圍設備 適用於頻寬範圍從幾 KB/ s 的數百 Mb / s 的設備 在同一組導線, 可支援同步和非同步傳輸類型 支援同時運行多種設備 ( 多重連接 ) 支援 USB1.1 的數據傳輸速率高達 480 MB/ 秒 ( 高速 ),USB2.0( 需操作系統也支援 ) 可高達 12 MB/ 秒 ( 全速 ) 保證頻寬和低延遲, 可適用於電話, 音頻等 ( 同步傳輸, 可以使用幾乎整個匯流排頻寬 ) 靈活性 : 廣泛支援各種數據包大小與頻寬大小 14

耐用性 : 內建的錯誤處理機制, 並可以由用戶觀察即時地的動態插入 和移除設備 與 PC 產業的協同作用, 並使用通用技術外接設備與電腦主機的優化集成 低實現成本, 因此可適用於低成本的外部設備開發 低成本的連接線與連結器 內建電源管理與分配 特定資料庫可支援客製化 USB HID 設備 第 3.3 章 USB 組件 USB 包括以下主要組件 : USB Host:USB 主機是指 USB 主機控制器安裝的位置, 並且運行客戶端軟體與設備驅動程式的平台 USB 主機控制器便是主機和 USB 外部設備之間的接口 主機負責用於檢測 USB 設備的插入和移除, 在主機和設備端之間數據流的控制和管理, 並提供連接的設備電源 USB Hub: 允許多個 USB 設備連結至一個 USB 主機上的 USB 端口, 該 USB 主機在連結至電腦 連結到電腦端的 USB 主機在電腦端上被稱為 Root Hubs 其他的 Hub 被稱為外部集線器 USB Function:USB 設備可以通過匯流排發送或接收數據或控制訊息提供一些功能 通常是在一個獨立的外接設備使用導線插入集線器的一個端口上實施功能 它也可以創建一個複合設備, 藉由 USB 導線實現多種功能和一個嵌入式集線器的一個物理封裝 一個複合設備如同集線器與一個或多個非卸除式 USB 設備一起出現在主機上, 這代表可能有端口支援連接外部設備 第 3.4 章 USB 設備的數據流 在 USB 設備的操作過程中, 主機可以啟動一個客戶端軟體和設備之間的數據流 數據可以在主機和單一的設備單在同個時間上傳輸 ( 點對點通訊 ) 但兩台主機不能直接通信, 兩個 USB 設備也不可以直接通訊 ( 補充 :On-The-Go (OTG) 設備除外, 其中一台設備可作為主機 ( 主 ) 而其他設備作為 ( 從 ) ) USB 匯流排上的數據傳輸, 是通過在主機軟體上的記憶體緩衝區和設備端點間的管道傳輸 在 USB 匯流排上的數據流是半雙工的, 即數據只可以在一個給定的時間進行一個方向的傳輸 端點是 USB 設備上的獨特的識別單位, 可以用來判別數據流的來源或末端設備 每個 USB 設備, 無論邏輯或物理的, 都有獨立的端點集合 三種 USB 的速度 ( 低速 全速和高速 ) 都支援一個雙向控制端點 ( 端點 0) 和 15 個單向端點 每個單向端點可用於 in 或 out 的傳輸, 因此理論上有 30 個支援的端點 每個端點具有以下屬性 : 匯流排訪問頻率, 頻寬要求, 端點號碼, 錯誤處理機制, 可以被發送或接收的最大數據包尺寸, 傳輸類型和方向 (in 或 out 的設備 ) 15

圖 3.1 USB 端點 管道是邏輯組成部分, 代表主機上的軟體與 USB 設備上的端點之間的關聯 數據通過管道被移動至設備, 或從設備通過管道移動回來 根據不同的數據傳輸使用管道, 可以分為數據流管或視訊息管道 數據流管道處理中斷 批次和同步傳輸, 而訊息管道支援控制傳輸 第 3.5 章 USB 數據交換 USB 主機和設備之間的數據交換支援兩種標準 : 功能型數據交換 : 用於主機和設備間的數據移動 USB 數據傳輸有三種類型 : 批次, 中斷和同步 控制交換 : 用於確定設備識別 配置要求 配置設備, 亦可用於其他特定的目的, 包括控制其他管道上的設備 控制交換是通過控制管道 預設於管道 0, 這是永久存在的 控制傳輸包括一個安裝階段 ( 其中一個安裝程序包將從主機被發送到設備 ), 一個自訂的數據階段和狀態階段 圖 3.2 是描述 USB 設備有一個雙向控制管道 ( 端點 ) 和兩個功能數據傳輸管道 ( 端點 ), 並由 WinDriver 的應用程式 DriverWizard( 在第五章中討論 ) 所識別 圖 3.2 USB 管道 16

在第 9.2 章節中, 您可以找到更多關於如何實現通過控制轉移發送設置數據包的訊息 第 3.6 章 USB 數據傳輸型態 USB 設備傳輸 ( 功能 ), 是指主機的數據傳輸, 通過在主機上的內存緩衝區和設備上的一個端點之間的管道進行通信 USB 支持四種不同傳輸類型 傳輸類型是根據設備的特定端點和軟體需求所選擇 各個端點的傳輸型態, 會在端點的描述符號中描述 USB 規範提供以下數據傳輸類型 第 3.6.1 章控制傳輸 控制傳輸主要是為了支援主機軟體和設備之間的配置, 命令和狀態操作 此種傳輸類型用於低速, 全速和高低速設備 每個 USB 設備都有至少一個控制管道 ( 預設管道 ), 提供存取設定, 狀態和控制訊息 控制傳輸是突發性的, 非週期性的通信 控制管道是雙向的, 例如 : 數據可以往兩個方向傳輸 控制轉移具有強大的錯誤檢測, 恢復和重傳機制, 並沒有驅動程式的參與 控制端點的最大數據包大小可以是低速設備的 8 個 bytes, 或是全速設備的 8,16,32, 或 64 個 bytes, 而高速設備則只有 64bytes 對於更深入的 USB 控制傳輸及其實施情況, 請參閱本手冊的第 9.2 節 第 3.6.2 章同步傳輸 同步傳輸最常用於與時間相關的訊息傳遞, 例如 : 多媒體數據流和電話 全速和高速設備可以使用該傳輸類型, 但低速設備則無法使用 同步傳輸是週期性並連續的 同步管道是單向的, 一個端點同時只可發送或接收信息 雙向同步通信需要兩個同步管道, 每個方向使用一個管道 17

USB 保證同步傳輸存取的 USB 頻寬 ( 例如 : 它保留所需傳遞頻寬的 USB 頻寬 ), 保證數據通過管道的傳輸速率, 除非只有少量的數據需要發送 由於在這種類型中, 傳輸的時間正確性是最重要的, 在數據傳輸中, 錯誤是無法被重試的 因此, 其數據接收器可確定在匯流排上是否發生錯誤 第 3.6.3 章中斷傳輸 中斷傳輸適用於設備端發送或接收少量並且不頻繁的數據或是非同步時間框架時使用 該傳輸類型可用於低速, 全速和高速設備 中斷傳輸類型, 保證最大的服務期, 若匯流排上出現一個錯誤, 系統將會重新執行, 並交付在之後的一段訊號 中斷管道像同步管道, 是單向的, 並週期性的 中斷端點的最大數據包尺寸可以是低速設備的 8 字節或更少, 全速設備為 64 字節或更少, 高速設備則是 1,024 字節或更少 第 3.6.4 章批次傳輸 批次傳輸, 通常用於非時間敏感性, 需傳輸大量數據的設備, 可以使用任何可用的帶寬, 如印表機和掃描器 此傳輸類型可以用全速或高速設備, 但低速設備無法使用 批次傳輸是非週期性, 大型數據包, 且突發性的通信 批次傳輸允許存取到匯流排上 作為可用 的基礎, 可確保數據傳輸但不限制延遲時間, 並提供錯誤檢查機制 若 USB 其他傳輸種類的頻寬不被使用時, 則系統會將其他傳輸種類的頻寬用來傳遞批次傳輸 像其他數據流管道 ( 同步和中斷 ), 批次管道也是單向的, 所以雙向傳輸使用時, 需要兩個端點 批量端點的最大數據包大小是 8,16,32, 或 64bytes 對全速設備,512bytes 對高速設備 第 3.7 章 USB 配置 之前的 USB 功能 ( 或功能上的複合設備 ), 若要對設備進行操作, 該設備必須要做相關配置 主機藉由獲取 USB 設備的配置訊息來做相關的配置 USB 設備藉由描述符的屬性向主機報告 設備的描述符號, 定義了資料傳輸的結構和格式 USB 描述符的完整描述可以參閱 USB 規範第 9 章 ( 完整的規範請參閱 http://www.usb.org) USB 的描述符號, 其層次結構分為四個層次 : 設備層級 配置層級 介面層級 ( 此層級, 能包括可選的子級別, 稱為替代設置 ) 端點層級 每一個 USB 設備只有一個設備描述符號 每個設備都具有一個或多個配置, 每個配置有一個或多個介面, 各接口具有零個或多個端點, 如圖 3.3 所示 圖 3.3 設備描述符號 18

設備層級 : 設備描述符號包括 USB 設備的一般訊息, 亦即是說, 所有設備配置的全球性訊息 設備標示描述符號, 除其他事項外, 該設備種類 (HID 設備,Hub, 定位裝置等 ) 附屬類 協議的程式碼 供應商 ID 設備 ID 和更多 每個 USB 設備都有一個設備描述符號 配置層級 : 一個 USB 設備有一個或多個配置描述符號 每個描述符號標識接口的數量分組配置, 與電源的配置屬性 ( 例如自供電, 遠程喚醒, 最大功耗等等 ) 在特定時間點, 只有一個配置可以被加載 例如,ISDN 適配器可能有兩種不同的配置, 其中一種配置具有一個 128 kb / s 的介面, 另一種配置則具有兩個 64 kb / s 的介面 介面層級 : 介面是一組相關的端點, 並提供具體設備的功能或特徵 每個介面可以獨立運作 當介面獨立運作時, 介面描述符號描述介面的數量, 與該介面所使用的端點數量和介面的具體類別, 子類別和協議設定值 此外, 介面可能有備用設置 備用設置允許端點或它們的特性, 可以再配置設備後改變 端點層級 : 端點描述符是最低階的, 它提供主機與端點的數據傳輸類型和最大數據包大小等相關訊息, 對於同步端點的最大數據包大小是指數據傳輸所需的匯流排預留時間, 例如 : 頻寬 其他端點屬性是指匯流排訪問頻率 端點號 錯誤處理機制和方向 在不同的備用設置中, 相同的端點可以有不同的屬性 ( 因此有不同的用途 ) 看似複雜? 一點也不! WinDriver 具有自動的 USB 配置過程 DriverWizard 應用程式和 USB 診斷應用程式, 會掃描 USB 匯流排, 並檢測所有的 USB 設備和它們的配置 介面 備用設置和端點, 讓您在驅動程式的開發開始之前, 直接挑選所需的配置, WinDriver 的標識端點傳輸類型確定在端點描述符號中, 使用 WinDriver 創建驅動程式時, 在早期階段便已收集了所有配置訊息 第 3.8 章 WinDriver USB WinDriver 的 USB 開發, 讓開發者無需學習 USB 的規格和操作系統內部, 也不須使用操作系統的開發工具包, 使開發人員能夠快速地開發出高性能的 USB 設備驅動程式 例如,Windows 驅動程式開發可以不使用 Windows Driver Kit (WDK), 亦無需學習 Windows 驅動程式模型 (WDM) 開發 WinDriver USB 開發的驅動程式碼在支援的 Windows 平台上是二進制碼兼容的 - 2008/Server2003/XP Windows8/7/Vista/Server 另外, 原始碼可兼容於所有支援的操作系統 - Windows8/7 / Vista/ Server 2008 中 /Sever Windows2003 / XP,CE( 又名 Windows Embedded Compact)4.x 版 7.x 中 ( 包括 Windows Mobile) 和 Linux 欲查詢最新支援的操作系統列表, 請訪問 Jungo 的網站 http://www.jungo.com 19

WinDriver 的 USB 是一個通用的工具包, 可以支援所有供應商的所有 USB 設備和所有類型的配置 WinDriver 的 USB 底層已經封裝 USB 規範和架構, 可以讓您專注於應用程式邏輯開發 WinDriver 的 USB 採用圖形化的 DriverWizard 應用程式, 這使您可以輕鬆地檢測您的硬件, 查看其配置訊息, 在寫任何程式碼測之前, 先行測試 DriverWizard 首先讓您選擇所需的配置, 接口和備用設置組合, 使用容易上手的圖形用戶界面 檢測和配置您的 USB 設備後, 您可以進行與設備進行通信測試 對管道進行數據傳輸 發送控制請求 重設管道等 - 以確保所有的硬體資源如預期般運作 診斷完硬體後, 您可以使用 DriverWizard 自動生成您設備的驅動程式原始碼, 包含 C Visual Basic NET C# 等語言 WinDriver USB 提供用戶模式的 API, 您可以在您的應用程式中調用, 以實現與您的設備通訊 WinDriver 的 USB API 包括獨特的 USB 操作, 例如 : 管道或設備的復位 DriverWizard 生成的程式碼實現診斷的應用程式, 它示範如何使用 WinDriver 的 USB API 來驅動您的特定設備 若要使用應用程式, 你只需要編譯並運行它 您可以立即開始開發週期, 並使用此應用程式做為您的骨骼驅動程式, 然後為您的特定設備需要修改程式碼, 以實現所需的驅動程式功能 DriverWizard 會自動創建 INF 文件, 將您的設備註冊與 Windriver 共同工作, 這是一個必須的步驟, 以便正確地使用 WinDriver 識別和處理 USB 設備 WinDriver USB 開發, 所有的開發都是在用戶模式中, 您可以使用熟悉的開發和修改工具以及您喜歡的編譯器或開發環境 ( 例如 : 微軟的 Visual Studio MS 嵌入式視覺 Ç++ MS 平台生成器 Ç++ GCC Windows 的 GCC) 第 3.9 章 WinDriver USB 架構 欲存取您的硬體, 您的應用程式會調用 WinDriver 的內核模組, 並使用 WinDriver USB API 函式 高階的函式利用了低階的函式, 它使用的 IOCTL, 讓 WinDriver 的內核模組和用戶模式應用程式之間完成通訊 接著 WinDriver 的內核模組存取您的 USB 設備資源, 並通過您的操作系統做調用 有兩層抽象的 USB 設備層來負責 USB 設備驅動程式 上層是 USB 驅動程式 (USBD) 層, 其中包括 USB 集線器驅動程式和 USB 核心驅動 較低層是主機控制器驅動程式 (HCD) 層 HCD 和 USBD 層之間的職責分工並沒有明確定義, 取決於操作系統 HCD 和 USBD 是操作系統的軟件介面和組件, 另外,HCD 層代表一個較低的抽象層次 該 HCD 的軟件層, 提供抽象的主機控制器硬體, 而 USBD 在主機軟體和 USB 設備間, 提供數據傳輸的功能和一個抽象的 USB 設備 USBD 與客戶端的通訊 ( 例如, 特定的設備驅動程式 ) 通過 USB 驅動程式介面 (USBDI) 連通 在較低的層級, 核心驅動程式和 USB 集線器驅動通過控制器驅動程式介面 (HCDI) 來跟 HCD 通訊, 以實現硬體的存取和數據傳輸 USB 集線器驅動程式負責確定設備的添加和刪除從一個特定的樞紐 當集線器驅動程式接收一個設備連結或移除的信號, 它會使用額外的主機軟體和 USB 核心驅動程式來識別和配置該設備 執行配置的軟體可以包括集線器驅動程式, 設備驅動程式和其它軟體 開發者可以使用 WinDriver USB 來作抽象配置程式和硬體存取, 開發人員可以使用 WinDriver 的 USB API 來執行所有的硬件相關操作, 而無需使用低階核心程式來實現這些操作 圖 3.4 WinDriver 的 USB 架構 20

21

第四章安裝 WinDriver 本章節將帶領您透過簡單的步驟, 將 WinDriver 安裝在您的開發平台上, 並驗證您的 WinDriver 是否已經正確安裝 最後一節將介紹卸載程序 第 4.1 章系統需求第 4.1.1 章 Windows 系統需求 任何 x86 32 位元或 64 位元 (x64 的 AMD64 或 Intel EM64T) 處理器 任何支援 C,NET,VB,Delphi 等的編譯器或開發環境 Windows XP 需要至少 SP2 版本以上 第 4.1.2 章 Windows CE 系統需求 使用 Windows CE 的 x86,mips,arm 目標平台 ( 也稱為 Windows Embedded Compact)4.x-7.x,( 包括 Windows Mobile) Windows 8/7/Vista/Server2008/Server2003/XP 的主機開發平台 IDE: 針對 Windows CE 4.X,5.X( 包括 Windows Mobile): Microsoft embedded Visual C++ 或 Microsoft Visual Studio 2005/2008 以及相應的目標 SDK 或微軟 Platform Builder 與針對目標平台相對應的開發板支援套件 (Board Support Package BSP) Windows CE 6.x:Microsoft Visual Studio 2005/2008 相對應的目標平台 SDK 或 Windows CE 6.0 的插件 Windows CE 7.x:Microsoft Visual Studio 2005/2008 與 Windows CE 7.0 的插件 第 4.1.3 章 Linux 系統需求 任何下列的處理器架構, 與 2.6.x 或更高的 Linux 內核版本 : 32 位元 x86 架構 ; 64 位元 x86 的 AMD64 或 Intel EM64T(x86_64) 架構 32 位元或 64 位元的 PowerPC 架構註 :Jungo 將持續支援更新的 Linux 內核版本 欲了解支援的最新內核版本, 請參閱 http://www.jungo.com/st/wdver.html GCC 編譯器 : 註 :GCC 編譯器的版本, 需要與建置運行 Linux 內核的版本相匹配 任何 32 位元或 64 位元的開發環境 ( 取決於您的目標配置 ) 並且支援 C 語言的用戶模式 在您的開發平台上需要有 glibc2.3.x libstdc++.so.5: 用來執行圖形介面化的 WinDriver 應用程式 ( 例如 :Driver Wizard 與 DebugMonitor) 22

第 4.1 章 Windows 安裝程序 WinDriverCD 包含所有支援的作業系統的 WinDriver 安裝程式 CD 的根目錄中包含 Windows 版本安裝程式 當您將光碟放入至您的 Windows 光碟機中時, 此版本的安裝程式將會自動運行 其他版本的 WinDriver 安裝程式則是位於 <OS> 子目錄 ( 例如 :LINUX,WINCE) 第 4.2.1 章 Windows 的 WinDriver 安裝方式 註 : 在 Windows 下安裝驅動程序需要管理員權限 1. 將 WinDriver 光碟放入您的光碟機, 或者雙擊您下載的安裝檔案 -WD1120.EXE, 並且照著安裝指示 註 : 若您欲使用光碟做安裝, 請放入光碟後稍待數秒, 便會執行自動安裝, 若安裝程式沒有自行啟動, 請雙擊光碟中的安裝檔案 -WD1120.EXE, 並點選 Install WinDriver, 便會進行安裝 2. 當程式安裝完成時, 系統會提示您需要重新啟動電腦 註 1. WinDriver 的安裝定義 WD_BASEDIR 環境變量, 它在安裝過程中被設置指向 WinDriver 的目錄位置 此變量會在使用 DriverWizard 生成程式碼時使用, 它決定用來保存生成的程式碼之預設目錄, 並用於生成的專案 / 檔案的連結路徑 該變量也被用於範例中的 Kernel Plgin 專案和 makefile 檔案 註 2. 若安裝失敗, 並顯示 ERROR_FILE_NOT_FOUND 錯誤, 請檢查 Windows 註冊表, 了解是否存在 RunOnce 鍵存在 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion 此註冊鍵是當使用 Windows 隨插即用設備時所需, 它是用來安裝 inf 檔案時使用, 若該 RunOnce 鍵已經遺失, 請創建它, 並且再次安裝 inf 檔案 若您是已經購買 WinDriver 正式序號的用戶, 請參考以下步驟 : 3. 開啟 DriverWizard:Start Programs WinDriver DriverWizard. 4. 在 File 功能鈕, 選擇 Register WinDriver 選項, 並輸入 Jungo 正式序號 5. 點選 Activate License 按鈕 6. 若您已經使用試用版成功開發驅動, 欲對該驅動進行註冊時請參閱 WDC_DriverOpen() 若您使用低階 API, 請參閱 WD_xxx API, 而非 WDC_xxx API [B.2], 請參閱 WinDriver PCI Low-Level API Reference 中的 WD_License() 第 4.2.2 章 Windows CE 的 WinDriver 安裝說明第 4.2.2.1 章在新的 CE 平台安裝 WinDriver CE 註 1. 以下說明是當您使用 Windows CE 平台開發器, 或使用具有 Windows CE 插件的 MS Visual Studio 2005/2008 建立 Windows CE 的核心映像檔時使用, 該說明使用 Windows CE IDE 來統稱這些開發平台 註 2. 我們建議你閱讀微軟的文件, 了解 Windows CE 和設備驅動程序整合過程, 然後再執行安裝 1. 修改專案的註冊檔案, 並將您的設備加入 若您選擇使用 WinDriver 組件 ( 請參閱步驟二 ), 請修改 WinDriver\samples\wince_install\<TARGET_CPU>\WinDriver.reg ( 例 :WinDriver\samples\wince_install\ARMV4I\WinDriver.reg) 23

或是修改 WinDriver\samples\wince_install\project_wd.reg 2. 針對 Windows CE 4.x 5.x, 在 Sysgen 平台編譯階段前, 請參考以下步驟, 以簡化您日後將驅動程式集成到您 Windows CE 平台上的步驟 若是開發 Windows CE 6.x 或以上版本之開發者, 請跳至步驟三 此程序提供快速簡便的方法, 以整合您的 WinDirver 與您的 Windows CE 平台 若您選擇不使用此方法, 則在 Sysgen 階段之後, 您需要參照步驟四, 來作手動整合 若你想將 WinDriver CE 的內核文件 (windrvr6.dll) 永久製成為 Windows CE 映像 (NK.BIN) 的一部分, 同時若您選擇使用啟動磁碟傳輸檔案至您的硬體平台, 您必須按照此步驟, 將 WinDriver 的內核模組 (windrvr6.dll) 添加至您的作業系統映像 然而, 若您喜歡透過 CESH/PPSH 服務按照您的需求加載 windrvr6.dll, 您需要透過手動集成, 而不是使用前述之步驟 a. 執行 Windows CE IDE 並且開啟您的平台 b. 在 File 功能鈕中選擇 Manage Catalog Items..., 點選 Import... 按鈕, 從 WinDriver\samples\wince_install\<TARGET_CPU> ( 例 :WinDriver\samples\wince_install\ARMV4I), 資料夾中選擇 WinDriver.cec 檔案 這將會將 WinDriver 組件添加至您的平台建置器目錄中 c. 在 Catalog 中, 在 Third Party 欄中, 指向 WinDriver Component 並點擊右鍵, 點選 Add to OS design 3. 編譯您的 Windows CE 平台 (Sysgen) 階段 4. 若您沒有執行步驟二, 請在 SYSGEN 階段後執行下列步驟, 以手動的驅動程序集成到您的平台 請注意, 若您已經執行步驟二, 請跳過此步驟, 直接進入步驟五 a. 執行 Windows CE IDE 並且開啟您的平台 b. 從 Build 目錄中選擇 Open Release Directory c. 複製 WinDriver CE 內核檔案 WinDriver\redist\<TARGET_CPU>\windrvr6.dll 至目標開發平台的 %_FLATRELEASEDIR% 子目錄, 應該會是新的命令窗口中的當前目錄 ) d. 將 WinDriver\samples\wince_install\project_wd.reg 中的內容, 添加至 WinDriver\samples\wince_install\project_wd.reg 的註冊檔中 e. 複製 WinDriver\samples\wince_install\project_wd.bib 的內容至編譯後的建置檔案 %_FLATRELEASEDIR%\project.bib, 並依據相匹配的目標平台取消該行程式碼 ( 請參閱上述複製檔案中的 TODO 註釋 ) 註 : 若你想將 WinDriver CE 的內核文件 (windrvr6.dll) 永久製成為 Windows CE 映像 (NK.BIN) 的一部分, 同時若您選擇使用啟動磁碟傳輸檔案至您的硬體平台, 則您必須按照此步驟描述的過程, 將 WinDriver 的內核模組 (windrvr6.dll) 添加到您的作業系統映像 若您喜歡透過 CESH/PPSH 服務按照您的需求加載 windrvr6.dll, 則不需要執行此步驟, 直到您想要建立一個永久的內核 5. 從 Build 目錄中選擇 Make Run-Time Image, 並將它命名為 NK.BIN 6. 從 Target 目錄中選擇 Attach Device, 或使用啟動磁碟, 將您的內核下載並至您的目標設備初始化 針對 Windows CE 4.x, 該目錄稱作 Download/Initialize 而不是 Attach Device 7. 重新啟動您的目標 CE 平台, 此時,WinDriver 核心會自動加載 8. 編譯和運行範例程式, 以確保 WinDriver CE 加載並運行正常 24

第 4.2.2.2 章在新的 CE 應用程式安裝 WinDriver CE 註 : 除非另有說明, 在本節提到的 Windows CE 表示所有支援的 Windows CE 平台, 包括 Windows Mobile 以下說明適用於不建立 Windows CE 內核, 只開發其驅動程式的驅動程式開發人員, 並在一個現成的 Windows CE 平台上, 使用 MS embedded Visual C ++ 或微軟的 Visual Studio2005/2008 1. 將 WinDriver CD 放入光碟機中 2. 退出自動安裝 3. 複製 WinDriver 內核 windrvr6.dll, 從 Windows 開發主機中的 WinDriver\redist\WINCE\<TARGET_CPU> 資料夾中, 至目標 Windows CE 平台上的 Windows 資料夾 4. 將 WinDriver 加入至 Windows CE 的開機讀取裝置驅動列表中 修改註冊表 WinDriver\samples\wince_install\project_wd.reg 檔案中的參數, 可以透過 Windows CE 的掌上手持式 CE 計算機上的註冊表編輯器, 或使用支援 MS embedded Visual C ++ 或 MS Visual Studio2005/2008 的遙控 CE 註冊表編輯器工具做修改 請注意, 為了使用遙控 CE 註冊表編輯器工具, 您需要在您的 Windows 開發主機上安裝 Windows CE Services 許多 Windows CE 作業系統的版本會防止在系統啟動時加載未經過 Windows 認證的驅動程式, 因此在每次重新開機後必須重新加載 WinDriver 的內核模組 若要在目標 CE 平台上, 每次操作系統啟動時加載 WinDriver, 請複製 WinDriver\redist\Windows_Mobile_5_ARMV4I\wdreg.exe 至目標電腦的 Windows\StartUp 資料夾中 5. 重新啟動您的目標 CE 電腦,WinDriver CE 內核會自動加載 請正確的重新開機, 而不僅僅是將電腦休眠或暫停, ( 請直接使用目標 CE 電腦上的 reset 或電源按鈕 ) 6. 編譯和運行範例程式, 以確保 WinDriver CE 加載並運行正常 第 4.2.2.3 章 Windows CE 的安裝注意事項 WinDriver 安裝在 Windows8 / 7 / Vista / Server 2008 / Server 2003 / XP 的電腦時, 會定義 WD_BASEDIR 的環境變量, 它為指向您的 WinDriver 目錄位置, 如同您在安裝過程中選擇的 DriverWizard 代碼生成的過程中也會使用該變數, 它決定生成的程式碼將保存在哪一個目錄夾, 以及生成的專案 / 檔案之路徑 第 4.2.3 章 Linux 的 WinDriver 安裝說明第 4.2.3.1 章準備安裝系統 在 Linux 中, 內核模組必須被編譯為跟核心本身相同的頭文件 由於 WinDriver 安裝內核模組, 因此在安裝過程中, 它必須要被編譯為跟 Linux 核心的頭文件 因此, 在您安裝 Linux 的 WinDriver 時, 請務必驗證在您的開發平台上所安裝 Linux 原始碼以及 versions.h 檔案 : Install the Linux kernel source code: 若您尚未安裝 Linux, 請包含內核源代碼並安裝 若已經安裝 Linux, 請檢查是否安裝其原始碼 您可以通過 / usr / src 目錄中尋找 Linux, 若沒有原始碼安裝, 25

請參閱您的 Linux 說明安裝或重新安裝 Linux 原始碼 Install version.h: 當您首次編譯 Linux 內核原始碼時, 會自動創造 version.h 檔案, 某些版本的 Linux 會提供已編譯的內核, 沒有 version.h 檔案 請檢查 / usr/ src / linux/ include / linux 中是否有此文件 若沒有, 請按照下列步驟操作 : 1. 成為最高權限用戶 :$ su 2. 進入 Linux 的資料夾中 :# cd /usr/src/linux 3. 輸入命令 :# make xconfig 4. 選擇 Save and Exit, 來保存該設定 5. 輸入命令 :# make dep 6. 離開 :# exit 要執行 WinDriver 的 GUI 應用程式 ( 例如 :DriverWizard; Debug Monitor), 您必須擁有 5.0 版的 ibstdc++ 資料庫 libstdc++.so.5 若您沒有此檔案, 請安裝 Linux 版本相符的 RPM 檔案 ( 例如 :compat-libstdc++) 在繼續安裝之前, 您必須確保有一個 Linux 的符號鏈接 (symbolic link) 若您沒有, 請輸入下列指令來創建 :/usr/src$ ln -s <target kernel>/linux 例如: 若是 Linux kernel 2.4 版本, 則命令為 :/usr/src$ ln -s linux-2.4/ linux 第 4.2.3.2 章安裝 若您使用的 Linux 發行版本為 Debian ( 例如 :Ubuntu); 若使用 Red Hat Package Manager (RPM) 工具 ( 例如 :Fedora), 您可以直接使用 Debian 或 RPM 的 WinDriver 安裝包來自動安裝, 或者使用手動安裝, 此支援在所有 Linux 的版本 第 4.2.3.2.1 章使用 Debian 或 RPM 安裝包進行安裝 1. 將 WinDriver CD 放入 Linux 主機光碟機中, 或複製下載的檔案至您指定的資料夾中 2. 從 WinDriver 的安裝壓縮檔案中, 依據您使用的 Linux 發行版本挑選安裝檔案 WD1110LN.tgz 或 WD1110LNx86_64.tgz Debian 32-bit windriver-11.1.0-1.i386.deb Debian 64-bit windriver-11.1.0-1.x86_64.deb RPM 32-bit windriver-11.1.0-2.i386.rpm RPM 64-bit windriver-11.1.0-2.x86_64.rpm 3. 開始安裝 註 1. 在大多數機器上的.deb 檔案 (Debian) 和 *.rpm 文件 (RPM) 已經有相關的安裝軟件, 因此您可以直接雙擊該程式包檔案, 然後按照安裝說明進行安裝 註 2. 您也可以使用管理員權限, 藉由終端機的命令輸入以進行安裝, 例如 : 欲安裝 32-bit Debian 檔案包 # sudo dpkg -i windriver-11.1.0-1.i386.deb; 欲安裝 64-bit RPM 檔案包 # sudo rpm -i --scripts windriver-11.1.0-2.x86_64.rpm 該軟體包安裝程序會建立在 /usr/local/windriver 的產品目錄 26

第 4.2.3.2.2 章手動安裝 1. 將 WinDriver CD 放入 Linux 主機光碟機中, 或複製下載的檔案至您指定的資料夾中 2. 更改您欲選擇的安裝目錄, 例如 : 主目錄 :$ cd ~, 在安裝目錄的路徑不能包含任何空格 3. 解壓縮 WinDriver 的分發檔案 WD1110LN.tgz 或 WD1110LNx86_64.tgz $ tar xvzf <file location>/wd1110ln[x86_64].tgz 例如 : 解壓縮 WD1110LN.tgz 從 CD 安裝 :$ tar xvzf /mnt/cdrom/linux/wd1110ln.tgz 從下載檔案安裝 :$ tar xvzf ~/WD1110LN.tgz 4. 更改為您的 WinDriver/redist 目錄 ( 將會自動創建一個 WinDriver 的目錄 ):$ cd <WinDriver directory path>/redist 5. 安裝 WinDriver a. <WinDriver directory>/redist$./configure --disable-usb-support 註 1. 配置腳本會根據目前正在運行的內核創建 makefile, 您亦可以選擇使用另一個安裝腳本來安裝內核源代碼, --with-kernel-source=<path> option, <path> 是指到內核源代碼目錄的完整路徑, 例如 :/ usr / src / linux 目錄 註 2. 若 Linux 內核版本是 2.6.26 或更高版本, 配置腳本生成的 makefile 中會使用 kbuild 編譯的內核模組, 您可以在早期版本的 Linux 中強制使用 kbuild, 藉由執行配置腳本使用 enable-kbuild flag 若欲查看配置腳本選項的完整列表, 請使用 Help./configure help b. <WinDriver directory>/redist$ make c. 成為 root 權限用戶 :<WinDriver directory>/redist$ su d. 安裝該驅動程式 <WinDriver directory>/redist# make install 6. 建立符號鏈接可以讓您更容易啟動 DriverWizard GUI: $ ln -s <path to WinDriver>/wizard/wdwizard /usr/bin/wdwizard 7. 更改讀取和執行 wdwizard 的權限, 使普通用戶也可以開啟此程式 8. 更改用戶 ID 和組 ID, 並給設備檔案讀 / 寫權限 / dev/windrvr6, 此取決於您想允許用戶通過何種的權限訪問該設備 基於安全方面的原因, 預設情況下建立設備檔案只允許 root 用戶的權限 通過下列的方式更改權限 / etc/udev/permissions.d/50-udev.permissions 例如: 透過下面一行命令碼, 提供相關的讀寫權限 : windrvr6:root:root:0666 9. 定義新的的 WD_BASEDIR 環境變量, 並將它指向您的 WinDriver 目錄位置, 如同您在安裝過程中選擇的 此變量將被用來與 DriverWizard 生成的 WinDriver 範例 source code 一起 make, 亦可以用來確認您使用 DriverWizard 所生成的專案預設保存目錄, 若您沒有定義此變量, 當您試圖建置用 WinDriver makefiles 生成的代碼時, 您會被指示需要定義該變量 10. 結束 root 用戶模式 :# exit 11. 現在您可以開始使用 WinDriver 訪問您的硬件, 並生成驅動程式碼 使用 WinDriver/util/wdreg 來加載 WinDriver 核心模組 27

第 4.2.3.2.3 章註冊您的 WinDriver 正式序號 註 : 本節僅適用於已購買 WinDriver 正式序號的用戶 當您收到 Jungo 的 WinDriver 正式序號時, 請按照下列步驟操作 : 1. 開啟 DriverWizard:$ <path to WinDriver>/wizard/wdwizard 2. 從 File 功能表中, 選擇 Register WinDriver 選項, 並輸入您的正式序號 3. 點擊 Activate License 按鈕 4. 若您欲註冊 WinDriver 試用版而產生的原始碼, 請參閱 WDC_DriverOpen() 的相關文件, 若使用 low-level WD_xxx API 而不是 WDC_xxx API 時, 請參閱技術文件 WinDriver PCI Low-Level API Reference 中的 WD_License() 第 4.2.3.2.3 章 Linux 的硬體存取限制 註 : 由於 /dev/windrvr6 已經提供用戶程式直接存取硬體的功能, 它可能會影響 Linux 系統在多個用戶時的內核穩定性 請將存取 DriverWizard 和設備檔案 / dev/windrvr6 的權限, 限制為只允許受信任的用戶 由於安全考量,WinDriver 的安裝腳本無法自動執行更改 / dev/windrvr6 和 DriverWizard 應用程式 (wdwizard) 的權限 第 4.3 章更新 WinDriver 版本 欲在 Windows 更新 WinDriver 的版本, 請按照第 3.2.1 節中列出之步驟, 此說明適用於在 Windows 上安裝 WinDriver 您可以選擇覆蓋現有的檔案或安裝至一個單獨的目錄 安裝完成後, 請啟動 DriverWizard, 若您擁有新的正式序號, 請將其輸入, 便完成 WinDriver 的更新作業 欲更新您開發的原始碼, 請將新的序號設定為參數, 並將其傳遞至 WDC_DriverOpen()( 或是 WD_License(), 若您是使用 Low level 的 WD_xxx API, 而不是 WDC_xxx API, 請參閱 WinDriver PCI Low-Level API Reference 在其他作業系統上, 更新版本安裝步驟與上方描述相同 關於各個安裝的詳細信息, 請詳閱相對應的安裝部分 第 4.4 章確認您的安裝第 4.4.1 章 Windows 與 Linux 的安裝確認 1. 開啟 DriverWizard <path to WinDriver>/wizard/wdwizard 在 Windows 上, 您也可以從 Start 功能表中開啟 DriverWizard, 路徑為 Start Programs WinDriver DriverWizard 2. 若您已經購買正式序號, 請確保您的 WinDriver 註冊許可 ; 若您是使用試用版的客戶, 則不需要註冊許可證 3. 若您使用 PCI 設備卡, 請插入您的設備卡, 並使用 DriverWizard 檢測 4. 若您使用 ISA 設備 (Windows 與 Linux), 將 ISA 卡插入 ISA 匯流排, 並使用 DriverWizard 配置設備卡資源, 並嘗試使用 DriverWizard 對該卡做 R/W 測試 28

第 4.4.2 章 Windows CE 安裝確認 1. 複製控制台模式的 Debug Monitor 工具 WinDriver\util\wddebug\<TARGET_CPU>\wddebug.exe, 從 Windows 開發主機複製至您的目標 Windows CE 設備 2. 在目標平台上, 使用 status 命令執行 Debug Monitor:wddebug.exe status 若 WinDriver 的安裝是成功的, 應用程式將顯示 Debug Monitor 相關版本與現在狀態, 以及運行的 WinDriver 內核模組, 和一般的系統信息 第 4.5 章卸載 WinDriver 第 4.5.1 章 Windows 的 WinDriver 卸載說明 註 1. 您可以直接使用圖形化的移除工具 wdreg_gui.exe 來替代 wdreg.exe 註 2. wdreg.exe 與 wdreg_gui.exe 存放於 WinDriver\util 資料夾底 1. 關閉所有的 WinDriver 應用程式, 包含 DriverWizard 與 Debug Monitor, 以及特定的用戶應用程式 2. 若您有創建 Kernel Plugin 驅動, 請卸載並移除它 : a. 若您的 Kernel Plugin 驅動程式已經安裝, 請使用 Wdrege 工具來卸載它 : wdreg -name <Kernel PlugIn name> uninstall 註 : 輸入 Kernel Plugin 的驅動名稱時, 請勿包含 *.sys 副檔名 b. 從 %windir%\system32\drivers 資料夾中, 刪除您的 Kernel Plugin 驅動程式 3. 卸載已透過 inf 檔案所註冊的 WinDriver 隨插即用設備 (USB/PCI/PCMCIA): 使用 wdreg 工具來卸載設備 :wdreg -inf <path to the INF file> uninstall 確認沒有任何的 INF 檔案註冊在 Windriver 核心模組 (windrvr6.sys) 下, 可以在 %windir%\inf 目錄夾中確認 4. 卸載 WinDriver: 在開發平台上, 路徑為 Start WinDriver Uninstall 或者執行從 WinDriver 資料夾中執行 uninstall.exe 此將會停止並卸載 WinDrive 的核心模組 (windrvr6.sys) 從%windir%\inf 目錄夾中刪除相關的 windrvr6.inf 檔案, 並刪除相關的桌面連結與目錄連結, 您在開發時所建立的資料夾則可自行選擇是否刪除 在目標電腦上, 若要移除已安裝的 WinDriver 核心模組 (windrvr6.sys), 而不是安裝整個 WinDriver 工具包的平台上, 請使用 wdreg 工具來停止並且卸除驅動程式 :wdreg -inf <path to windrvr6.inf> uninstall 註 : 當使用此命令時,windrvr6.sys 應該跟 windrvr6.inf 放置在同一個資料夾中 ( 在開發電腦上, 相關的 wdreg 卸載執行命令, 是卸載您的應用程序所使用 ) 註 1. 若有正在運行的 WinDriver 程式而您欲卸載 WinDriver 時 (windrvr6.sys 或重新命名的驅動, 或有連接中註冊為 Windriver 工作的隨插即用設備時 ),wdreg 將無法卸載驅動程式, 此將確保您無法卸載正在使用中的驅動程式 註 2. 您可以使用 Debug Monitor(WinDriver\util\wddebug_gui.exe) 來確認 WinDriver 的核心模組是否有被加載, 當該模組被加載時,Debug Monitor 會顯示驅動程式與作業系統的資訊 ; 否則, 它將會顯示相關的錯誤訊息 在開發平台上, 使用移除命令後,Debug Monitor 將無法使用 欲在移除後執行 Debug Monitor, 請在移除 WinDriver 之前, 複製 wddebug_gui.exe 29

5. 若 windrvr6.sys 成功卸載, 請移除下列檔案 ( 若存在 ): %windir%\system32\drivers\windrvr6.sys %windir%\inf\windrvr6.inf %windir%\system32\wdapi1110.dll %windir%\syswow64\wdapi1110.dll (Windows x64) 6. 重新啟動您的電腦 第 4.5.2 章 Linux 的 WinDriver 卸載說明 註 : 下列指令必須在 root 權限下執行 1. 確認 WinDriver 的核心模組沒有被其他任何的程式使用 : 觀看各個程式使用的模組列表 :# /sbin/lsmod 確認何者應用程序和模組正在使用 WinDriver 的驅動模組 ( 預設情況下,WinDriver 的模組名為 windrvr6) 關閉任何正在使用 WinDriver 驅動模組的應用程式 若您有建立 Kernel Plugin 驅動, 請卸載該 Kernel Plugin 驅動模組 :# /sbin/rmmod kp_xxx_module 2. 卸載 WinDriver 若您是使用 Debian 或 RPM 的 WinDriver 安裝包來進行安裝, 您可以直接使用 Linux Software Center 移除, 或在終端機模式中使用 root 權限鍵入下列指令 : 欲移除 32bit Debian 安裝包 :# sudo dpkg -r windriver-11.1.0-1.i386 欲移除 64bit RPM 安裝包 :# sudo rpm -e --scripts windriver-11.1.0-2.x86_64 若您使用手動安裝 WinDriver, 請參閱下列指令來移除 WinDriver:# /sbin/modprobe -r windrvr6 3. 若您有創建 Kernel Plugin 驅動, 請刪除它 4. 刪除在 /etc 資料夾下的 windriver.rc:# rm -f /etc/.windriver.rc 5. 從 $HOME 移除.windriver.rc:# rm -f $HOME/.windriver.rc 6. 若您有建立 WinDriver 的連結, 請用 # rm -f /usr/bin/wdwizard 命令直接刪除 7. 移除 WinDriver 安裝目錄資料夾, 使用下列命令 :# rm -rf <path to the WinDriver directory> ( 例如 :# rm -rf /usr/local/windriver) 8. 移除 WinDriver 共享對象文件 (shared object file), 有些情況下會沒有此檔案 : /usr/lib/libwdapi1110.so (32-bit x86 or 32-bit PowerPC) / /usr/lib64/libwdapi1110.so (64-bit x86). 30

第五章 DriverWizard 使用介紹 本章介紹 WinDriver 的 DriverWizard 硬體診斷程序和驅動程式代碼生成功能 WinDriver 的 PCI API 亦可以對 CardBus 設備進行處理 第 5.1 章概述 DriverWizard 是基於 GUI 的診斷和驅動程式生成工具, 可以讓您在不用寫任何代碼的情況即可以寫入 / 讀取硬體 通過圖形化用戶界面診斷出硬體可讀取的內存範圍, 寄存器以及中斷都可以被立即偵測出來 一旦設備如您預期的正常運行, 便可以使用 DriverWizard 創建骨架驅動程式的源代碼, 使用函數來訪問您的硬體資源 若您正在開發的驅動程式是 WinDriver 合作廠商的 PCI 芯片 (PLX6466,9030,9050,9052,9054,9056,9080 和 9656; Altera 的 QSYS,Xilinx BMD 設計 ), 請參考本手冊的第 7 章, 該章節說明 WinDriver 合作廠商針對特定芯片組的特別支援 DriverWizard 可以用來診斷您的硬體設備, 在 Windows 環境, 可以針對您的硬體生成 INF 文件 若您是在開發上述的 WinDriver 合作廠商的晶片, 請避免使用 DriverWizard 重新生成骨架驅動程式, 因為這會造成該設備某些特定功能修改的相關問題, 建議直接取用 WinDriver 針對各組晶片組的原始代碼庫與範例應用程式 DriverWizard 在開發驅動程式時, 提供非常方便的兩個主要階段功能 : 1. 硬體診斷 : 在硬件已經開發完成, 將該硬體設備接入至您的電腦, 使用 DriverWizard, 方便快速的驗證該硬體是否按預期的功能執行 2. 代碼生成 : 一旦準備好建立你的代碼, 讓 DriverWizard 為您生成驅動程式原始碼 DriverWizard 所產生的代碼由以下元素組成 : 1. 庫函數 : 用來訪問您的設備資源 ( 內存範圍,I / O 範圍, 寄存器和中斷 ) 2. 在控制台模式下的 32 位元診斷程式 : 可以診斷硬體設備, 並利用上述的特殊庫函數, 將此應用程式作為您的設備驅動程式骨架 3. 專案 Workspace/solution, 您可以使用自動加載將該專案的所有訊息和文至您的開發環境中 針對 Linux, DriverWizard 可以生成 Linux 所需的 makefile 第 5.2 章 DriverWizard 執行步驟 Step 1. 將您的硬體設備連結至電腦 : 您可以選擇使用 DriverWizard 來產生一個虛擬的 PCI 設備程式碼, 無需實際安裝設備 ( 請見 Step 2), 當選擇該選項時,DriverWizard 將會為您的 PCI 設備生成一個虛擬代碼 Step 2. 執行 DriverWizard 並選擇您的設備 : a. 開啟 DriverWizard <path to WinDriver>/wizard/wdwizard, 在 Windows 上, 您也可以從開始選單中選擇 DriverWizard 請注意, 在 Windows8 / 7 與 Vista 的作業系統上, 必須擁有管理員權限才可以正確地進行操作 b. 點選 New host driver project 來開啟新的專案, 或點選 Open an existing project 來開啟舊檔 31

圖 4.1 建立或開啟您的 WinDriver 專案 a. 從 WinDriver 的偵測設備列表中選擇您的隨插即用設備 若為非隨插即用之設備, 請選擇 ISA 若欲在沒有連結設備的情況下開發設備, 請選擇 PCI Virtual Device 圖 4.2 選擇您的隨插即用設備 註 : 當選擇 PCI Virtual Device 時,WinDriver 會允許您自行定義您的設備資源, 例如 :I/O 記憶體區段, 您可以進一步定義運行時間寄存器 ( 偏移量是相對於 BAR) 此外, 若您想要透過 Run-time 暫存器來處理中斷訊號, 您必須設定特定的 IRQ, 請注意, 該 IRQ 的尺寸與號碼跟記憶體區段是不相關的, 因為這些資訊會在 DriverWizard 自動檢測到你安裝的物理設備時取得 32

Step 3. 使用 DriverWizard 生成 INF 文件 : 在 Windows Desktop 系列中, 隨插即用的設備 ( 例如 :PCI 與 PCMCIA) 是藉由安裝 inf 檔案來安裝該設備, DriverWizard 允許您生成 INF 檔案, 並藉由此檔案將設備與 WinDriver 核心綁定 ( 例如 windrvr6.sys), 該生成的 inf 檔案需要隨著您的驅動發行包發行至其他的電腦上作安裝 在 Windows Desktop 上, 當您在生成 inf 檔案時, 同時也代表允許 DriverWizard 偵測您的硬體設備, 本手冊的第 15.1.1 節中有介紹 INF 文件所提供的完整資料 若您不需要生成 inf 檔案 ( 例如 : 開發 Linux 驅動 ), 請跳過此步驟並進行下一個步驟 使用 DriverWizard 生成 inf 檔案, 請參閱下列步驟 a. 在 select your device 視窗中, 點選 Generate.INF file 按鈕, 或點選 Next b. DriverWizard 會顯示您選擇的設備資訊, 例如 :Vendor ID Device ID 設備類型 製造商名稱 與設備名稱, 並且允許您修改這些資訊, 本手冊的第 4.3 章節會介紹此資訊的定義 c. 點選 Next, 選擇一個資料夾安裝您的 inf 檔案, 接著 DriverWizard 會幫您自動安裝該 inf 檔案 您可以在生成 inf 檔案的選項時, 選擇 Automatically Install the INF file 便可以自動安裝該 INF 檔案, 若自動裝時發生錯誤,DriverWizard 會通知您, 並且告知您如何做初步排解, 更多 inf 檔案的資訊, 請參閱本手冊的第 15.1 章節 圖 4.3DriverWizard INF 檔案資訊 33

註 : PCI Message-Signaled Interrupts (MSI) 和 Extended Message-Signaled Interrupts (MSI-X) 的處理需要在設備的 INF 文件中做特定的配置說明, 請參閱本手冊的第 9.2.6.1 節 在 Windows Vista 和更高版本, 若您的硬體有支持 MSI 和 MSI-X, 支持消息信號中斷的選項會在 DriverWizard 的 INF 資訊框中被默認啟用, 當這個選項被選擇時, DriverWizard 為您的設備所生成的 INF 文件包含支持 MSI / MSI-X 處理 然而, 當此選項沒有被選擇時,PCI 中斷將被使用傳統的電平敏感中斷的方法來處理, 不論您的硬體設備與操作系統是否有支援 MSI / MSI-X d. 當 INF 文件安裝完成後, 在您的設備列表中選擇並打開您的設備 Step 4. 解除安裝您設備的 inf 檔案 : 您可以使用 Uninstall 選項卸載隨插即用設備(PCI / PCMCIA) 的 INF 檔案 一旦您卸載 INF 檔案, 該設備將不再被 windrvr6.sys 註冊工作, 並且 Windows 根目錄中的 INF 文件將被刪除 若您不需要卸載 INF 檔案, 請跳過此步驟 a. 在您的設備選單上, 點選您的設備並單擊 Uninstall.INF file 選項 b. 您選擇的 INF 檔案將被刪除 Step 5. 診斷您的設備 : 在編寫設備驅動程式之前, 請確保您的硬體設備如預期般運作 使用 DriverWizard 來診斷您的硬件 將所有活動紀錄至 DriverWizard 日誌, 以後將可以方便的分析您測試結果 : a. 定義和測試設備的 I / O 記憶體區段 寄存器和中斷: 在 DriverWizard 會自動檢測隨插即用硬體設備的資源 :I / O 區域, 內存範圍, 與中斷 圖 4.4 PCI 資源 對於非即插即用的硬體設備, 您需要手動定義硬體資源 您也可以手動定義硬體暫存器, 如圖 4.5 所示 34

圖 4.5 定義暫存器 註 : 當定義寄存器時, 你可以使用暫存器資訊視窗中的 Auto Read 選項 Auto Read 會從 DriverWizard 自動讀取任何寄存器的讀 / 寫操作 讀取結果將顯示在 Wizard 的登錄窗口 針對 I / O 端口的讀取和寫入, 記憶體空間和您自行定義的寄存器, 如圖 4.6 顯示 註 : 當訪問記憶體內存範圍時, 請注意 Linux PowerPC 是使用 big-endian 來處理記憶體區段的存儲, 不同於 PCI 匯流排是使用 little-endian 關於 little/ big-endian 問題的更多信息, 請參閱本手冊的第 9.3 章節 圖 4.6 R/W 記憶體與 I/O 讀取您的硬體中斷訊號 圖 4.7 讀取中斷訊號 35

註 : 對於電平敏感之類的傳統 PCI 中斷, 您必須使用 DriverWizard 來定義中斷狀態暫存器和分配讀 / 寫命令並確認 ( 清除 ) 中斷, 然後再嘗試讀取中斷訊號, 否則 OS 可能會當機 下面的圖 4.8 顯示如何定義中斷響應命令與定義 INTCSR 硬件暫存器 然而, 請注意, 該中斷的送達確認信息是針對特定硬件做設定的 圖 4.8 定義傳輸電平敏感的中斷命令 Step 6. 生成驅動程式骨架程式碼 : a. 於上方功能欄中點選 Generate Code, 或從 Project Generate Code 目錄中選擇 b. Select Code Generation Options 視窗將會跳出, 請選擇您開發所使用的語言種類, 以及您的開發環境, 接著點選 Next 進入下一步 圖 4.9 程式碼生成選項 36

c. 點選 Next 並選擇在您的驅動程序代碼中是否需要包含 Plug-and-Play 和電源處理, 以及是否要生成內核插件 (Kernel Plugin) 程式碼 圖 4.10 額外的驅動程序選項 註 :Kernel Plugin 專案需注意, 欲編譯生成 Kernel plugin 碼, 請先安裝 Windows Driver Kit(WDK) 欲在微軟的 Visual Studio 建立 Kernel Plugin 專案, 專案目錄的路徑不能包含任何空格 d. 儲存您的專案, 然後點擊 OK, 使用 IDE 開發環境開啟生成的驅動程序 Step 7. 編譯並執行該生成的程式碼 : 使用此程式碼作為您的設備驅動程式起點, 在需要的地方修改並添加具體功能, 使其成為你所需的驅動程式 DriverWizard 產生的源代碼可以在任何 32 位元的編譯器上進行編譯, 並運行在所有支持的平台上, 而無需做任何修改 有關更詳細的說明, 請參考本章節的第 4.2.2 章節 37

第 5.2.1 章自動產生程式碼 當您完成設備診斷, 並確保它根據您的要求運行, 您就可以開始撰寫您的驅動程序 第 5.2.1.1 章生成程式碼 從 DriverWizard 或透過 Wizard 的 project 目錄選擇 Generate code 產生驅動程序的源代碼, 並把它與項目文件 (xxx.wdp, 其中 xxx 是項目的名稱 ) 共同儲存, 生成的文件都保存在同個目錄夾中, 每一個 IDE 開發環境和作業系統的程式碼生成, 皆可以在 DriverWizard 程式碼生成視窗中選擇 第 5.2.1.2 生成 PCI/PCMCIA/ISA 的 C code 在原始碼資料夾中有新的 xxx_lib.h 文件, 其中包含 DriverWizard 為您創建的 API 類型定義和函數聲明, 以及 xxx_lib.c 原始碼, 其中包含所生成的設備特定 API 您亦會發現 xxx_diag.c 的原始檔, 其中包括 main() 函數, 實現類似 DriverWizard 功能的範例應用程式, 可利用生成的 API 與您的設備進行通信的應用程序 所產生的 DriverWizard 的代碼是由以下元素和文件組成, 其中 xxx 代表 DriverWizard 項目名稱 : 1. 用來訪問您的設備卡資源 ( 內存範圍和 I / O, 寄存器和中斷 ) 與每個元素使用的資料庫函數 : 您可以在 xxx_lib.c 文件中找到特定於硬件的 API( 聲明在 xxx_lib.h), 使用 WinDriver Card(WDC)API xxx_lib.h 頭文件包含 xxx_lib.c 的原始碼文件的類型定義和函數聲明 在源代碼中包含此文件, 才可使用 DriverWizard 為所產生的驅動程式 API 2. 設備診斷應用程式利用 DriverWizard 生成的 API( 聲明中 xxx_lib.h) 與您的設備溝通 xxx_diag.c 原始碼 DriverWizard 生成的診斷應用程式 console 源代碼, 使用此診斷程式, 作為您的設備驅動程序骨架 3. 所有生成的文件檔案清單 xxx_files.txt 建立您的程式碼後, 便可以用您熟悉的編譯器編譯它, 並進行測試, 接著您需要更改 main() 函數的程式, 讓該程式的功能更加符合您的需要 第 5.2.1.3 生成 Visual Basic 與 Delphi 程式碼 DriverWizard 產生的 Visual Basic 和 Delphi 的程式碼包含類似的函示並提供類似的功能, 其生成的 C 代碼描述請參閱本手冊的第 4.2.1.2 章節 Delphi 程式碼實現 console 應用程序 ( 如 C code); 而 Visual Basic 代碼則實現 GUI 應用程序 第 5.2.1.4 生成 C# code 38

DriverWizard 產生的 C# 代碼提供與 C code 類似的功能, 需要在 GUI.NET 程序取得 第 5.2.2 章編譯生成的程式碼第 5.2.2.1 章 Windows 與 Windows CE 的編譯 在 Windows 下您可以針對支援的 IDE 開發環境與支援的編譯器選擇生成 project,workspace/solution 與 make file, 例如 : MS Visual Studio 的 5.0/6.0/2003/2005/2008/2010,Borland 的 C ++,Visual Basic 6.0 中 Borland 的 Delphi, Windows 的 GCC(MinGW 的 / Cygwin 的 ), MS embedded Visual C++, 或 MS Platform Builder 對於集成開發環境 (IDE) 中, 例如 : 微軟 Visual Studio, 請在 DriverWizard 中自動調用您所選擇的 IDE 並且進行建立和運行該程式碼 您也可以使用任何其他支援的編譯器或開發環境, 接著選定程式語言和目標 OS 來建立生成的程式碼 只需針對您選擇的編譯器 / 環境創建一個新的 project 或 make file, 並包括生成的原始文件, 便可以運行該程式碼 註 : 對於 Windows, 生成的文件位於編譯器 / 開發環境下的 x86 資料夾, 若是 64 位元的項目便會位於 AMD64 資料夾中 對於 Windows CE, 請注意, 生成的 Windows Mobile 的程式碼是針對 Windows Mobile 5.0/6.0 的 ARMV4I SDK 要建立一個的內核插件 Kernel Plugin 專案 ( 在 Windows 上 ), 請參閱本手冊的第 12.7.1 章節說明 第 5.2.2.2 章 Linux 編譯 請使用 DriverWizard 為您創建 makefile 文件, 以及使用你喜歡的編譯器來建置生成的程式碼, 推薦您可以使用 GCC 若需要在 Linux 環境中建立內核插件 Kernel Plugin 專案, 請參閱本手冊的第 12.7.2 章節 39

第六章開發驅動程式 第 6.1 章使用 DriverWizard 開發驅動程式 使用 DriverWizard 診斷設備 : 查看設備的配置信息, 數據傳輸設備的管道, 控制管道發送標準的要求, 重置管道 確認您的裝置如預期運行 使用 DriverWizard 生成 C, C#, Delphi (Pascal) 或 Visual Basic 6.0 的驅動程式碼骨架, 若需要更多的資訊, 請參閱第五章註 : 若您正在使用 WinDriver 特殊合作支援 (Cypress 的 EZ-USB 系列 ) 的具體晶片組之一, 建議您使用具體地範例程式碼, 用該程式碼作為你的骨骼驅動程式碼 關於 WinDriver 的增強支援與特定晶片組的更多細節, 請參閱第 8 章 使用任何的 C 或.NET 編譯器或其他的開發環境 ( 根據您創建的程式碼 ), 來建置您需要的驅動程式框架 WinDriver 支援自動生成下列的開發環境環境與編譯器 :MS Visual Studio, MS embedded Visual C++, MS Platform Builder C++, GCC, Windows GCC 以上步驟是教導您使用 DriverWizard 來建立您的 user mode 驅動程式 WinDriver 的 USB API 詳細說明, 請參閱附錄 B 若欲了解更多關於執行使用 WinDriver USB 傳輸的資訊, 請參閱本手冊第 9 章 第 6.2 章不使用 DriverWizard 直接編寫驅動程式 當您選擇不使用 DriverWizard, 欲直接開發設備驅動時, 請直接選用上述的合作廠商範例程式, 或是 WinDriver 的偵 測驅動範例, 自行選擇最符合您需求的程式並且加以修改為專屬的設備驅動程式 第 6.2.1 章將 WinDriver 檔案 include 至您的專案中 1. Include 相關的 WinDriver 頭文件至您的專案, 所有的頭文件皆可以在 WinDriver/include 資料夾中找到, 所有的 WinDriver 檔案皆需要 windrvr.h 頭文件 當使用 WDC_xxx API, 請 include wdu_lib.h 頭文件,( 此檔案已經包含在 windrvr.h 中 ) 並 include 其他希望在專案中引用的 API 相關頭文件,( 例如 :WinDriver/samples/shared 資料夾中, 提供許多便利性的診斷程式碼 ) 2. 在您的原始碼中 include 相關的頭文件, 例如 : 欲使用 wdu_lib.h 提供的 API, 請添加下列程式碼至您的專案 : #include " wdu_lib.h " 3. 將您的程式與 WDAPI(Windows) / shared object (Linux) 做連結 : Windows: WinDriver\lib\<CPU>\wdapi1130.lib, 上文中 <CPU> 指的是您的開發平台是 x86(32 位元的程式發行至 x86 平台 ) 或 amd64(64 位元發行至 x64 平台 ) 或是 amd64\x86(32 位元的程式發行至 x64 平台 ) Windows CE: WinDriver\lib\WINCE\<CPU>\wdapi1130.lib Linux: WinDriver/lib 資料夾中 libwdapi1130.so 或 libwdapi1130_32.so ( 當在 64bit 平台上開發 32bit 驅動程式時 ) 注意 : 當使用 libwdapi1130_32.so 時, 請務必先複製此檔案在別的資料夾中, 並且重新命名為 libwdapi1130.so, 同時將您的專案連結至重新命名後的檔案 您也可以直接 include 原始碼至您的專案中, 而不是將專案與資料庫做連結 該 C 原始碼儲存於 WinDriver/src/wdapi 資料夾中 40

註 : 若您是使用連結的方式, 則您需要將下列的檔案與您的驅動程式一起做分發 Windows:wdapi1130.dll / wdapi1130_32.dll (64bit 平台使用 32bit 驅動程式 ) 可以在 WinDriver\redist 資料夾中找到 Linux:libwdapi1130.so / libwdapi1130_32.so (64bit 平台使用 32bit 驅動程式 ) 可以在 WinDriver/lib 資料夾中找到注意 : 無論是 Windows 或 Linux, 若您的 32bit 驅動程式要在 64bit 平台上使用, 則需要將要分發的 DLL/shared object 檔案 (wdapi1130_32.dll / libwdapi1130_32.so), 重新命名並且刪除 _32 4. 在您的程式碼中, 添加其他欲使用的 WinDriver 原始碼以及 API( 例如,WinDriver/samples/shared 資料夾中的檔案 ) 第 6.2.2 章編寫您的程式 1. 在程式的開始, 調用 WDU_Init() 以初始化 WinDriver 的 USB 設備, 並等待設備接入成功的回傳值 相關的設備信 息會跟著設備接入的回傳值中一起返回 2. 一旦收到設備接入的回傳, 您就可以開始使用 WDU_Transfer 其中之一函數來發送和接收數據 3. 欲結束程式, 調用 WDU_Uninit() 並從設備註銷 第 6.2.3 章設定並建置您的程式碼 在 include 所需要的檔案, 以及編寫您的程式碼之後, 請確認建置符號以及環境變數已經設定完成, 接著可以建置您的程式碼 註 : 建置您的程式碼之前, 請確認 WD_BASEDIR 的環境變數已設定為 WinDriver 的安裝資料夾地址 在 Windows Windows CE Linux: 您可以定義 WD_BASEDIR 的全局環境變量 Windows - 參見第 4.2.1 節的 Windows WD_BASEDIR Windows CE - 請參閱第 4.2.2.3 節 Linux: 請參閱第 4.2.3.2 節, 第 9 步 第 6.3 章在 Windows CE 上開發您的驅動程式 使用 WinDriver 來處理隨插即用設備, 您必須先用 WinDriver 的核心組件 (windrvr6.dll) 註冊該設備 使用下列方法, 藉由 WinDriver 註冊設備 : 在修改註冊表上識別您的設備, 並將其鏈接到 windrvr6.dll, 修改註冊表加入有關資料您的 project.reg 文件 a. 欲識別其供應商 ID(<VID>) 和產品 ID(<PID>) 的裝置 - 十進制值 - 添加以下內容 : [HKEY_LOCAL_MACHINE\Drivers\USB\LoadClients\<VID>_<PID>\Default\Default\WDR] "DLL"="windrvr6.dll" 通過它的 USB 類 ( 的 <class>), 子類 (<SUBCLASS>), 協議 ( <PROT>) 識別裝置 - 十進制值 - 添加以下內容 : 41

[HKEY_LOCAL_MACHINE\Drivers\USB\LoadClients\Default\Default\<CLASS>_<SUBCLASS>_<PROT>\WDR] "DLL"="windrvr6.dll" 將設備連接到電腦之前, 調用 WDU_Init(), 用來識別設備的供應商和產品 ID 並註冊使用 WinDriver 註 : 欲了解註冊表設置的更多信息, 請參閱 MSDN Library 中的 USB 驅動程序的註冊表設置 42

第七章驅動程式除錯 第 7.1 章 User mode 除錯 由於 WinDriver 是從用戶模式訪問, 建議您先使用標準的除錯軟體來為您的程式碼除錯 Debug Monitor 工具會記錄下由 WinDriver Kernel 和 User mode APIs 所傳遞的訊息, 您也可以自行使用 WinDriver 的 API 來傳遞您自行設定的訊息至 Debug Monitor. 當使用 WinDriver API( 如 WD_Transfer() 請參閱 WinDriver PCI Low-Level API Reference), 來讀 / 寫設備卡上的記憶體區域內核,Debug Monitor 將會被啟動,WinDriver 的內核模組將對記憶體範圍進行驗證, 亦就是說會對設備卡要被存取的記憶體範圍做驗證 在除錯的過程中, 使用 DriverWizard 來確認記憶體參數與暫存器 第 7.2 章 Debug Monitor Debug Monitor 包含圖形化介面與控制台模式的工具, 它可以輕易地監控 WinDriver 核心所有的活動與處理序列 您可以使用此除錯工具來監控每一個傳送到 WinDriver 的命令以及了解是否被執行, 此外,WinDriver 也允許您使用 WD_DebugAdd() 函式來添加您想要監控的除錯訊息 ( 請參閱 WinDriver PCI Low-Level API Reference), 或是高階的 PrintDbgMessage() 函示 該 Dubeg Monitor 有兩個版本 : wddebug_gui 支援 Windows 與 Linux 的 GUI 圖形介面版本 wddebug WinDows Linux 與 Win CE 支援, 命令提示字元的 Debug Monitor 在 Win CE 上,wddebug 也支援 GUI 圖形介面的執行 所有的 Debug Monitor 版本皆存放在 WinDriver/util 資料夾中 第 7.2.1 章 wddebug_gui 工具 wddebug_gui 是完全圖形化 (GUI) 的除錯監控應用程式, 用於 Windows 和 Linux 的作業系統 1. 藉由下列任一種動作, 執行 Debug Monitor: 執行 WinDriver/util/wddebug_gui. 從 DriverWizard 的 Tools 欄位, 執行 Debug monitor 在 WinDows 中, 可以從 開始 程式 WinDriver Debug Monitor 圖 6.1 開啟 Debug Monitor 43

2. 從 Debug Options 按鈕設定 Debug Monitor 的狀態, 追蹤等級與除錯部分, 亦可以從上方的工具欄位中 View Debug Options 目錄中做開啟 圖 6.2 除錯選項 Status: 設定追蹤開啟或關閉 Section: 選擇欲記錄何者的 WinDriver kernel 例如, 若您的問題是有關中斷訊號的, 請勾選 interrupt 請仔細選擇您想監控的那些部分 勾選了過多非必要的選項, 可能會導致過多的信息, 將會更難找到您的問題癥結所在 Level: 選擇您希望記錄的消息程度等級 a. Error 是最低級別, 將只會顯示最小數量的訊息 b. Trace 是最高級別, 將會顯示所有 WinDriver Kernel 的執行細項 Send debug messages to the operating system kernel debugger : 勾選此選項, 可以將 Debug Monitor 從 WinDriver Kernel 所接受到的訊息, 傳遞至作業系統的除錯工具, 而非 Debug Monitor 44

註 : 在 Windows 7/8 與 Vista 上, 若您是第一次開啟此選項, 您將需要將您的 PC 重新開機 WinDbg 是免費的 Windows Kernel 除錯工具, 與 Windows 驅動程序工具包 (WDK) 一起發行, 是 Windows 除錯工具包的一部分, 藉由微軟的網站發布 3. 當您設定完成選項和級別, 點擊 OK 關閉 Debug Options 視窗 4. 啟動您的應用程式 ( 一個步驟或一次運行 ) 5. 觀看 Debug Monitor 紀錄 ( 或者已啟用的 Kernel 除錯工具的紀錄 ) 有無錯誤或任何意外的訊息 第 7.2.1.1 章在重新命名的驅動執行 wddebug_gui wddebug_gui 記錄訊息預設是從 WinDriver 的核心模組 windrvr6.sys/.o/.ko 發出, 但是您也可以在重新命名過的驅動程式版本使用 wddebug_gui 記錄除錯訊息, 使用命令提示字元來開啟 driver_name 選項: wddebug_gui<driver_name> 註 : 驅動程式的名稱應設置為名稱的驅動程式文件, 不應包含文件的副檔名, 例如 :windrvr6, 而不是 windrvr6.sys ( 在 Windows 上 ) 或 windrvr6.o( 在 Linux 上 ) 若您已經將 Windows 上預設的 windrvr6.sys 驅動程式重新命名為 my_driver.sys, 您可以通過使用下面的控制台命令來記錄除錯訊息 :wddebug_gui my_driver 第 7.2.2 章 wddebugi 工具第 7.2.2.1 章在命令提示字元執行 wddebugi wddebug 版本的除錯監控工具, 可以在所有支持的作業系統 Windows,Windows CE 和 Linux 以命令提示字元運行 : 欲使用命令提示字元的除錯監控器, 運行 WinDriver/util/wddebug 下面將解釋其運行方式 註 : 在 Windows CE 上的命令提示字元模式執行, 請啟動一個命令窗口 (CMD.EXE) 在 Windows CE 目標, 然後在此 shell 裡面運行 WDDEBUG.EXE, 您亦可以執行 wddebug 的通過 Windows CE GUI, 請參閱本手冊的第 6.2.2.2 章節 在命令提示字元使用 Wddebu wddebug [<driver_name>] [<command>] [<level>] [<sections>] 註 :Wddebug 的參數必須依照上述的使用說明順序做設定 <driver_name>: 驅動程式的應用命令名稱, 驅動程式的名稱應該被設定為 WinDriver 的內核模組名稱 windrvr6, 或重新命名版本的驅動程式名稱 ( 請參閱本手冊的第 15.2 章節 ) 註 : 驅動程式的名稱設定不應包含文件的副檔名, 例如,windrvr6, 而不是 windrvr6.sys(windows) 或 windrvr6.o( 在 Linux 上 ) 45

<command>: 除錯監控要執行的命令 : 1. 啟動命令 On: 開啟 Debug Monitor. Off: 關閉 Debug Monitor dbg_on: 將傳遞至 Debug Monitor 的除錯訊息, 重新導向至 OS 的內核除錯工具, 並開啟 Debug Monitor 註 : 在 Windows 8 中,7 和 Vista, 若您是第一次啟用此選項, 您將需要重新啟動 PC dbg_off: 停止將除錯訊息導向至 OS 的內核除錯工具 註 :On 和 dbg_on 命令, 可以和 <level> 與 <sections> 一起被執行 2. dump:: 持續顯示除錯訊息, 直到用戶選擇停止 3. status: 顯示相關的運行 <driver_name> 驅動程式,Debug Monitor 狀態, 包括運行的除錯級別和部分 ( 當 Debug Monitor 運行中 ), 以及除錯訊息的記憶體緩衝區大小 4. help: 顯示使用說明 5. None: 您可以在 Windows CE 以外的平台上, 以不帶任何參數任何命令的情況下運行 wddebug, 相當於運行 wddebug help 在 Windows CE 上以不帶參數的情形運行 wddebug, 會啟動該應用程式的 Windows CE GUI 版本 下面的選項是只適用於 on 與 dbg_on 參數的命令 : 1. <level>: 除錯與追尋級別設定 level 可以設定為 ERROR, WARN, INFO 或 TRACE,ERROR 為最低級別, TRACE 為最高級別 ( 所有訊息接追蹤 ), 此參數預設為 TRACE 2. <sections>: 除錯部分的設定 除錯部分可以設定您想監控 WinDriverAPI 的哪些部分 運行 wddebug help 可查看該應用程序的使用說明以及完整的除錯部分列表清單 Sections 的預設參數值為 ALL 將追蹤所有的 sections 使用順序 使用 wddebug 記錄除錯訊息, 使用順序如下 : 1. 運行 wddebug 來開啟 Debug Monitor, 使用 on 命令或 dbg_on 命令 ( 若欲將除錯訊息導向至 OS 內核除錯工具, 請在開啟 Debug Monitor 前開啟此命令 ) 您可以使用 level 和 / 或 sections 旗標設置 level 和 / 或 sections 的除錯記錄 若沒有設置這些選項, 系統將會使用預設值 您也可以記錄重新命名後驅動程式的除錯訊息 ( 請參閱上述 <driver_name> 選項設定 ), 預設的驅動名稱為 windrvr6 2. 執行 wddebug 的 dump 命令, 將除錯信息轉儲至命令提示字元 通過在命令提示字元下顯示的指示, 您可以在任何時間關閉顯示的除錯訊息 3. 使用驅動程式運行應用程式, 並查看被記錄至命令提示字元 /OS 除錯工具的除錯訊息 4. 您可以執行 wddebug 的 status 命令, 在 Debug Monitor 開啟時的任何時候, 以查看目前的除錯 level 和 section, 以及運行的 <driver_name> 驅動程式其相關的核心模組 5. 在 Debug Monitor 執行時, 您可以在任何時刻使用 dbg_on 和 dbg_off, 將除錯訊息重新定向至 OS 內核除錯工具 46

6. 運行 wddebug 的 off 命令, 來關閉 Debug Monitor 即便 Debug Monitor 是關閉的, 您也可以運行 wddebug 的 status 命令是關閉的, 以查看運行的 <driver_name> 驅動程式相關資訊 範例 以下範例為典型的 wddebug 使用順序範例 由於沒有 <driver_name> 的設置, 所有的命令將應用於預設的驅動程式 windrvr6 開啟 Debug Monitor 的最高追踪級別, 並追蹤所有的 sections:wddebug on TRACE ALL, 請注意, 此方式與執行 wddebug on TRACE 是一樣的, 因為預設的 section 為 all 持續轉存除錯訊息, 直到用戶選擇停止 :wddebug dump 在命令提示字元下使用驅動程式並查看除錯訊息 關閉 Debug Monitor:wddebug off 使用說明 : wddebug help, 如上所述, 在 Windows CE 以外的所有平台上, 等同於不帶任何參數運行 wddebug 第 7.2.2.2 章 WindowsCE GUI wddebugi 執行 在 Windows CE 中, 您可以藉由運行不帶任何參數的 wddebug, 來記錄除錯訊息 此方法是設計用來在 Windows CE 上, 不需要使用命令提示字元命令開啟除錯紀錄 在此平台上, 您可以通過雙擊便可執行 wddebug, 相當於在命令提示字元下, 以不帶任何參數的情況下運行應用程式 當執行不帶參數的 wddebug 時, 用戶將被下列的 GUI 訊息視窗告知, 紀錄的訊息將被儲存在一個預設的日誌文件 - wdlog.txt,windows CE 的根目錄中, 並且可以選擇取消或繼續 圖 6.3 Windows CE 啟動 wddebug 日誌的訊息 若用戶選擇繼續, 除錯記錄將以 TRACE 追蹤等級被開啟 ( 記錄所有 sections 的訊息 ), 並開始將 Debug Monitor 的除錯訊息轉儲至 wdlog.txt 日誌文件中 通過個專用的 GUI 訊息框, 用戶可以在任何時候停止記錄, 並關閉除錯記錄 47

圖 6.4 Windows CE 的 wddebug 關閉視窗 48

第八章特別合作的晶片廠商 第 8.1 章概論 本說明書包含完整的 WinDriver 標準 API 與 DriverWizard 程式自動生成的範例程式說明, 可以支援任何 USB 設備驅動程式的開發 ; 另外 WinDriver 針對特定的 USB 晶片組廠商提供特殊支援, 該特殊支援包括專為這些晶片組所開發的客製化 API 和範例診斷程式碼 WinDriver 的特殊支援, 目前可用於 Cypress 的 EZ-USB 系列 第 8.2 章使用特殊合作支援晶片組進行開發 當開發一個基於特殊合作晶片組的驅動程式時, 您可以按照以下步驟, 使用 WinDriver 的特殊晶片支援 : 1. 在 WinDriver/ chip_vendor/ chip_name 的目錄夾下, 尋找您設備的診斷程式範例, 大多數的診斷程式範本, 都被命名為 xxx_diag, 其原始程式碼通常在 xxx_diag 子目錄中 該執行檔可以在您的目標作業系統子目錄下找到 ( 例如 :Windows 32bit 便是 WIN32 ) 2. 運行該診斷程式來診斷設備並自行選擇您所需的範例程式選項 3. 使用該範例程式做為您的驅動程式骨架, 並且根據您的開發需求修改該程式, 當修改程式時您也可以自行添加其餘的 WinDriver API 進入您的程式碼中, 您可以從 WinDriver/chip_vendor/lib directory 資料夾中找到 49

第九章 USB 傳輸 第 9.1 章 USB 概論 本章提供了使用 WinDriver 實現 USB 傳輸的詳細介紹 正如 3.5 節中所述的兩種 USB 主機和設備之間的數據傳輸標準 - 控制傳輸和數據傳輸功能 WinDriver 的 API, 可以幫助您實現兩種控制和功能的數據傳輸 9.1 章節介紹的 DriverWizard 工具, 它使您能夠從一個 GUI 環境進行傳輸, 並介紹如何顯示設備的管道 圖 9.1 USB 數據傳輸 下文第 9.2 節提供有關 USB 控制傳輸, 以及他們如何用 WinDriVer 實現的詳細解說 9.3 節介紹 windriver 所提供的數據傳輸功能的實施方案 第 9.2 章 USB 控制傳輸第 9.2.1 章 USB 控制傳輸概論第 9.2.1.1 章控制數據傳輸 USB 控制傳輸是用來確定設備識別和配置要求並且對該設備進行配置, 也可以用於設備特定的其他目的, 包括控制設備上的其他管道 控制傳輸是通過控制管道 預設為 pipe0, 這是必然存在的管道 控制傳輸包括一個安裝階段 ( 一個安裝程式包會從主機被發送到設備 ), 一個可自訂的數據階段和狀態階段 第 9.2.1.2 章控制數據傳輸進階介紹 控制傳輸, 是以一個安裝階段做開始 接著傳輸零或多個其他控制傳輸的數據 ( 數據階段 ), 該數據會含有請求的特定資訊, 最後, 一個控制傳輸完成的狀態值, 會被返回到主機, 已告知控制傳輸已經完成 50

在設置階段時, 一個 8bytes 的設置數據包, 會夾帶傳輸信息被傳輸到設備的控制端點 ( 端點 0) 並且依照 USB 規範定義的設置數據包格式做傳輸 一個控制傳輸, 可以是讀取或是寫入 在讀取的控制傳輸中, 其設置數據包會表示數據的特性以及讀取的數據量 在寫入的控制傳輸中, 設置數據包會包含寫入至設備的命令以及控制數據傳輸的數據量, 這些資訊會在數據階段被發送至設備端 請參閱圖 9.2(USB 規範制定 ) 讀取傳輸和寫入傳輸的序列 '(in)' 表示從設備到主機的數據流 (out) 表示從主機到設備的數據流, 圖 9.2 USB 的讀取和寫入 第 9.2.1.3 章設置數據包 設置數據包 ( 結合了控制數據階段與狀態階段 ), 用於配置並發送命令到設備端 第 9 章 USB 規範定義了標準設備請求 例如,USB 會使用設置數據包從主機發送請求到設備 USB 設備需要正確響應這些請求 此外, 每個供應商可以自行定義特定於該設備的設置數據包來執行特定的設備操作 標準安裝包 ( 標準的 USB 設備請求 ) 詳述如下 每個 USB 設備供應商的設備相關安裝包, 會在供應商的數據手冊中詳述 第 9.2.1.4 章 USB 設置數據包格式 下表顯示的 USB 安裝包格式 欲了解更多信息, 請參閱 http://www.usb.org 的 USB 規範 51

Byte 領域 (Field) 描述 (Description) 0 bmrequest Type Bit 7: 請求描述 (0=Host to device Out, 1=Device to host In). Bits 5-6: 請求型態 (0=standard, 1=class, 2=vendor, 3=reserved). Bits 0-4: 接收 (0=device, 1=interface, 2=endpoint,3=other). 1 brequest 實際請求 ( 見標準設備請求代碼表中 [9.2.1.5]) 2 wvaluel 一個字大小的值, 根據客戶的要求而有所不同 例如, 在 CLEAR_FEATURE 請求中使用該值來選擇功能的, 在 GET_DESCRIPTOR 請求中, 該值表示描述符的類型, 在 SET_ADDRESS 請求中, 該值則表示設備的地址 3 wvalueh Value 的高位字節 4 windexl 一個字大小的值, 根據客戶的要求而有所不同 該值通常是用來指定一個端點或介面 5 windexh Index 的高位字節 6 wlengthl 一個字大小的值, 該值指示要傳輸的字節數, 若有數據傳輸階段 7 wlengthh Length 的高位字節 第 9.2.1.5 章標準設備請求代碼 下表顯示了標準設備請求代碼 brequest Value GET_STATUS 0 CLEAR_FEATURE 1 Reserved for future use 2 SET_FEATURE 3 Reserved for future use 4 SET_ADDRESS 5 GET_DESCRIPTOR 6 SET_DESCRIPTOR 7 GET_CONFIGURATION 8 SET_CONFIGURATION 9 GET_INTERFACE 10 SET_INTERFACE 11 SYNCH_FRAME 12 第 9.2.1.6 章設置包範例 52

這個例子說明了一個標準的 USB 設備請求安裝包格式及其參數 設置數據包是十六進制格式 下面的設置數據包是一個控制讀取傳輸, 從 USB 設備獲取設備描述符 設備描述符包括 USB 標準描述, 供應商 ID 和產品 ID 等信息 GET_DESCRIPTOR (Device) 設置包 80 60 00 01 00 00 12 00 設置包的定義 : Byte Field 值 ( Value) 描述 (Description) 0 BmRequest Type 80 8h=1000b bit 7=1 -> 定義資訊流為設備向主機 0h=0000b bits 0..1=00 -> 由設備接收 1 brequest 60 請求為 GET_DESCRIPTOR. 2 wvaluel 00 3 wvalueh 01 描述符設備類型 (USB 規範中定義的值 ) 4 windexl 00 由於在設置包中只有一個設備描述符, 因此該索引值是不相關的 5 windexh 00 6 wlengthl 12 要檢索的數據長度 :18(12h) 字節 ( 這是該設備的描述符的長度 ) 7 wlengthh 00 在回應中, 設備發送設備描述符的數據 以 Cypress 的 EZ-USB 集成電路提供的設備描述符作為一個例子 : Byte No. 0 1 2 3 4 5 6 7 8 9 10 Content 12 01 00 01 ff ff ff 40 47 05 80 Byte No. 11 12 13 14 15 16 17 Content 00 01 00 00 00 00 01 如同在 USB 規範中的定義,0 字節表示描述符的長度, 字節 2-3 包含的 USB 規範版本號碼, 字節 7 是控制端點 ( 端點 0) 的最大數據包尺寸,8-9 字節是供應商的 ID, 字節 10-11 的產品 ID 等 第 9.2.2 章使用 WinDriver 執行控制傳輸 WinDriver 允許您可以輕鬆地透過控制傳輸控制管道 ( 管道 0) 做傳輸, 並使用 DriverWizard 來測試您的設備 您可以使用 [5] DriverWizard 的 API 為您的硬件生成範例程式, 或從您的應用程序內直接調用 WinDriver 的 WDU_Transfer() 函數 [B.4.8.1] 第 9.2.2.1 章使用 DriverWizard 執行控制傳輸 1. 選擇 pipe 0x0 並且點選 Read/White 按鈕 2. 您可以輸入一個自定義安裝包, 或使用標準的 USB 請求 對於一個自定義的請求 : 輸入所需的安裝包字段 以一個寫入傳輸處理來說, 其中惠包括一個數據階段, 接著在 53

Write to pipe data (Hex) field 選項中, 輸入的要寫入管道的數據 ( 十六進制 ) 字段 點擊 Read From Pipe or Write To Pipe, 根據您所選定的傳輸處理 ( 見圖 9.3) 圖 9.3 自定義請求 對於一個標準的 USB 請求 : 從請求列表中選擇一個 USB 請求, 其中包括下列請求, 如 GET_DESCRIPTOR CONFIGURATION, GET_DESCRIPTOR DEVICE, GET_STATUS DEVICE 等 ( 見圖 9.4) 您所選定的請求, 會在右側 請求說明 框中顯示相關的資訊 圖 9.4 請求列表 54

3. 傳輸結果, 例如數據被讀取或有相關的錯誤, 都會顯示在 DriverWizard 的日誌窗口 下面的圖 9.5,GET_DESCRIPTOR 設備請求成功後, 登錄窗口顯示的內容 圖 9.5 USB 請求日誌 第 9.2.2.2 章使用 WinDriver APIs 執行控制傳輸 要在控制管道執行讀或寫的傳輸, 您可以使用 DriverWizard 為您的硬件產生相關 API, 或直接在您的應用程序內調用 WinDriver WDU_Transfer() 函數 [B.4.8.1] 填寫安裝包中的 BYTE SetupPacket[8] 數組, 並調用這些函數透過控制管道 (pipe 0) 傳輸設置數據包, 並從設備端取得數據的控制和狀態 55