元件韌體更新 (CFU) INF 檔案組態
若要設定 CFU 的自定義 INF 檔案,請遵循本主題中的指引,為您的韌體映像檔和硬體裝置提供正確的值和設定。
注意
Windows 10 2004 版 (Windows 10 2020 年 5 月更新) 和更新版本提供 CFU。
下列 範例 CFU INF 檔案 提供您裝置自定義 INF 檔案的起點。 範例 INF 會設定 CFU 收件匣驅動程式 (hidcfu.dll) ,以啟用虛擬 CFU Hid 裝置的韌體更新案例。 如需範例虛擬設備程式碼的詳細數據,以及模擬虛擬 HID 裝置上韌體更新韌體的詳細數據,請參閱 CFU 虛擬 HID 裝置韌體更新 主題。 下列各節會參考內含的範例 INF 檔案,以說明本主題中討論的組態概念。
您的實際 INF 檔案必須特別針對裝置韌體和硬體進行自定義和設定。
開始之前
下列資源將協助您了解元件韌體更新 (CFU) 通訊協定。
元件韌體更新 (CFU) 通訊協定規格描述一般 HID 通訊協定,以更新電腦上或配件上存在的元件韌體。 規格可讓元件接受韌體,而不會在下載期間中斷裝置作業。
CFU 韌體更新範例包含實作 CFU 通訊協定的範例韌體原始程式碼。
CFU 獨立工具可用來在開發期間測試裝置上的韌體更新,以及在將它上傳至 Windows Update 之前。
概觀
若要使用 CFU 模型更新裝置的韌體映像,您應該預期符合下列需求:
為您的裝置提供自定義 INF 檔案。 此檔案會將資訊提供給 CFU 收件匣驅動程式,以將韌體更新傳送至裝置。 建議您自定義本主題下方提供的範例 CFU INF 檔案,以支援韌體更新案例。
您的裝置必須隨附符合 CFU 通訊協定 的韌體映像,才能接受來自 CFU 驅動程式的更新。
您的裝置必須將本身公開為 HID 裝置給操作系統, (執行 CFU 收件匣驅動程式) ,並公開 HID Top-Level Collection (TLC) 。 CFU 收件匣驅動程式會在 TLC 上載入,並將韌體更新傳送至裝置。
這可讓您透過 Windows Update 服務市場內裝置。 若要更新元件的韌體,您可以透過 Windows Update 部署韌體更新映射。 當 CFU 收件匣驅動程式偵測到元件是否存在時,它會在主機上執行必要的動作,並將韌體映射傳輸到裝置上的主要元件。
設定自定義 CFU INF 檔案
在您的自定義 INF 檔案中,插入您裝置的硬體識別碼,如本範例所示。
[Standard.NTamd64] %CfuVirtualHidDeviceFwUpdate.DeviceDesc%=CfuVirtualHidDeviceFwUpdate, HID\VID_045E&UP:FA00_U:00F5 ; HardwareID for VirtualHidDevice MCU
INF 硬體識別碼設定
為了讓 CFU 收件匣驅動程式與韌體通訊,INF 中指定的硬體識別碼應該與韌體中 Hid 描述元組態中指定的專案相符。
如下所示, CfuVirtualHidDeviceFwUpdate.inf 值符合虛擬韌體模擬驅動程式的 Hid 描述元中指定的值。
[Standard.NTamd64] %CfuVirtualHidDeviceFwUpdate.DeviceDesc%=CfuVirtualHidDeviceFwUpdate, HID\VID_045E&UP:FA00_U:00F5
如需詳細資訊,請參閱 dmfInterface.c 中g_CfuVirtualHid_HidReportDescriptor (Hid Report 描述元) 中的下列程式代碼。
0x06, CFU_DEVICE_USAGE_PAGE, // USAGE_PAGE(0xFA00) 0x09, CFU_DEVICE_USAGE, // USAGE(0xF5)
在您的自定義 INF 檔案中,更新此處顯示的下列專案, (包括 SourceDisksFiles 和 CopyFiles 區段) ,以符合韌體更新中的檔案。
例如,虛擬 CFU Hid 裝置範例支援兩個元件, (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 檔案。
注意
安裝套件時,OS 會將 取代
%13%
為檔案的完整路徑,再建立登錄值。 因此,驅動程式能夠列舉登錄,並識別所有韌體映像和供應項目檔案。注意
在上述範例中,「A410A898-8132-4246-AC1A-30F1E98BB0A4」、「供應專案」、「承載」不應該變更,因為 CFU 收件匣驅動程式會在運行時間尋找這些值。
在您的自定義 INF 檔案中,使用下表和範例 INF 一節中所述的登錄值功能設定來指定裝置的功能。
CFU 收件匣驅動程式可讓您自定義驅動程序行為,以針對特定案例進行優化。 這些設定是透過登錄設定來控制,如下的 CFU 登錄值表所述。
例如,CFU 收件匣驅動程式會根據韌體實作,要求值功能使用詳細數據的相關信息。 如需詳細資訊和如何執行這項操作的範例,請參閱下方 的 INF 值功能設定 一節。
您可以為每個韌體實作需求設定這些登錄值。
CFU 登錄值
登錄值 描述 對齊 通訊協定屬性:此設定所需的 bin 記錄對齊為何? 在通訊協議的承載傳送階段期間,驅動程式會填入許多 Hid 緩衝區,並逐一傳送至韌體。
此選項可控制封裝承載時的對齊需求。
預設會使用 8 個字節對齊方式。 如果不需要對齊方式,請將此設定為 1。
UseHidSetOutputReport 0 - 驅動程式會在傳送任何輸出報表時使用寫入要求。 1 - 驅動程式將使用IOCTL_HID_SET_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.c 中g_CfuVirtualHid_HidReportDescriptor (Hid Report 描述元) 中的下列程式代碼。
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 驅動程式發佈工作流程 (DOCX 下載) 。
韌體更新映像檔案格式
韌體更新映像有兩個部分:供應專案檔案和承載檔案。 供應專案包含有關承載的必要資訊,以允許接收更新的裝置中的主要元件,以決定承載是否可接受。 承載是主要元件可取用的位址和位元組範圍。
供應專案格式
供應專案檔案是16位元組的二進位數據,其結構必須符合CFU通訊協定規格第5.5.1節中指定的格式。
承載格式
承載檔案是二進位檔案,這是連續儲存的記錄集合。 每個記錄的格式如下。
Offset | 大小 | 值 | Description |
---|---|---|---|
位元組 0 | DWORD | 韌體位址 | 小結束 (LSB First) Address 來寫入數據。 位址是以 0 為基礎。 韌體可以使用此作為位移,以判斷將影像放入記憶體時所需的位址。 |
位元組 4 | Byte | 長度 | 承載數據的長度。 |
位元組 5-N | 位元組 | 資料 | 承載數據的位元組陣列。 |
韌體更新狀態
在通訊協定交易期間,CFU 收件匣驅動程式會寫入登錄專案以指出狀態。 下表描述驅動程式在通訊協定的各個階段所觸及之值的名稱、值格式和意義。
數據表中的 _ID_ 代表從供應項目檔案擷取的元件標識碼。 如規格中所述,元件標識碼會唯一識別每個元件。
如需值 DWORD 的相關信息,請參閱規格。
階段 | 位置 | Reg 值名稱 | 值 (DWORD) |
---|---|---|---|
開始;供應專案前。 | {裝置硬件密鑰}\ComponentFirmwareUpdate | “元件標識符CurrentFwVersion” | 從裝置版本 |
{裝置硬件密鑰}\ComponentFirmwareUpdate | “組件標識符FirmwareUpdateStatus” | FIRMWARE_UPDATE_STATUS_NOT_STARTED | |
提供;即將傳送供應專案。 | {裝置硬件密鑰}\ComponentFirmwareUpdate | “元件標識符OfferFwVersion” | 傳送 (或即將傳送) 到裝置的版本。 |
供應項目回應 (拒絕) | {裝置硬件密鑰}\ComponentFirmwareUpdate | “組件標識符FirmwareUpdateStatusRejectReason” | 裝置傳回拒絕的原因。 |
供應項目回應 (裝置忙碌) | {裝置硬件密鑰}\ComponentFirmwareUpdate | “組件標識符FirmwareUpdateStatus” | FIRMWARE_UPDATE_STATUS_BUSY_PROCESSING_UPDATE |
已接受的供應項目回應 () ;即將傳送 Payload。 | {裝置硬件密鑰}\ComponentFirmwareUpdate | “組件標識符FirmwareUpdateStatus” | FIRMWARE_UPDATE_STATUS_DOWNLOADING_UPDATE |
已接受承載。 | {裝置硬件密鑰}\ComponentFirmwareUpdate | “組件標識符FirmwareUpdateStatus” | FIRMWARE_UPDATE_STATUS_PENDING_RESET |
任何階段發生錯誤。 | {裝置硬件密鑰}\ComponentFirmwareUpdate | “組件標識符FirmwareUpdateStatus” | 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"
疑難排解
檢查 Windows 軟體追蹤預處理器 (WPP) 記錄,以查看每個元件的驅動程式端互動。
檢查事件記錄檔中是否有任何重大錯誤。
檢查驅動程式所提供韌體更新狀態中所述的簿記登錄專案。
常見問題集
我有需要更新的元件 A,如何讓 CFU 驅動程式知道元件 A?
您必須使用元件 A 所建立 TLC 的硬體識別碼,設定 CFU 收件匣驅動程式 INF。
我有兩個元件:元件 A 和子元件 B。如何讓 CFU 驅動程式知道元件 B?
您不需要。 驅動程式不需要知道元件階層。 它會與主要元件互動。
如何讓驅動程式知道我的韌體檔案 (供應項目、承載) 檔案需要傳送至元件 A?
韌體檔案資訊會在 INF 中設定為登錄值。
我有許多韌體檔案、多個供應項目、承載,適用於主要元件 A 及其子元件。 如何讓驅動程式知道哪個韌體檔案適用於哪個元件?
韌體檔案資訊會在 INF 中設定為登錄值。
我正在使用驅動程式進行韌體更新。 如何? 知道更新成功嗎?
韌體更新狀態是由登錄中的驅動程式更新為簿記的一部分。
其他資源
瞭解如何使用 Windows Driver Foundation (WDF) 開發 Windows 驅動程式:
使用 Windows Driver Foundation 開發驅動程式,由一位作者:一位作者:Orwick 和 Guy Smith