次の方法で共有


コンポーネント ファームウェア更新プログラム (CFU) INF ファイルの構成

CFU のカスタム INF ファイルを構成するには、このトピックのガイダンスに従って、ファームウェア イメージ ファイルとハードウェア デバイスの正しい値と設定を指定します。

Note

CFU は、Windows 10 バージョン 2004 (Windows 10 May 2020 Update) 以降で使用できます。

以下に 含まれる サンプル CFU INF ファイル は、デバイスのカスタム INF ファイルの開始点を提供します。 サンプル INF は、仮想 CFU Hid デバイスのファームウェア更新シナリオを有効にするために CFU 受信トレイ ドライバー (hidcfu.dll) を構成します。 サンプル仮想デバイス コードと仮想 HID デバイスのファームウェア更新をシミュレートするウォークスルーの詳細については CFU 仮想 HID デバイス ファームウェア更新シミュレーション トピックを参照してください。 以下のセクションでは、このトピックで説明する構成の概念を説明するために、含まれているサンプル INF ファイルを参照します。

実際の INF ファイルは、デバイスのファームウェアとハードウェア専用にカスタマイズして構成する必要があります。

開始する前に

次のリソースは、コンポーネント ファームウェア更新 (CFU) プロトコルについて学習するのに役立ちます。

概要

CFU モデルを使用してデバイスのファームウェア イメージを更新するには、次の要件を満たす必要があります。

  • デバイスのカスタム INF ファイルを指定します。 このファイルは、ファームウェアの更新プログラムをデバイスに送信する CFU 受信トレイ ドライバーに情報を提供します。 ファームウェアの更新シナリオをサポートするために、このトピックで以下に示すサンプル CFU INF ファイルをカスタマイズすることをお勧めします。

  • デバイスは、CFU ドライバーからのアップデートを受け入れることができるように CFU プロトコル に準拠したファームウェア イメージを同梱して出荷する必要があります。

  • デバイスは、(CFU 受信トレイ ドライバーを実行している) オペレーティング システムに HID デバイスとして自分自身を公開し、HID トップレベル コレクション (TLC) を公開する必要があります。 CFU 受信トレイ ドライバーは TLC に読み込み、ファームウェアの更新プログラムをデバイスに送信します。

これにより、Windows Update を介して市場内のデバイスにサービスを提供できます。 コンポーネントのファームウェアを更新するには、Windows Update を使用してファームウェア更新イメージを展開します。 CFU 受信トレイ ドライバーは、コンポーネントの存在を検出すると、ホストで必要なアクションを実行し、デバイス上のプライマリ コンポーネントにファームウェア イメージを送信します。

CFU firmware update.

