2.5K Views
December 02, 22
スライド概要
次のイベントの講演資料です。
https://sciencepark.connpass.com/event/262727/
サイエンスパークの勉強会の資料を公開します。勉強会は2022/3現在、connpassで公開しています。 https://sciencepark.connpass.com
ミニWDDDS Windows/Mac対応 デバイス向けドライバ開発(初級編) その2 ~ Arduinoを使って学ぶドライバ開発~ プラットフォーム部 デバイスドライバ課 大島 光人 © SCIENCEPARK CORPORATION. SP2211-E42 1
ミニWDDDS 目次 1. はじめに 1.1 目的 2. ドライバ機能 2.1 対象デバイス 2.2ドライバ概要 2.3 ハードウェア仕様 2.4 機能構成 3. Windowsドライバ開発 3.1 開発環境とフレームワーク 3.2 開発テンプレート 3.3 インストール 4. Macドライバ開発 4.1 開発環境とフレームワーク 4.2 開発テンプレート 4.3 インストール 5. デモ 5.1 デモ 6. Windows/Macドライバ開発まとめ 6.1 WindowsドライバとMacドライバの違い © SCIENCEPARK CORPORATION. 2
ミニWDDDS 1. はじめに © SCIENCEPARK CORPORATION. 3
ミニWDDDS 1.1 目的 この講演では2022年4月に実施したArduinoを使用した WindowsおよびMacのドライバ開発の初級編の後編になります。 • デバイスドライバ開発者の育成を目的 • Arduinoを利用することで安価に自宅でもドライバを学習で きる環境 • マルチプラットフォーム対応のデバイス開発 • 前編では開発環境や対象デバイスの仕様について説明 • 今回はWindows/Macのドライバ開発方法の説明 • 初級編の後はArduinoをカスタマイズして高機能化を予定 前編の内容を確認したい方は以下のリンクの資料をご確認くだ さい。 https://www.docswell.com/s/study-group-spc/5XGNMZSP2204-E06-2 © SCIENCEPARK CORPORATION. 4
ミニWDDDS 2. ドライバ機能 © SCIENCEPARK CORPORATION. 5
ミニWDDDS 2.1 対象デバイス デバイスは「Arduino Uno Rev3」を使用します。 Arduino Uno Rev3はCDCクラスの標準ドライバに対応しますが、 ドライバ開発を目的とするため、vendor-specificとみなして開発 を行います。
ミニWDDDS 2.2 ドライバ概要 • • • • デバイス(Arduino)はフルカラーLEDとプッシュボタンを搭載 デバイスとPC間でUSBのバルク転送にてコマンドの送受信を行う PC→ArduinoでLEDの表示切替、Arduino→PCでボタン押下の取得 ドライバはボタンの押下次のコマンドを受信すると、LEDの表示切替のコマンドを デバイスに送信する PC ドライバ © SCIENCEPARK CORPORATION. 7
ミニWDDDS 2.3 ハードウェア仕様 - USBディスクリプタ -(1) Arduino Uno R3のハードウェア仕様をUSBViewを使って解析し ます。 【USBView】 ■デバイスディスクリプタ No 名称 値 概要 1 bDeviceClass 0x02 デバイス種別 2 idVendor 0x2341 ベンダーID 3 idProduct 0x0043 プロダクトID 4 bNumConfigurations 0x01 Configurationの数 ※ ベンダーID/プロダクトIDは互換デバイスに応じて異なる 8
ミニWDDDS 2.3 ハードウェア仕様 - USBディスクリプタ - (2) 【USBView】 ■コンフィギュレーションディスクリプタ No 1 名称 bNumInterfaces 値 0x02 概要 インターフェース数 9
ミニWDDDS 2.3 ハードウェア仕様 - USBディスクリプタ - (3) 【USBView】 ■インターフェースディスクリプタ(1) No 1 名称 値 bInterfaceNumbe 0x00 r 概要 インターフェースの番号 2 bNumEndpoints 0x01 エンドポイントの数 ■エンドポイントディスクリプタ(1) 3 No bInterfaceClass 名称 0x02 値 インターフェースの種別 概要 1 bEndpointAd dress 0x82 エンドポイントアドレス (Interrupt) 2 bmAttributes 0x03 通信方式 (Interrupt転送) 3 wMaxPacket Size 0x0008 パケット通信最大サイズ ※ インタラプト転送は本講座では使用しない 10
ミニWDDDS 2.3 ハードウェア仕様 - USBディスクリプタ - (4) 【USBView】 ■インターフェースディスクリプタ(2) N o 1 2 名称 bInterfaceNumber 値 0x01 概要 インターフェースの番 号 bNumEndpoints 0x02 エンドポイントの数 ■エンドポイントディスクリプタ(2) 3 No bInterfaceClass 名称 0x0A 値 インターフェースの種 別 概要 ■エンドポイントディスクリプタ_(3) No 名称 値 概要 1 bEndpointAddress 0x04 エンドポイントアドレ ス (Bulk OUT) 1 bEndpointAddress 0x83 エンドポイントアドレ ス (Bulk IN) 2 bmAttributes 0x02 通信方式(Bulk転送) 2 bmAttributes 0x02 通信方式(Bulk転送) 3 wMaxPacketSize 0x0040 パケット通信最大サイ ズ 3 wMaxPacketSize 0x0040 パケット通信最大サイ ズ 11
ミニWDDDS 2.3 ハードウェア仕様 - USB通信仕様 - ① 本講座のドライバでは、Arduino内のLEDの色、光量を設定する機能 を実装します。 そのため、初期化に使用するコントロール転送およびデータ送信をす るために必要となるバルク転送のみ使用します。 【コントロール転送】 No . リクエスト bmRequestType bRequest wValue wI ndex wLength データ 1 SetLineCoding 0x21 0x20 0 0 7 {0x80, 0x25, 0x00, 0x00, 0x00, 0x00, 0x80} 2 SetControlLineState 0x21 0x22 0 0 0 - © SCIENCEPARK CORPORATION. 12
ミニWDDDS 2.3 ハードウェア仕様 - USB通信仕様 - ② 【バルク転送】 • EndpointAddress 0x04のBulk Outをデバイスへのデータ送信に使用 • EndpointAddress 0x83のBulk INをデバイスからのデータ受信に使用 • バルク転送の開始は、デフォルトのUSBリクエストより実行する • バルクイン/バルクアウトともに送信データは先頭8バイトがコマンドヘッ ダ、後続にコマンドデータ コマンドヘッダ (8byte) バルク転送データ フォーマット Signature (4byte) Lengt h (1byt e) © SCIENCEPARK CORPORATION. CmdId (1byte) コマンドデータ (コマンドに準じたサイズ) Data Length (1byte) Reser ved (1byte ) TransferData (0~56byte) 13
ミニWDDDS 2.4 機能構成 - 機能ブロック ① OS(Framework) ド ラ イ バ ② ドライバエントリ処理 ③ ドライバ機能処理 No ① OSやフレームワーク ② ドライバのエントリ処理。ドライバ の初期化やPnP、IOをディスパッチ し、共通処理に中継する。 ③ OSに依存しない共通の制御ロジッ ク部。 今回のドライバでは、USBに送信す るコマンドの生成,解析処理等が該 当する。 ④ デバイス制御処理 ⑥ ④ デバイスを制御するための処理。 フレームワーク側で用意されている デバイス制御のAPI等を利用する ⑤ 制御対象のデバイス ⑤ デバイス OS内部 OS独自処理 共通処理 独自I/Fと共通I/Fを結ぶ処理 ブロック 14
ミニWDDDS 2.4 機能構成 - Windows WDF / WDM ド ラ イ バ ① ② W3DSDriver ③ W3DSManager W3DSDevice ⑤ ⑥ USB (Arduino) OS独自処理 共通処理 ② OS固有のドライバクラスとデバ イスクラスを繋ぐI/F ③ ドライバクラスと共通処理を繋ぐ I/F ④ 共通処理からデバイスクラスを繋 ぐI/F ⑥ (IDeviceCtrlクラスのI/Fを使用) ④ OS内部 N I/F o ① フレームワークとOS固有のドラ イバクラスを繋ぐI/F (IOUSBHostDeviceのI/Fを使用) 独自I/Fと共通I/Fを結ぶ処理 ⑤ デバイスクラスとフレームワーク を繋ぐI/F ⑥ USB Bulk通信IF 15
ミニWDDDS 2.4 機能構成 - Mac N I/F o ① フレームワークとOS固有のドラ イバクラスを繋ぐI/F (IOUSBHostDeviceのI/Fを使用) DriverKit ド ラ イ バ ① ② arduinoDriver ② OS固有のドライバクラスとデバ イスクラスを繋ぐI/F ③ W3DSManager ③ ドライバクラスと共通処理を繋ぐ I/F ④ 共通処理からデバイスクラスを繋 ぐI/F (IDeviceCtrlクラスのI/Fを使用) ④ W3DManager ⑤ ⑥ ⑤ デバイスクラスとフレームワーク を繋ぐI/F IOService ⑦ USB (Arduino) OS内部 OS独自処理 共通処理 独自I/Fを繋ぐ処理 Mac固有のサービス ⑥ フレームワークとmac固有のサー ビスを繋ぐI/F ⑦ USB Bulk通信IF 16
ミニWDDDS 2.5 必要機能 必要機能 機能ブロック ドライバの初期化 共通処理 デバイスの作成、追加 ドライバの終了 OS独自処理 ドライバエントリ処理 独自I/Fと 共通I/Fを結ぶ処理 インターフェースの設定 メモリの確保 コマンド生成処理 コマンド解析処理 ドライバ機能処理 コマンド用のメモリ確保、解放処理 PnP エンドポイントの設定 通信方式の設定(Control転送) デバイス制御処理 デバイスとの通信(Bulk転送) インストール © SCIENCEPARK CORPORATION. 17
ミニWDDDS 3. Windowsドライバ開発 © SCIENCEPARK CORPORATION. 1 8
ミニWDDDS 3. Windowsドライバ開発 3.1 開発環境とフレームワーク 3.2 開発テンプレート 3.3 インストール © SCIENCEPARK CORPORATION. 10
ミニWDDDS 3.1 開発環境とフレームワーク 項目 Windows OS • Windows 11 21H2 開発環境(IDE) • • • Visual Studio 2019 Windows 11 SDK Windows 11 WDK フレームワーク • UMDF V2 署名用アカウント ※ • UMDF(User-Mode Driver Framework) • その他 • Microsoft Developer アカウント登録 署名には別途EV証明書が 必要(有料) WDF(Windows Driver Foundation)が提供している フレームワークの一つ。 • UMDFドライバは、ユーザモードドライバを 作成するためのフレームワーク。 ユーザー空間にのみアクセス可能。 → セキュリティと安定性が向上する。 • 音声などリアルタイムな転送に用いられる アイソクロナス転送はサポートしていない。 今回実装する機能はKMDFドライバやWinUSBドライ バでも実現可能だが 特別な機能が必要ではないためユーザモードドライバ のUMDFで開発を行う。 © SCIENCEPARK CORPORATION. 11
ミニWDDDS 3.2 開発テンプレート スケルトン VisualStudio2019で用意されている テンプレートから User Mode Driver,USB(UMDF V2) を使用する。 © SCIENCEPARK CORPORATION. 21
ミニWDDDS 3.2 開発テンプレート User Mode Driver,USB(UMDF V2)に含まれる機能 必要機能 スケルトンで生成される関数 備考 ドライバの初期化 DriverEntry() ドライバロード時に初めに呼ばれる デバイスの作成、追加 EvtDeviceAdd() DriverEntry内でコールバックを登録 ドライバの終了 EvtDrivreContextCleanup() DriverEntry内でコールバックを登録 メモリやドライバオブジェクトを開放する インターフェースの設定 メモリの確保 - EvtDeviceAdd()内の子関数で APIを呼び出して設定 アプリケーションとのIFを公開する OS独自処理 独自I/Fと 共通I/Fを結ぶ処理 EvtDeviceAdd()内で APIを呼び出して設定 PnP EvtDevicePrepareHardware() EvtDeviceAdd()内の子関数で コールバックを登録 エンドポイントの設定 - HW仕様に合わせた機能の追加が必要 通信方式の設定 (Control転送) - デバイスとの通信 (Bulk転送) - インストール Infファイル 開発対象デバイスに合わせてカスタムが必要 © SCIENCEPARK CORPORATION. 22
ミニWDDDS 3.3 インストール ・デバイスマネージャーを起動 ・ユニバーサルシリアルデバイスとして認識されている Arduinoに対し、「ドライバの更新」を行う。 ・ビルド時に生成されたinfファイルを選択し、「インストー ル」を実行 →インストール完了すると"WDDDS 2022 KMDF Driverがデバイ スとして認識される。 © SCIENCEPARK CORPORATION. 14
ミニWDDDS 4. Macドライバ開発 © SCIENCEPARK CORPORATION. 15
ミニWDDDS 4. Macドライバ開発 4.1 開発環境とフレームワーク 4.2 開発テンプレート 4.3 インストール © SCIENCEPARK CORPORATION. 25
ミニWDDDS 4.1 開発環境とフレームワーク 項目 OS 開発環境(IDE) フレームワーク 署名用アカウント ※ Mac • macOS Monterey(12) • Xcode 13 • DriverKitフレーム ワーク • Apple Developer Program登録(有料) その他 フレーム ワーク カーネル拡 張(kext) OSバー ジョン macOS 10.x macOS 11 System Extension / DriverKit macOS 10.15以降 macOS 11 説明 10.14まではこの方式のみ 10.15以降は公証(Notarization)が必要 10.15.4以降は非推奨として警告が出る DriverKitに含まれる機能はロード不可 OSのセキュリティレベルを下げること で一部ロード可能 HIDDriverKit、NetworkingDriverKit、 SerialDriverKit、USBDriverKit、 USBSerialDriverKit AudioDriverKit、 BlockStorageDeviceDriverKit、 PCIDriverKit、SCSIControllerDriverKit 新しいフレームワークのDriverKitを使用した開発が必須に! © SCIENCEPARK CORPORATION. 26
ミニWDDDS 4.2 開発テンプレート ドライバの追加: • 新規ターゲットの追加 • SystemExtensionのDriverkitターゲット • アプリの設定でドライバが追加される スケルトンは最小限のものしか入っていないので ほぼ全部実装しないといけない アプリとの通信用クラスのファイルを追加 © SCIENCEPARK CORPORATION. 27
ミニWDDDS 4.3 開発テンプレート 必要機能 スケルトンで生成される関数 備考 Start() ドライバの動作開始時に呼ばれる 初期化処理を追加する場合は親クラスのinit関数を オーバーライドする デバイスの作成、追加 - Start関数内でデバイスオブジェクトの生成処理を追 加する ドライバの終了 - 親クラスのStop関数をオーバーライドして機能を追 加する。 インターフェースの設定 - アプリとの通信IFを持つクラスの追加が必要 IOUserClientクラスを継承した子クラスで管理する メモリの確保 - ドライバの初期化・開始 OS独自処理 独自I/Fと 共通I/Fを結ぶ処理 Init関数内で必要なメモリを確保する PnP - フレームワーク側で必要な処理が実施される デバイスとのマッチングはplistファイル内の記述で 行われる エンドポイントの設定 - HW仕様に合わせて機能の追加が必要 通信方式の設定 (Control転送) - デバイスとの通信 (Bulk転送) - インストール - ドライバに対応したAppの作成が必要 © SCIENCEPARK CORPORATION. 28
ミニWDDDS 4.4 インストール • Driverkitドライバはアプリを通してシステムに登録する必要がある • SystemExtensionフレームワークを使用する • インストールリクエストを送信する • SystemExtension登録用のEntitlementが必要 • プロビジョニングプロファイルも必要 • テストビルド(SIP無効+ローカル署名 © SCIENCEPARK CORPORATION. 29
ミニWDDDS 5. デモ © SCIENCEPARK CORPORATION. 30
ミニWDDDS 5. デモ © SCIENCEPARK CORPORATION. 31
ミニWDDDS 6. Windows/Macドライバ開発まとめ © SCIENCEPARK CORPORATION. 32
ミニWDDDS 6.1 WindowsドライバとMacドライバの違い Windows Mac スケルトンで最低限 親クラスを継承して、 必要な関数は自動生 必要な関数を実装す る必要がある。 USBドライバに必要な機能 成される。 ドライバに必要な機能 HW仕様に合わせて追加が 必要な機能 © SCIENCEPARK CORPORATION. WDFフレームワーク で提供される、 USBIFに合わせたAPI を利用して機能を追 加 DriverKitフレーム ワークで提供される、 USBIFに合わせたAPI を利用して機能を追 加 33
ミニWDDDS ご静聴ありがとうございました © SCIENCEPARK CORPORATION. 34
ミニWDDDS 付録 ■サイエンスパーク デバイスドライバ開発 https://sciencepark.co.jp/device_driver/ ■デバイスドライバ開発問合せ先 https://sciencepark.co.jp/contact/service/ ■デバイスドライバ講座 https://sciencepark.co.jp/device_driver/dvdr/ ■サイエンスパーク株式会社@ Qiita https://qiita.com/spc_qiita © SCIENCEPARK CORPORATION. 35