23
2011/11/16 1 WEC7向けUSBクラスドライバの実装 株式会社アキタ電⼦システムズ 伊藤 優 11.16.2011 - 広がる携帯デバイス連携に向けて - 発表者紹介 発表者 ソフトウェア設計部 伊藤 優 Microsoft Most Valuable Professional Windows Embedded主な活動 開発サポート(Windows Embedded製品) 技術講演、セミナー、技術誌への寄稿 社名:株式会社アキタ電⼦システムズ 業務内容 ソフトウェア開発 (組み込み, Windows アプリ, WebWindows Embedded Gold Partner LSI 設計, ボード設計

WEC7向けUSBクラスドライバの実装download.microsoft.com/download/C/4/A/C4A73DB0... · – Android:AOAP(Android Open Accessory Protocol) – Nokia:Terminal Mode –

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: WEC7向けUSBクラスドライバの実装download.microsoft.com/download/C/4/A/C4A73DB0... · – Android:AOAP(Android Open Accessory Protocol) – Nokia:Terminal Mode –

2011/11/16

1

WEC7向けUSBクラスドライバの実装株式会社アキタ電⼦システムズ 伊藤 優11.16.2011

- 広がる携帯デバイス連携に向けて -

発表者紹介

• 発表者– ソフトウェア設計部 伊藤優– Microsoft Most Valuable Professional(Windows Embedded)– 主な活動

• 開発サポート(Windows Embedded製品)• 技術講演、セミナー、技術誌への寄稿

• 社名:株式会社アキタ電⼦システムズ• 業務内容

– ソフトウェア開発(組み込み, Windows アプリ, Web)– Windows Embedded Gold Partner

– LSI 設計, ボード設計

Page 2: WEC7向けUSBクラスドライバの実装download.microsoft.com/download/C/4/A/C4A73DB0... · – Android:AOAP(Android Open Accessory Protocol) – Nokia:Terminal Mode –

2011/11/16

2

最初に

• 組み込みデバイスへのUSBデバイスの接続が要求される機会が増えています。これまでもマウス、キーボートといったHIDやUSBメモリへの対応はありました。特に最近では、Apple社製iPod/iPhoneやAndroid端末、Microsoft Windows Phone 7といったスマートフォン対応の期待がますます⾼まっています。そこで本セッションでは、USBクラスドライバを新たに追加する⼿法について説明します。

• 本セッションのゴール– USBドライバの基本構造を理解する。– USBクラスドライバの実装ポイントについて学ぶ。– とにかくUSBドライバのキーワードを押さえてください。

⽤語の定義

• 本資料で使⽤する⽤語を定義します。– USBホスト:接続におけるホスト側。– USBデバイス:接続における周辺デバイス側。– USBホストドライバ:USBホスト⽤デバイスドライバ。USBDとHCDを含む。

– USBクラスドライバ:接続したUSBデバイスに応じてUSBホストドライバにロードするクライアントドライバ。

– USBファンクションドライバ:USBデバイス⽤デバイスドライバ。

USBホスト

USBデバイスOUT

IN

USBホストドライバ USBファンクションドライバ

USBクラスドライバデバイスごとの制御

Page 3: WEC7向けUSBクラスドライバの実装download.microsoft.com/download/C/4/A/C4A73DB0... · – Android:AOAP(Android Open Accessory Protocol) – Nokia:Terminal Mode –

2011/11/16

3

組み込みデバイスとUSB

USBデバイスの現状

• PC⽤の外部I/Fとして、ほとんど全ての機種に搭載されている。

• USBデバイスとしては様々なものが準備されている。– マウス、キーボードなどの⼊⼒デバイス– フラッシュメモリ、HDDなどの⼤容量ストレージ機器– マイク、スピーカー、ビデオカメラ– Ethernet、WiFi、Bluetooth、モデムなどの通信機器– iPod、WALKMANなどのミュージックプレイヤー– iPhone/iPad、Android携帯などのスマートデバイス– 指紋認証、ICカードなどセキュリティ機器– 扇⾵機、⽑布、ドリンクウォーマーなど様々なガジェット– 他にもいろいろありますよね?

何でも接続できて便利!

Page 4: WEC7向けUSBクラスドライバの実装download.microsoft.com/download/C/4/A/C4A73DB0... · – Android:AOAP(Android Open Accessory Protocol) – Nokia:Terminal Mode –

2011/11/16

4

スマートデバイスの急速な拡⼤

• 急速に伸びるスマートフォン– 単独でも多くの機能を実現できる。

– 実際にはPCを⺟艦にしデータの保存などを実現している。

• PCとスマートデバイスの接続– 接続形態:USB、Ethernet、WiFi、Bluetoothなど。– 電話帳データの保存 ⾳楽データ、アプリケーションデータなど、より多くのデータをアーカイブする事に変化。

– スマートデバイスは、PCレスを⽬指し、さらに形を変えて進化している。

Maker Q4 2009(台) Q4 2010(台)Google 4.7M 33.3M

Nokia 23.9M 31.0M

Apple 8.7M 16.2M

RIM 10.7M 14.6M

Microsoft 3.9M 3.1M

Others 1.8M 3.0M

組み込みデバイスへの要求の変化

• これまでの組み込みデバイスとUSB

– 多くの組み込みデバイスは“USBデバイス”だった。デジタルカメラ、オーディオプレイヤー、外部記憶装置キーボード、マウス、スピーカー、マイク、ビデオカメラモデム、ネットワーク

• ホスト側になる組み込みデバイスが増加– ホスト側:オーディオ機器、カーナビゲーションシステム

• Apple iPod/iPhone接続(オーディオ、ビデオ)• 外部記憶装置(USBメモリやHDDなど)

– ホスト側:無線ルーター• モデム

• 汎⽤バスとして内部デバイスの接続にも利⽤– インターフェースが合えば、デバイスのディスコンにも対応可

Page 5: WEC7向けUSBクラスドライバの実装download.microsoft.com/download/C/4/A/C4A73DB0... · – Android:AOAP(Android Open Accessory Protocol) – Nokia:Terminal Mode –

2011/11/16

5

市場要求:スマートフォン連携の拡⼤

• スマートフォンの急速な拡⼤により、組み込みデバイスとスマートフォンの連携がさらに拡⼤しようとしている。– iPod/iPhone:iPod Out

– Android:AOAP(Android Open Accessory Protocol)– Nokia:Terminal Mode

– その他• スマートフォンと接続する事で、組み込みデバイスからスマートフォンの画⾯を操作できる機能の拡⼤(like RDP)

USBバス画⾯のコピー

操作

スマートフォン 組み込みデバイス

組み込みデバイスにおけるUSB接続の課題

• USBホスト側のサポート可能なデバイス– WEC7がサポートするUSBクラスドライバ

• HID、マスストレージ、USBシリアル、プリンター– 接続が期待されるUSBデバイス

• 携帯オーディオ、スマートフォン、USBカメラ• 互換性

– 多くのUSBデバイスはPCをターゲットに互換性チェックを実施

– 組み込みデバイスの開発者側で互換性チェックを⾏う必要!• 速度

– 組み込みデバイスのCPUはPCと⽐べると⾮⼒な場合が多く、速度を確保するためには、特別な実装が必要になる。

PCのように接続できない

Page 6: WEC7向けUSBクラスドライバの実装download.microsoft.com/download/C/4/A/C4A73DB0... · – Android:AOAP(Android Open Accessory Protocol) – Nokia:Terminal Mode –

2011/11/16

6

これからの組み込みデバイスとUSB

• より多くのUSBデバイスとの連携が急務

• WEC7:USBホストドライバのフレームワークが提供USBクラスドライバを追加する事で、より多くのUSB

デバイスとの連携ができる

組み込みデバイス

スマートフォン HIDミュージックプレイヤー

スピーカー

マスストレージ

USBの基本を確認しよう

Page 7: WEC7向けUSBクラスドライバの実装download.microsoft.com/download/C/4/A/C4A73DB0... · – Android:AOAP(Android Open Accessory Protocol) – Nokia:Terminal Mode –

2011/11/16

7

USBの基礎知識

• USBの基本仕様

I/F 通信⽅式デバイス数

(Max)

距離(Max bps)

バス速度 ⽤途

USB 2.0 半⼆重シリアル

127 16feet 1.5Mbps(Low)12Mbps(Full)480Mbps(High)

キーボードマウスハードディスクスピーカープリンタカメラ携帯電話ネットワーク

USB 3.0 全⼆重シリアル

127 9feet 5Gbps(Super)

⼤容量記憶装置ビデオデバイス

USBの役割分担USBホストの役割デバイスの検出 エニュメレーションを⾏いデバイスを検出するデータフロー管理 USBバス上のデータトラフィック管理を⾏うエラーチェック USBデバイスに送信したデータのエラー応答チェックを⾏

う電⼒の供給と管理 電⼒を供給するとともに出⼒する容量を制御するデバイスとのデータ交換 USBデバイスとのデータ送受信を⾏う

USBデバイスの役割通信の検出 ホストから⾃USBデバイスに送られたデータを検出する標準リクエストへの応答 接続開始時のエニュメレーション処理の間、USBホストか

ら要求される標準リクエストに応答するエラーチェック USBホストに送信したデータのエラー応答チェックを⾏う電⼒の管理 ホストからの要求による低電⼒モードの制御を⾏うホストとのデータ交換 USBホストとのデータ送受信を⾏う

Page 8: WEC7向けUSBクラスドライバの実装download.microsoft.com/download/C/4/A/C4A73DB0... · – Android:AOAP(Android Open Accessory Protocol) – Nokia:Terminal Mode –

2011/11/16

8

USB 2.0転送の概要転送⽅式 Control Bulk Interrupt Isochronous

⽤途 USBの機能を使⽤するための転送⽅式。識別とコンフィグレーション。

速度保証を必要としないデバイス向け。記憶装置、プリンタ、ネットワーク。

要求に対し、短時間に応答するデバイス向け。マウス、キーボード。

主にストリーミング向け。データの保証は無い。オーディオ、ビデオ。

Maxパケットサイズ(High Speed) 64 512 1024 1024

Maxパケットサイズ(Low Speed) 8 - 8 -

データフローの⽅向 IN and OUT IN or OUT IN or OUT IN or OUT

エラー訂正 あり あり あり 無し転送レート保証 無し 無し 無し ありレイテンシ保証 無し 無し あり あり

WEC7のデバイスドライバとは?

Page 9: WEC7向けUSBクラスドライバの実装download.microsoft.com/download/C/4/A/C4A73DB0... · – Android:AOAP(Android Open Accessory Protocol) – Nokia:Terminal Mode –

2011/11/16

9

WEC7のアーキテクチャ

Usermode

Kernelmode

OEM Adaptation Layer (OAL)

Kernel

Kernel Mode APIs (KCOREDLL.DLL)

User Mode APIs (COREDLL.DLL and additional DLLs)

Native Application

ManagedApplication

User mode drivers host

Common Language Runtime

Services host

Service

Service

Service

SilverlightApplication

Service

Service

DriverServic

e

Service

DriverXAML runtime

KITL

Kernel Debugger

Device Manager

FileSystemManager

Graphics, Windowingand EventsSubsystem

DriversDriversDrivers

Network Stack

WEC7のデバイスドライバ

• DLL として構成• カーネルモードドライバとユーザーモードドライバ• “GWES” Loaded Device Drivers(ネイティブ)

– Graphics, Windowing, and Events Subsystem– Driver:Display, Keyboard, Mouse, Touch

• Stream Interface Device Drivers– Device Manager が管理する

• Udevice.exe:ユーザーモードドライバ• Devmgr.dll:カーネルモードドライバ

– 標準のファイルシステム API で制御• ⾮同期I/Oのサポート(WEC7)

Page 10: WEC7向けUSBクラスドライバの実装download.microsoft.com/download/C/4/A/C4A73DB0... · – Android:AOAP(Android Open Accessory Protocol) – Nokia:Terminal Mode –

2011/11/16

10

Device Manager:ストリームインターフェースドライバ

Monolithic Stream

Interface Driver

Stream Interface

Stream Interface

NDIS Wrapper

Device Manager

Stream Interface

(DDI)

MDD

NDIS NDIS Wrapper

NDIS Miniport

PDD

Device

ストリームインターフェース⼀覧• ドライバロードのために呼び出されるXXX_Init

• ドライバアンロードのために呼び出されるXXX_Deinit

•アプリケーションもしくは他のドライバからこのドライバに接続するために呼び出されるXXX_Open

•セッションを明⽰的にクローズするかセッションのオーナーが停⽌した時に呼び出されるXXX_Close

• データをリードするXXX_Read

• データをライトするXXX_Write

• カレントポジションをセットするXXX_Seek

• カスタムの機能を持つドライバ(⼀般に本関数を使⽤する)XXX_IoControl

• サスペンドモードに移⾏する際に呼び出されるXXX_PowerDown

• サスペンド状態からリジュームする際に呼び出されるXXX_PowerUp

• 停⽌しているI/O操作をキャンセルする際に呼び出されるXXX_Cancel

•ドライバ内部のスレッドによりセッションに関係するリソースを開放するために呼び出されるXXX_PreClose

•ドライバ内部のスレッドによりインスタンスを含めたリソースを開放するために呼び出されるXXX_PreDeinit

Page 11: WEC7向けUSBクラスドライバの実装download.microsoft.com/download/C/4/A/C4A73DB0... · – Android:AOAP(Android Open Accessory Protocol) – Nokia:Terminal Mode –

2011/11/16

11

イベント駆動型デバイスドライバの仕組み

1. デバイスが割り込みを発⽣させる2. カーネルが例外を受け取ると、ISR(Interrupt Service Routine)を

呼び出す3. ISR で割り込みをマスクして短時間で処理を渡す4. 割り込み処理として IST(Interrupt Service Thread)がドライバの

処理をおこなう

KERNEL.DLLException Handler

Device Interrupt Service Routine (ISR)

InterruptService Thread(IST)

Inte

rrupt

Event

1

2

34

Inte

rrupt

ID

WEC7におけるUSBドライバ

• 開発環境:Platform Builder 7.0– Publicフォルダの位置:c:¥wince700¥public¥common¥oak¥drivers

– USBホストドライバのフォルダ:usb

– USBファンクションドライバのフォルダ:usbfn

• Usbフォルダに含まれるライブラリ等– USBホストドライバ

HCD:OHCI、UHCI、EHCIUSBD

– USBクラスドライバHID、マスストレージ、シリアル、プリンタ

• ドライバのロード位置- カーネルモードドライバ、ユーザーモードドライバ

Page 12: WEC7向けUSBクラスドライバの実装download.microsoft.com/download/C/4/A/C4A73DB0... · – Android:AOAP(Android Open Accessory Protocol) – Nokia:Terminal Mode –

2011/11/16

12

Platform Builder 7.0USBホストドライバフォルダ構成• ルートフォルダ:c:¥wince700¥public¥common¥oak¥drivers

usb

class

clientcmn

common

hid

storage

usbsercommon

hcd

common

usb20

ehci

ehcipddinc

usbd

usermode※⼀部フォルダを省略してあります

USBD

HCD

USBクラス

新規のUSBクラスドライバはここに追加する。

WEC7のUSBドライバ構造

Page 13: WEC7向けUSBクラスドライバの実装download.microsoft.com/download/C/4/A/C4A73DB0... · – Android:AOAP(Android Open Accessory Protocol) – Nokia:Terminal Mode –

2011/11/16

13

USB通信のイメージ

USBクラスドライバ

PhysicalDevice

LogicalDevice

BusInterface

HCD Module

USBController

USBD Module

Device SpecificPipes

Default Pipe

USB Cable

SystemSoftware

SystemHardware

USBデバイス USBホスト

USBDI Interface

HCD Interface

HC Interface

USBホスト側の役割分担

• USBDを通してUSBデバイスの制御を⾏う。

• USBデバイスごとに、個別のストリームドライバを開発する。

USBクラスドライバ

• USBクラスドライバ向けのAPIを提供する。USB_FUNCSで⽰される各種関数が提供される。

• USBクラスドライバのロード/アンロードを⾏う。USBD

• エニュメレーション。

• HCDとしての基本的なUSB通信機能を提供する。

HCD

(OHCI/UHCI/EHCI)

Page 14: WEC7向けUSBクラスドライバの実装download.microsoft.com/download/C/4/A/C4A73DB0... · – Android:AOAP(Android Open Accessory Protocol) – Nokia:Terminal Mode –

2011/11/16

14

USBDが提供する関数⼀覧• USBD_FUNCS gc_UsbFuncsとして定義されている。

– USBクラスドライバのアタッチで、gc_UsbFuncsを渡す。GetUSBDVersion SetFrameLength OpenPipe GetIsochResults

OpenClientRegistryKey GetDeviceInfo AbortPipeTransfers AbortTransfer

RegisterNotificationRoutine IssueVendorTransfer ResetPipe CloseTransfer

UnRegisterNotificationRoutine GetInterface ClosePipe ResetDefaultPipe

LoadGenericInterfaceDriver SetInterface IsPipeHalted IsDefaultPipeHalted

TranslateStringDescr GetDescriptor IssueControlTransfer DisableDevice

FindInterface SetDescriptor IssueBulkTransfer SuspendDevice

GetFrameNumber SetFeature IssueInterruptTransfer ResumeDevice

GetFrameLength ClearFeature IssueIsochTransfer GetClientRegistryPath

TakeFrameLengthControl GetStatus IsTransferComplete LoadGenericIADDriver

ReleaseFrameLengthControl SyncFrame GetTransferStatus

USB割り込みの流れ(挿抜検出時)

CRootHub::WaitForPortStatusChange

USB ISR

CHW::UsbInterruptThread

CHW::WaitForPortStatusChange

USB HostのIST

Event通知

rerturn

rerturn

Attach/Detach処理

Event通知

挿抜判断(挿抜検知時)

CHub::HubStatusChangeThread

Page 15: WEC7向けUSBクラスドライバの実装download.microsoft.com/download/C/4/A/C4A73DB0... · – Android:AOAP(Android Open Accessory Protocol) – Nokia:Terminal Mode –

2011/11/16

15

USB割り込みの流れ(データアクセス時)USB ISR

CHW::UsbInterruptThread

USB HostのIST

CallBack

呼び出したクラスドライバに戻る

Event通知

データアクセス時

CBusyPipeList::CheckForDoneTransfersThread

CheckForDoneTransfers(通信⽅式によりクラスが異なる)

DoneTransfer(通信⽅式によりクラスが異なる)

CallBack

コントロール、インターラプト、バルクCQueuedPipe::CheckForDoneTransfersCQTransfer::DoneTransfers

アイソクロナスCIsochronousPipe::CheckForDoneTransferCITransfer::DoneTransferCSITransfer::DoneTransfer

USBクラスドライバのロード

ポートチェンジ割り込みを受け、割り込み要因の判定後Eventを発⾏する。

USBデバイスへの標準リクエストを通じて、エニュメレーションを⾏う。

レジストリに従い、USBクラスドライバをロードし、適切なドライバを常駐させる。

Page 16: WEC7向けUSBクラスドライバの実装download.microsoft.com/download/C/4/A/C4A73DB0... · – Android:AOAP(Android Open Accessory Protocol) – Nokia:Terminal Mode –

2011/11/16

16

USBクラスドライバの実装

• ストリームインターフェースドライバとして実装DLL形式の実⾏ファイル

• ⼀般的なストリームインターフェースの他、USBクラスドライバとして必要な関数を実装する。– USBInstallDriver():USBクラスドライバのインストール– USBDeviceAttach():USBクラスドライバのアタッチ– USBUnInstallDriver():USBクラスドライバのアンインストール

• レジストリ– ドライバロード⽤レジストリ– ストリームインターフェースドライバ⽤レジストリ

レジストリの設定USBクラスドライバの例:USBシリアル• フォルダ

– c:¥wince700¥public¥common¥oak¥drivers¥usb¥class¥usbser

• レジストリの記述– [HKEY_LOCAL_MACHINE¥Drivers¥USB¥LoadClients¥1118_206¥Default¥D

efault¥SERIAL_CLASS]

– "Prefix"="COM"

– "Dll"="USBSer.DLL"

– [HKEY_LOCAL_MACHINE¥Drivers¥USB¥ClientDrivers¥SERIAL_CLASS]

– "Prefix"="COM"

– "Dll"="USBSer.DLL"

– "RxBufferSize"=dword:4000

– "DeviceArrayIndex"=dword:0

– "IClass"="{CC5195AC-BA49-48a0-BE17-DF6D1B0173DD}"

ドライバアタッチ時に必要とするレジストリ

Page 17: WEC7向けUSBクラスドライバの実装download.microsoft.com/download/C/4/A/C4A73DB0... · – Android:AOAP(Android Open Accessory Protocol) – Nokia:Terminal Mode –

2011/11/16

17

レジストリの設定グループIDの設定• USBクラスドライバ⽤レジストリキーのグループID

HKLM¥Drivers¥USB¥LoadClients¥Group1 ID¥Group2 ID¥Group3 ID¥<ドライバ名>

• Group IDが“Default”の場合、すべてのデバイスをチェックする。• Group IDがX、X_Y、X_Y_Zの場合、X、Y、Zは以下の情報を持つ。

– Group 1X:Device Vendor IDY:Device Product IDZ:Device Release #

– Group 2X:Device Class CodeY:Device Sub Class CodeZ:Device Protocol Code

– Group 3X:Interface Class CodeY:Interface Sub Class CodeZ:Interface Protocol Code

• 例:USBシリアルを再確認HKLM¥Drivers¥USB¥LoadClients¥1118_206¥Default¥Default¥SERIAL_CLASS

Device Vendor ID = 1118Device Product ID = 206

USBクラスドライバのアタッチUSBクラスドライバの例:USBシリアル

USBDeviceAttachSerialUsbClientDevice::Init()

UsbClientDevice::InitActivateDevice ()

USBクラスドライバ

LoadDeviceDriversLoadUSBClient()

LoadUSBClientLoadGroupDriver ()

LoadRegisteredDriverUSBDeviceAttach()

LoadGroupDriverLoadRegisteredDriver()

USBDUSBホストドライバ レジストリの情報から

ドライバをロードする

HKLM¥Drivers¥USB¥LoadClientsレジストリを基本とする

Page 18: WEC7向けUSBクラスドライバの実装download.microsoft.com/download/C/4/A/C4A73DB0... · – Android:AOAP(Android Open Accessory Protocol) – Nokia:Terminal Mode –

2011/11/16

18

データの受け渡しUSBクラスドライバの例:USBシリアル

SerialDataIn::InitReceiveBulkOrIntrTransfer()

UsbSyncClassPipe::BulkOrIntrTransferUsbTransfer::IssueBulkTransfer()

UsbTransfer::IssueBulkTransferUSBDFunction::IssueBulkTransfer()

CHcd::IssueTransferCfunction::IssueTransferCQueuedPipe::IssueTransferCTransfer::InitCITransfer::AddTransferCITD::IssueTransfer

USBクラスドライバ

USBD

HCD

USBホストドライバ

IST

IssueBulkTransfer

CHW::UsbInterruptThread

USBドライバのソースを確認

Page 19: WEC7向けUSBクラスドライバの実装download.microsoft.com/download/C/4/A/C4A73DB0... · – Android:AOAP(Android Open Accessory Protocol) – Nokia:Terminal Mode –

2011/11/16

19

USBシリアルドライバの流れUSBクラスドライバ

BOOL SerialDataIn::InitReceive(BOOL bInit) {

Lock();m_dwCurIndex = 0;if (bInit) {

m_dwCurIndex = 0 ;ResetTransferQueue();ResetPipe(TRUE);for (DWORD dwIndex = 0 ; dwIndex < m_dwNumOfSegment; dwIndex ++) {

m_dwSegDataOffset[dwIndex] = m_dwSegDataDataLen [dwIndex] = 0; VERIFY(BulkOrIntrTransfer(USB_NO_WAIT|USB_SHORT_TRANSFER_OK,

m_dwSegmentSize,m_VirtualAddress+(dwIndex*m_dwSegmentSize),m_PhysicalAddress.QuadPart!=0?(m_PhysicalAddress.u.LowPart+(dwIndex*m_dwSegmentSize)):0,SERIAL_DATAIN_COOKIE+dwIndex));

}

省略

}

Usbser.cpp - SerialDataIn::InitReceive

USBシリアルドライバの流れUSBクラスドライバ

BOOL UsbSyncClassPipe::BulkOrIntrTransfer(DWORD dwFlags,DWORD dwBufferSize, LPVOID lpvBuffer,ULONGuBufferPhysicalAddress,DWORD dwTimeout){

BOOL bReturn = FALSE;DEBUGMSG(m_dwDebugZone,(TEXT("+UsbSyncClassPipe::BulkOrIntrTransfer (%d,%x, %d)"),dwBufferSize,lpvBuffer,dwTimeout));if ( m_lpTransfer!=NULL &&

(GetPipeType () == USB_ENDPOINT_TYPE_BULK || GetPipeType () == USB_ENDPOINT_TYPE_INTERRUPT)) {if (GetPipeType () == USB_ENDPOINT_TYPE_BULK )

m_lpTransfer->IssueBulkTransfer(dwFlags,dwBufferSize,lpvBuffer,uBufferPhysicalAddress);else

m_lpTransfer->IssueInterruptTransfer(dwFlags,dwBufferSize,lpvBuffer,uBufferPhysicalAddress);if (!m_lpTransfer->IsTransferComplete()) {

m_lpTransfer->WaitForTransferComplete(dwTimeout);}bReturn = m_lpTransfer->IsCompleteNoError();

}DEBUGMSG(m_dwDebugZone,(TEXT("-UsbSyncClassPipe::BulkOrIntrTransfer (%d,%x)

return %d"),dwBufferSize,lpvBuffer,bReturn));return bReturn;

}

Usbserv.cpp - UsbSyncClassPipe::BulkOrIntrTransfer

Page 20: WEC7向けUSBクラスドライバの実装download.microsoft.com/download/C/4/A/C4A73DB0... · – Android:AOAP(Android Open Accessory Protocol) – Nokia:Terminal Mode –

2011/11/16

20

USBシリアルドライバの流れUSBクラスドライバ

BOOL UsbTransfer::IssueBulkTransfer(DWORD dwFlags , DWORD dwBufferSize, LPVOID lpvBuffer,ULONG uBufferPhysicalAddress,DWORD dwClientInfo,LPTRANSFER_NOTIFY_ROUTINE lpStartAddress,LPVOID lpvNotifyParameter )

{省略if (m_lpClassPipe->IsInPipe())

dwFlags |= USB_IN_TRANSFER;else

dwFlags &= ~USB_IN_TRANSFER;dwFlags |= USB_NO_WAIT;// Always Async.

m_hUsbTransfer = USBDFunction::IssueBulkTransfer(m_lpClassPipe->GetPipeHandle(),TransferNotifyStub,this,dwFlags,dwBufferSize,lpvBuffer,uBufferPhysicalAddress);

if (m_hUsbTransfer) { m_dwClientInfo = dwClientInfo;m_lpStartAddress = lpStartAddress ;m_lpvNotifyParameter = lpvNotifyParameter ;// For debugging.m_lTransferID = ++m_lCurrentID ;m_lpAttachedBuffer = lpvBuffer;m_dwAttachedSize = dwBufferSize;m_dwAttachedPhysicalAddr = uBufferPhysicalAddress ;

}省略

}

Usbserv.cpp - UsbTransfer::IssueBulkTransfer

ここでUSBに制御を渡す

USBシリアルドライバの流れUSBホストドライバ - USBD

IssueBulkTransfer(USB_PIPE hPipe, // @parm [IN] - Open USB pipe handle省略

{省略SDevice * pDev = pPipe->pDevice;SHcd * pHcd = pDev->pHcd;LPHCD_ISSUE_TRANSFER pFunc = pHcd->pHcdFuncs->lpIssueTransfer;BOOL fWait = FALSE;SWait * pWait = NULL;BOOL fRet;

省略

fRet = (*pFunc)(pHcd->pvHcd, pDev->iDevice, pPipe->iEndpointIndex,lpStartAddress, lpvNotifyParameter, dwFlags, NULL, 0, 0,NULL, dwBufferSize, pTransfer->pvBuffer, uBufferPhysicalAddress, pTransfer,NULL, NULL, &pTransfer->fComplete, &pTransfer->dwBytesTransfered,&pTransfer->dwError);

省略

}

Usbddrv.cpp - IssueBulkTransfer

USBDからHCDに制御を渡す

Page 21: WEC7向けUSBクラスドライバの実装download.microsoft.com/download/C/4/A/C4A73DB0... · – Android:AOAP(Android Open Accessory Protocol) – Nokia:Terminal Mode –

2011/11/16

21

USBシリアルドライバの流れUSBホストドライバ - HCD

HCD_REQUEST_STATUS CHub::IssueTransfer( 省略 )

{省略if ( m_ppCDeviceOnPort[ port - 1 ] != NULL ) {

status = m_ppCDeviceOnPort[ port - 1 ]->IssueTransfer(address,pipeIndex,lpStartAddress,lpvNotifyParameter,dwFlags,lpvControlHeader,dwStartingFrame,dwFrames,aLengths,dwBufferSize,lpvBuffer,paBuffer,lpvCancelId,adwIsochErrors,adwIsochLengths,lpfComplete,lpdwBytesTransfered,lpdwError );

}省略

}

Cdevice.cpp - CHub::IssueTransfer

実際のUSB通信ではHCDが制御を⾏う。通信の状態に合わせ、エラー制御含め

処理を⾏う。

USBシリアルドライバの流れUSBホストドライバ - HCD

HCD_REQUEST_STATUS CQueuedPipe::IssueTransfer( 省略 )

{省略

if (pTransfer && pTransfer->Init()) {CQTransfer* pCurTransfer = m_pUnQueuedTransfer;if (pCurTransfer) {

while (pCurTransfer->GetNextTransfer()!=NULL) pCurTransfer = (CQTransfer*)pCurTransfer->GetNextTransfer();pCurTransfer->SetNextTransfer(pTransfer);

}else {

m_pUnQueuedTransfer = pTransfer;}status=requestOK;

}else {

if (pTransfer) { // We return fails here so do not need callback;pTransfer->DoNotCallBack();delete pTransfer;

}SetLastError(ERROR_NOT_ENOUGH_MEMORY);

}}

省略}

Cpipe.cpp - CQueuedPipe::IssueTransfer

Page 22: WEC7向けUSBクラスドライバの実装download.microsoft.com/download/C/4/A/C4A73DB0... · – Android:AOAP(Android Open Accessory Protocol) – Nokia:Terminal Mode –

2011/11/16

22

USBシリアルドライバの流れUSBホストドライバ – HCD IST

DWORD CHW::UsbInterruptThread( ){省略while ( !m_fUsbInterruptThreadClosing ) {

WaitForSingleObject(m_hUsbInterruptEvent, INFINITE);省略if (usbsts.bit.PortChanged) {

SetEvent(m_hUsbHubChangeEvent);}Write_USBSTS(usbsts);// Clear_USBSTS( );省略if(g_fPowerUpFlag){省略

}else if (usbsts.bit.USBINT || usbsts.bit.USBERRINT) {

if (m_cBusyPipeList.CheckForDoneTransfersThread() == 0) {省略

}}InterruptDone(m_dwSysIntr);

}return (0);

}

Chw.cpp- DWORD CHW::UsbInterruptThread

USBからの割り込み待ち

USBデバイス挿抜時のイベント通知

挿抜以外の処理をコール

IST終了

まとめ

• USBクラスドライバ実装の確認– ⼀般的なストリームインターフェースドライバを開発する。– USBD向けのAPIを実装する(USBInstallDriver、USBDeviceAttach、

USBUninstallDrever)。– USBDへはUSB_FUNCSに含まれるメンバ関数をコールする。– ドライバロード時に使⽤するレジストリを追加する。

[HKEY_LOCAL_MACHINE¥Drivers¥USB¥LoadClients¥1118_206¥Default¥Default¥SERIAL_CLASS]"Prefix"="COM“"Dll"="USBSer.DLL

• USBクラスドライバ実装にあたり– HCD、USBDの全体像をなるべく把握する。特に必要なキーワード(関数名)は覚えておく。(ヘルプには記載がほとんど無い)

– できるだけ既存のUSBクラスドライバをベースとする事が、開発効率の⾯では重要。

Page 23: WEC7向けUSBクラスドライバの実装download.microsoft.com/download/C/4/A/C4A73DB0... · – Android:AOAP(Android Open Accessory Protocol) – Nokia:Terminal Mode –

2011/11/16

23

© 2011 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.