カスタム CFU INF ファイルを構成する

  1. カスタム INF ファイルに、この例で示されているように、デバイスのハードウェア ID を挿入します。

    [Standard.NTamd64]
    %CfuVirtualHidDeviceFwUpdate.DeviceDesc%=CfuVirtualHidDeviceFwUpdate, HID\VID_045E&UP:FA00_U:00F5 ; HardwareID for VirtualHidDevice MCU
    

    INF ハードウェア ID の設定

    CFU 受信トレイ ドライバーがファームウェアと通信するためには、INF で指定されたハードウェア ID がファームウェアの Hid 記述子構成で指定されているものと一致する必要があります。

    次に示すように、 CfuVirtualHidDeviceFwUpdate.inf 値は、仮想ファームウェア シミュレーション ドライバーの Hid 記述子で指定された値と一致します。

    [Standard.NTamd64]
    %CfuVirtualHidDeviceFwUpdate.DeviceDesc%=CfuVirtualHidDeviceFwUpdate, HID\VID_045E&UP:FA00_U:00F5
    

    詳細については DmfInterface.cg_CfuVirtualHid_HidReportDescriptor (Hid Report Descriptor) にある次のコードを参照してください。

    0x06, CFU_DEVICE_USAGE_PAGE,        // USAGE_PAGE(0xFA00)
    0x09, CFU_DEVICE_USAGE,             // USAGE(0xF5)
    
  2. カスタム INF ファイルで、ここに示されている次のエントリ (SourceDisksFiles および CopyFiles セクションを含む) をファームウェア アップデートのファイルと一致するように更新します。

    たとえば、仮想 CFU Hid デバイス サンプルでは、2 つのコンポーネント (MCU とオーディオ) がサポートされています。 以下のサンプル セクションでは、これらのコンポーネントのオファー ファイルとペイロード ファイルを指定します。

    ; Specify the location of the firmware offer
    ; and payload file in the registry.
    ; The files are kept in driver store.
    ; When deployed, %13% would be expanded to
    ; the actual path in driver store.
    ;
    ; You can change subkey name under CFU
    ; (for example, "CfuVirtualHidDevice_MCU"),
    ; and specify your own offer
    ; (for example, "CfuVirtualHidDevice_MCU.offer.bin")
    ; and payload (for example, "CfuVirtualHidDevice_MCU.payload.bin")
    ; file name.
    ;
    HKR,A410A898-8132-4246-AC1A-30F1E98BB0A4\CfuVirtualHidDevice_MCU,Offer,   0x00000000, %13%\CfuVirtualHidDevice_MCU.offer.bin
    HKR,A410A898-8132-4246-AC1A-30F1E98BB0A4\CfuVirtualHidDevice_MCU,Payload, 0x00000000, %13%\CfuVirtualHidDevice_MCU.payload.bin
    HKR,A410A898-8132-4246-AC1A-30F1E98BB0A4\CfuVirtualHidDevice_Audio,Offer,   0x00000000, %13%\CfuVirtualHidDevice_Audio.offer.bin
    HKR,A410A898-8132-4246-AC1A-30F1E98BB0A4\CfuVirtualHidDevice_Audio,Payload, 0x00000000, %13%\CfuVirtualHidDevice_Audio.payload.bin
    
    [SourceDisksFiles]
    CfuVirtualHidDevice_MCU.offer.bin=1
    CfuVirtualHidDevice_MCU.payload.bin=1
    CfuVirtualHidDevice_Audio.offer.bin=1
    CfuVirtualHidDevice_Audio.payload.bin=1
    
    [CfuVirtualHidDeviceFwUpdate.CopyFiles]
    CfuVirtualHidDevice_MCU.offer.bin
    CfuVirtualHidDevice_MCU.payload.bin
    CfuVirtualHidDevice_Audio.offer.bin
    CfuVirtualHidDevice_Audio.payload.bin
    

    完全な CFU INF サンプル ファイル については、以下のサンプル CFU INF ファイルを参照してください。

    Note

    パッケージがインストールされると、レジストリ値を作成する前に %13% 、OS によってファイルへの完全なパスに置き換えられます。 したがって、ドライバーはレジストリを列挙し、すべてのファームウェア イメージを識別し、ファイルを提供できます。

    Note

    上記の例では、CFU 受信トレイ ドライバーが実行時にこれらの値を検索するため、"A410A898-8132-4246-AC1A-30F1E98BB0A4"、"Offer"、"Payload" は変更しないでください。

  3. カスタム INF ファイルで、次の表とサンプル INF セクションで説明されているレジストリ値の機能設定を使用して、デバイスの機能を指定します。

    CFU 受信トレイ ドライバーは、特定のシナリオに合わせて最適化するためにドライバーの動作をカスタマイズする方法を提供します。 これらの設定は、以下の CFU レジストリ値の表で説明されているレジストリ設定によって制御されます。

    たとえば、CFU 受信トレイ ドライバーには、ファームウェアの実装に従って、値の機能の使用状況の詳細に関する情報が必要です。 詳細とこれを行う方法の例については、以下の INF 値機能の設定 セクションを参照してください。

    ファームウェア実装のニーズに応じて、これらのレジストリ値をそれぞれ構成できます。

    CFUレジストリの値

    レジストリ値 説明
    配置 プロトコル属性: この構成に必要な bin レコードのアラインメントは何ですか?

    プロトコルのペイロード送信フェーズ中に、ドライバーはペイロードで多くの Hid バッファーを入力し、ファームウェアに 1 つずつ送信します。

    このオプションは、ペイロードをパッキングするときの配置要件を制御します。

    既定では、8 バイトのアラインメントが使用されます。 アラインメントが必要ない場合は、これを 1 として構成します。

    UseHidSetOutputReport 0 - ドライバーは、出力レポートの送信中に書き込み要求を使用します。

    1 - ドライバーは、出力レポートを送信するためにIOCTL_HID_Standard Edition T_OUTPUT_REPORTを使用します。

    既定値は 0 です。 基になるトランスポートが USB でない場合 (たとえば、HID Over BTH) の場合は、これを 1 に設定します。

    OfferInputValueCapabilityUsageRangeMinimum オファー入力レポート処理の値機能使用量の最小値。
    OfferOutputValueCapabilityUsageRangeMinimum オファー出力レポート処理の価値機能使用量の最小値。
    PayloadInputValueCapabilityUsageRangeMinimum 値 ペイロード入力レポート処理の機能使用量の最小値。
    PayloadOutputValueCapabilityUsageRangeMinimum 値 ペイロード出力レポート処理の機能使用量の最小値。
    VersionsFeatureValueCapabilityUsageRangeMinimum バージョン機能レポート処理の値機能使用量の最小値。

    INF 値の機能の設定

    CFU 受信トレイ ドライバーがファームウェアと通信するためには、INF で指定された値機能の使用法が、ファームウェアの Hid 記述子構成の値と一致する必要があります。

    この例では、INF 値は、仮想ファームウェア シミュレーション ドライバーの Hid 記述子で指定された値と一致します。

    [CfuVirtualHidDeviceFwUpdate_HWAddReg]
    ...
    ...
    HKR,,OfferInputValueCapabilityUsageRangeMinimum,0x00010001,0x1A
    HKR,,OfferOutputValueCapabilityUsageRangeMinimum,0x00010001, 0x1E
    HKR,,PayloadInputValueCapabilityUsageRangeMinimum,0x00010001,0x26
    HKR,,PayloadOutputValueCapabilityUsageRangeMinimum,0x00010001,0x31
    HKR,,VersionsFeatureValueCapabilityUsageRangeMinimum,0x00010001, 0x42
    

    詳細については DmfInterface.cg_CfuVirtualHid_HidReportDescriptor (Hid Report Descriptor) にある次のコードを参照してください。

    0x85, REPORT_ID_PAYLOAD_INPUT,      // REPORT_ID(34)
    0x75, INPUT_REPORT_LENGTH,          // REPORT SIZE(32)
    0x95, 0x04,                         // REPORT COUNT(4)
    0x19, PAYLOAD_INPUT_USAGE_MIN,      // USAGE MIN (0x26)
    0x29, PAYLOAD_INPUT_USAGE_MAX,      // USAGE MAX (0x29)
    0x81, 0x02,                         // INPUT(0x02)
    
    0x85, REPORT_ID_OFFER_INPUT,        // REPORT_ID(37)
    0x75, INPUT_REPORT_LENGTH,          // REPORT SIZE(32)
    0x95, 0x04,                         // REPORT COUNT(4)
    0x19, OFFER_INPUT_USAGE_MIN,        // USAGE MIN (0x1A)
    0x29, OFFER_INPUT_USAGE_MAX,        // USAGE MAX (0x1D)
    0x81, 0x02,                         // INPUT(0x02)
    
    0x85, REPORT_ID_PAYLOAD_OUTPUT,     // REPORT_ID(32)
    0x75, 0x08,                         // REPORT SIZE(8)
    0x95, OUTPUT_REPORT_LENGTH,         // REPORT COUNT(60)
    0x09, PAYLOAD_OUTPUT_USAGE,         // USAGE(0x31)
    0x92, 0x02, 0x01,                   // OUTPUT(0x02)
    
    0x85, REPORT_ID_OFFER_OUTPUT,       // REPORT_ID(37)
    0x75, INPUT_REPORT_LENGTH,          // REPORT SIZE(32)
    0x95, 0x04,                         // REPORT COUNT(4)
    0x19, OFFER_OUTPUT_USAGE_MIN,       // USAGE MIN (0x1E)
    0x29, OFFER_OUTPUT_USAGE_MAX,       // USAGE MAX (0x21)
    0x91, 0x02,                         // OUTPUT(0x02)
    
    0x85, REPORT_ID_VERSIONS_FEATURE,   // REPORT_ID(32)
    0x75, 0x08,                         // REPORT SIZE(8)
    0x95, FEATURE_REPORT_LENGTH,        // REPORT COUNT(60)
    0x09, VERSIONS_FEATURE_USAGE,       // USAGE(0x42)
    0xB2, 0x02, 0x01,                   // FEATURE(0x02)
    

Windows Update を使用してファームウェア パッケージを展開する

次に、Windows Update を通じてパッケージを展開します。

展開の詳細については Windows 10 Driver Publishing Workflow (DOCX ダウンロード) を参照してください。

ファームウェア更新イメージ ファイル形式

ファームウェア更新イメージには、オファー ファイルとペイロード ファイルの 2 つの部分があります。 このオファーには、ペイロードに関する必要な情報が含まれています。これにより、更新プログラムを受け取るデバイスのプライマリ コンポーネントがペイロードを受け入れられるかどうかを判断できます。 ペイロードは、プライマリ コンポーネントが使用できるアドレスとバイトの範囲です。

オファーの形式

オファー ファイルは 16 バイトのバイナリ データであり、その構造は CFU プロトコル仕様のセクション 5.5.1 で指定された形式と一致する必要があります。

ペイロード 形式

ペイロード ファイルは、連続して格納されるレコードのコレクションであるバイナリ ファイルです。 各レコードの形式は次のとおりです。

オフセット サイズ Value 説明
バイト 0 DWORD ファームウェアアドレス リトル エンディアン (LSB ファースト) データを書き込むアドレス。 アドレスは 0 から始まります。 ファームウェアはこれをオフセットとして使用して、イメージをメモリに配置するときに必要に応じてアドレスを決定できます。
バイト 4 Byte Length ペイロード データの長さ。
バイト5-N バイト データ​​ ペイロード データのバイト配列。

ファームウェア更新の状態

プロトコル トランザクション中、CFU 受信トレイ ドライバーは、状態を示すレジストリ エントリを書き込みます。 この表では、プロトコルのさまざまな段階でドライバーが触れる値の名前、形式、および意味について説明します。

  • テーブル内の _ID_ は、オファー ファイルから取得されるコンポーネント ID を表します。 仕様で説明されているように、コンポーネント ID は各コンポーネントを一意に識別します。

  • 値 DWORD の詳細については、仕様を参照してください。

段階 場所 Reg 値の名前 値 (DWORD)
開始;プレオファー。 {デバイス ハードウェア キー}\ComponentFirmwareUpdate "コンポーネントIDCurrentFwVersion" デバイスからのバージョン
{デバイス ハードウェア キー}\ComponentFirmwareUpdate "コンポーネントIDFirmwareUpdateStatus" FIRMWARE_UPDATE_STATUS_NOT_STARTED
提供;オファーを送信しようとしている。 {デバイス ハードウェア キー}\ComponentFirmwareUpdate "コンポーネントIDOfferFwVersion" デバイスに送信される (または送信される予定の) バージョン。
オファーの応答 (拒否) {デバイス ハードウェア キー}\ComponentFirmwareUpdate "コンポーネントIDFirmwareUpdateStatusRejectReason" デバイスから返される拒否の理由。
オファーの応答 (デバイスがビジー) {デバイス ハードウェア キー}\ComponentFirmwareUpdate "コンポーネントIDFirmwareUpdateStatus" FIRMWARE_UPDATE_STATUS_BUSY_PROCESSING_UPDATE
オファーの応答 (受け入れ済み);ペイロードを送信しようとしている。 {デバイス ハードウェア キー}\ComponentFirmwareUpdate "コンポーネントIDFirmwareUpdateStatus" FIRMWARE_UPDATE_STATUS_DOWNLOADING_UPDATE
ペイロードは受け入れられます。 {デバイス ハードウェア キー}\ComponentFirmwareUpdate "コンポーネントIDFirmwareUpdateStatus" FIRMWARE_UPDATE_STATUS_PENDING_RE Standard Edition T
任意の段階でエラーが発生しました。 {デバイス ハードウェア キー}\ComponentFirmwareUpdate "コンポーネントIDFirmwareUpdateStatus" FIRMWARE_UPDATE_STATUS_ERROR

サンプル CFU INF ファイル

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;  Copyright (c) Microsoft Corporation.  All rights reserved.
;
;      THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
;      KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
;      IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
;      PURPOSE.
;
; File:
;
:      CfuVirtualHidDeviceFwUpdate.inx
;
; Description:
;
;      Sample INF file for Cfu virtual Hid device firmware update.
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

[Version]
Signature="$Windows NT$"
Class=Firmware
ClassGuid={f2e7dd72-6468-4e36-b6f1-6488f42c1b52}
Provider=%ManufacturerName%
CatalogFile=CfuVirtualHidDeviceFwUpdate.cat
DriverVer = 12/16/2019,11.42.16.703
PnPLockDown=1

[SourceDisksNames]
1= %DiskName%

[DestinationDirs]
CfuVirtualHidDeviceFwUpdate.CopyFiles=13

[Manufacturer]
%ManufacturerName%=Standard,NTamd64

[Standard.NTamd64]
%CfuVirtualHidDeviceFwUpdate.DeviceDesc%=CfuVirtualHidDeviceFwUpdate, HID\VID_045E&UP:FA00_U:00F5 ; HardwareID for VirtualHidDevice MCU

[CfuVirtualHidDeviceFwUpdate.NT]
Include            = HidCfu.inf
Needs              = HidCfu.NT
CopyFiles          = CfuVirtualHidDeviceFwUpdate.CopyFiles

[CfuVirtualHidDeviceFwUpdate.NT.Wdf]
Include            = HidCfu.inf
Needs              = HidCfu.NT.Wdf

[CfuVirtualHidDeviceFwUpdate.NT.HW]
AddReg = CfuVirtualHidDeviceFwUpdate_HWAddReg

[CfuVirtualHidDeviceFwUpdate_HWAddReg]
HKR,,FriendlyName,,%FwUpdateFriendlyName%
HKR,,Alignment,0x00010001, 1                       ; (No Alignment)
HKR,,OfferInputValueCapabilityUsageRangeMinimum,0x00010001,0x1A
HKR,,OfferOutputValueCapabilityUsageRangeMinimum,0x00010001, 0x1E
HKR,,PayloadInputValueCapabilityUsageRangeMinimum,0x00010001,0x26
HKR,,PayloadOutputValueCapabilityUsageRangeMinimum,0x00010001,0x31
HKR,,VersionsFeatureValueCapabilityUsageRangeMinimum,0x00010001, 0x42

; Specify the location of the firmware offer and payload file in the registry.
; The files are kept in the driver store.
; When deployed, %13% would be expanded to the actual path
; in driver store.
;
; You can change subkey name under CFU (e.g. "CfuVirtualHidDevice_MCU"), and specify your own offer
; (e.g. "CfuVirtualHidDevice_MCU.offer.bin") and payload (e.g "CfuVirtualHidDevice_MCU.payload.bin") file name.
;
HKR,A410A898-8132-4246-AC1A-30F1E98BB0A4\CfuVirtualHidDevice_MCU,Offer,   0x00000000, %13%\CfuVirtualHidDevice_MCU.offer.bin
HKR,A410A898-8132-4246-AC1A-30F1E98BB0A4\CfuVirtualHidDevice_MCU,Payload, 0x00000000, %13%\CfuVirtualHidDevice_MCU.payload.bin
HKR,A410A898-8132-4246-AC1A-30F1E98BB0A4\CfuVirtualHidDevice_Audio,Offer,   0x00000000, %13%\CfuVirtualHidDevice_Audio.offer.bin
HKR,A410A898-8132-4246-AC1A-30F1E98BB0A4\CfuVirtualHidDevice_Audio,Payload, 0x00000000, %13%\CfuVirtualHidDevice_Audio.payload.bin

[SourceDisksFiles]
CfuVirtualHidDevice_MCU.offer.bin=1
CfuVirtualHidDevice_MCU.payload.bin=1
CfuVirtualHidDevice_Audio.offer.bin=1
CfuVirtualHidDevice_Audio.payload.bin=1

[CfuVirtualHidDeviceFwUpdate.CopyFiles]
CfuVirtualHidDevice_MCU.offer.bin
CfuVirtualHidDevice_MCU.payload.bin
CfuVirtualHidDevice_Audio.offer.bin
CfuVirtualHidDevice_Audio.payload.bin

[CfuVirtualHidDeviceFwUpdate.NT.Services]
Include            = HidCfu.inf
Needs              = HidCfu.NT.Services

; =================== Generic ==================================

[Strings]
ManufacturerName="Surface"
CfuVirtualHidDeviceFwUpdate.DeviceDesc = "CfuVirtualHidDevice Firmware Update"
DiskName = "CfuVirtualHidDevice Firmware Update Installation Disk"
FwUpdateFriendlyName= "CfuVirtualHidDevice Firmware Update"

トラブルシューティング

  1. Windows ソフトウェア トレース プリプロセッサ (WPP) ログを調べて、コンポーネントごとのドライバー側の相互作用を確認します。

  2. イベント ログで重大なエラーがないか確認してください。

  3. ドライバーによって提供されるファームウェアの更新状態で説明されているブックキーピング レジストリ エントリを確認します。

よく寄せられる質問

更新プログラムが必要なコンポーネント A がある場合、CFU ドライバーにコンポーネント A を認識させる方法を教えてください。

コンポーネント A によって作成された TLC のハードウェア ID を使用して、CFU 受信トレイ ドライバー INF を構成する必要があります。

コンポーネント A とサブコンポーネント B の 2 つのコンポーネントがあります。CFU ドライバーにコンポーネント B を認識させる方法

その必要はありません。 ドライバーは、コンポーネント階層について知る必要はありません。 プライマリ コンポーネントと対話します。

コンポーネント A に送信する必要があるファームウェア ファイル (オファー、ペイロード) ファイルをドライバーに認識させる方法

ファームウェア ファイル情報は、レジストリ値として INF で設定されます。

メインコンポーネントAとそのサブコンポーネントに対して、多くのファームウェアファイル、複数のオファー、ペイロードがあります。 どのコンポーネントに対してどのファームウェアファイルが意図されているかをドライバーに認識させる方法はありますか?

ファームウェア ファイル情報は、レジストリ値として INF で設定されます。

ファームウェアの更新にドライバーを使用しています。 更新操作方法成功したことを知っていますか?

ファームウェアの更新状態は、ブックキーピングの一部としてレジストリのドライバーによって更新されます。

その他のリソース

Windows Driver Foundation (WDF) を使用した Windows ドライバーの開発について説明します。