Condividi tramite


Configurazione del file INF (Component Firmware Update) (CFU)

Per configurare un file INF personalizzato per CFU, seguire le indicazioni riportate in questo argomento per fornire i valori e le impostazioni corretti per i file di immagine del firmware e il dispositivo hardware.

Annotazioni

CFU è disponibile in Windows 10 versione 2004 (Windows 10 maggio 2020 Update) e versioni successive.

Il file INF CFU di esempio incluso di seguito fornisce un punto di partenza per il file INF personalizzato del dispositivo. L'esempio INF configura il driver posta in arrivo CFU (hidcfu.dll) per abilitare lo scenario di aggiornamento del firmware per un dispositivo CFU Hid virtuale. Per informazioni dettagliate sul codice del dispositivo virtuale di esempio e sulla procedura dettagliata che simula l'aggiornamento del firmware in un dispositivo HID virtuale, vedere l'argomento CFU Virtual HID Update Simulation . Le sezioni seguenti fanno riferimento al file INF di esempio incluso per illustrare i concetti di configurazione illustrati in questo argomento.

Il file INF effettivo deve essere personalizzato e configurato in modo specifico per il firmware e l'hardware del dispositivo.

Prima di iniziare

Le risorse seguenti consentono di ottenere informazioni sul protocollo CFU (Component Firmware Update).

Informazioni generali

Per aggiornare l'immagine del firmware per il dispositivo usando il modello CFU, è necessario prevedere di soddisfare i requisiti seguenti:

  • Specificare un file INF personalizzato per il dispositivo. Questo file fornisce informazioni al driver CFU della casella di posta che invia l'aggiornamento del firmware al dispositivo. È consigliabile personalizzare il file CFU INF di esempio fornito di seguito in questo argomento per supportare gli scenari di aggiornamento del firmware.

  • Il dispositivo deve essere fornito con un'immagine del firmware conforme al protocollo CFU in modo che possa accettare un aggiornamento dal driver CFU.

  • Il dispositivo deve esporsi come dispositivo HID al sistema operativo (che esegue il driver della posta in arrivo CFU) ed esporre una raccolta TLC (HID Top-Level Collection). Il driver della posta in arrivo CFU viene caricato nel TLC e invia l'aggiornamento del firmware al dispositivo.

In questo modo è possibile gestire i dispositivi sul mercato tramite Windows Update. Per aggiornare il firmware per un componente, distribuire l'immagine di aggiornamento del firmware tramite Windows Update. Quando il driver della posta in arrivo CFU rileva la presenza di un componente, esegue le azioni necessarie nell'host e trasmette l'immagine del firmware al componente primario nel dispositivo.

Aggiornamento del firmware CFU.

Configurare il file INF CFU personalizzato

  1. Nel file INF personalizzato inserire gli ID hardware dei dispositivi, come indicato in questo esempio.

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

    Impostazioni dell'ID hardware INF

    Affinché il driver della posta in arrivo CFU comunichi con il firmware, l'ID hardware specificato in INF deve corrispondere a quello specificato nella configurazione del descrittore Hid nel firmware.

    Come illustrato di seguito, i valori CfuVirtualHidDeviceFwUpdate.inf corrispondono ai valori specificati nel descrittore Hid del driver di simulazione del firmware virtuale.

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

    Per altre informazioni, vedere il codice seguente in g_CfuVirtualHid_HidReportDescriptor (Descrittore di report HID) in DmfInterface.c.

    0x06, CFU_DEVICE_USAGE_PAGE,        // USAGE_PAGE(0xFA00)
    0x09, CFU_DEVICE_USAGE,             // USAGE(0xF5)
    
  2. Nel file INF personalizzato aggiornare le voci seguenti illustrate qui (incluse le sezioni SourceDisksFiles e CopyFiles ) in modo che corrispondano ai file nell'aggiornamento del firmware.

    Ad esempio, l'esempio di dispositivo CFU Hid virtuale supporta due componenti (MCU e Audio). La sezione di esempio seguente specifica i file di offerta e payload per questi componenti.

    ; 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
    

    Vedere il file INF CFU di esempio seguente per il file di esempio CFU INF completo.

    Annotazioni

    Quando i pacchetti vengono installati, il sistema operativo sostituisce %13% con il percorso completo dei file prima di creare i valori del Registro di sistema. Di conseguenza, il driver è in grado di enumerare il Registro di sistema e identificare tutte le immagini del firmware e i file delle offerte.

    Annotazioni

    Nell'esempio precedente" "A410A898-8132-4246-AC1A-30F1E98BB0A4", "Offer", "Payload" non deve essere modificato perché il driver della posta in arrivo CFU cercherà questi valori in fase di esecuzione.

  3. Nel file INF personalizzato, specificare le funzionalità del dispositivo con le impostazioni delle funzionalità del Registro descritte nella tabella e nella sezione INF di esempio seguente.

    Il driver della posta in arrivo CFU consente di personalizzare il comportamento del driver per ottimizzare per determinati scenari. Tali impostazioni vengono controllate tramite le impostazioni del Registro di sistema, descritte nella tabella dei valori del Registro di sistema CFU riportata di seguito.

    Ad esempio, il driver di posta in arrivo CFU richiede informazioni sui dettagli sull'utilizzo delle funzionalità di valore in base all'implementazione del firmware. Per altre informazioni e un esempio su come eseguire questa operazione, vedere la sezione impostazioni delle funzionalità del valore INF di seguito.

    È possibile configurare ognuno di questi valori del Registro di sistema in base alle esigenze di implementazione del firmware.

    Valori del Registro di sistema CFU

    Valore del Registro di sistema Descrizione
    Allineamento Attributo protocollo: qual è l'allineamento del record bin necessario per questa configurazione?

    Durante la fase di invio del payload del protocollo, il driver riempie molti buffer HID con il payload e li invia al firmware uno alla volta.

    Questa opzione imposta il requisito di allineamento durante il compattamento del payload.

    Per impostazione predefinita viene usato l'allineamento a 8 byte. Se non è necessario alcun allineamento, configurare questa opzione come 1.

    UseHidSetOutputReport 0 - Il driver userà la richiesta di scrittura durante l'invio di qualsiasi report di output.

    1 - Il driver userà IOCTL_HID_SET_OUTPUT_REPORT per l'invio di qualsiasi report di output.

    Il valore predefinito è 0. Impostare questa proprietà su 1 se il trasporto sottostante non è USB( ad esempio HID Over BTH).

    OffertaValoreIngressoCapacitàIntervalloUtilizzoMinimo Capacità di utilizzo minima per la gestione dei report di input delle offerte.
    OffertaCapacitàValoreUscitaIntervalloUtilizzoMinimo Utilizzo minimo della capacità di valore per la gestione del report di output dell'offerta.
    PayloadInputValueCapabilityUsageRangeMinimum Valore minimo di capacità di utilizzo per la gestione dei report di input del payload.
    GammaMinimaDiUtilizzoCapacitàValoreOutputPayload Valore Minimo di Utilizzo delle Capacità per la Gestione del Rapporto Output del Carico.
    VersionsFeatureValueCapabilityUsageRangeMinimum Utilizzo minimo della capacità del valore per la gestione dei report delle funzionalità di versione.

    Impostazioni delle funzionalità dei valori INF

    Affinché il driver inbox CFU comunichi con il firmware, gli usi delle capacità di valore specificati nell'INF devono corrispondere a quelli nella configurazione del descrittore HID nel firmware.

    In questo esempio, i valori INF corrispondono ai valori specificati nel descrittore Hid del driver di simulazione del firmware virtuale.

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

    Per altre informazioni, vedere il codice seguente in g_CfuVirtualHid_HidReportDescriptor (Descrittore di report HID) in DmfInterface.c.

    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)
    

Distribuire il pacchetto del firmware tramite Windows Update

Distribuire quindi il pacchetto tramite Windows Update.

Per informazioni sulla distribuzione, vedere Flusso di lavoro per la pubblicazione dei driver Windows 10 (download DOCX).

Formato del file di immagine di aggiornamento del firmware

L'immagine di aggiornamento del firmware ha due parti: un file di offerta e un file di payload. L'offerta contiene le informazioni necessarie sul payload di consentire al componente principale nel dispositivo che riceve l'aggiornamento di decidere se il payload sia accettabile. Il payload è un intervallo di indirizzi e byte che il componente primario può utilizzare.

Formato dell'offerta

Il file di offerta è un file binario a 16 byte la cui struttura deve corrispondere al formato specificato nella sezione 5.5.1 della specifica del protocollo CFU.

Formato di payload

Il file di payload è un file binario che contiene una raccolta di record archiviati in modo contiguo. Ogni record è del formato seguente.

Offset Misura Valore Descrizione
Byte 0 DWORD Indirizzo firmware Indirizzo Little Endian (LSB First) utilizzato per scrivere i dati. L'indirizzo usa un indice che inizia da 0. Il firmware può usarlo come offset per determinare l'indirizzo in base alle esigenze durante l'inserimento dell'immagine in memoria.
Byte 4 Byte Durata Lunghezza dei dati del payload.
Byte 5-N Byte Dati Matrice di dati del payload in byte.

Stato di aggiornamento del firmware

Durante la transazione del protocollo, il driver CFU inbox scrive negli ingressi di registro per indicare lo stato. Questa tabella descrive il nome, il formato dei valori e il significato dei valori che il driver tocca durante varie fasi del protocollo.

  • _ID_ nella tabella rappresenta l'ID componente recuperato dal file dell'offerta. Come descritto nella specifica, l'ID componente identifica in modo univoco ogni componente.

  • Per informazioni sul valore DWORD, consultare la specifica.

Fase Posizione Nome valore reg Valore (DWORD)
Avvio; Preofferta. {Chiave hardware del dispositivo}\ComponentFirmwareUpdate "IDcomponente CurrentFwVersion" Versione dal dispositivo
{Chiave hardware del dispositivo}\ComponentFirmwareUpdate ComponenteIDFirmwareUpdateStatus STATO_AGGIORNAMENTO_FIRMWARE_NON_AVVIATO
Offerta; In procinto di inviare l'offerta. {Chiave hardware del dispositivo}\ComponentFirmwareUpdate "ComponenteIDOfferFwVersion" Versione inviata (o che sta per essere inviata) al dispositivo.
Offerta (rifiutata) {Chiave hardware del dispositivo}\ComponentFirmwareUpdate "ComponenteIDMotivoRifiutoStatoAggiornamentoFirmware" Motivo del rifiuto restituito dal dispositivo.
Risposta offerta (dispositivo occupato) {Chiave hardware del dispositivo}\ComponentFirmwareUpdate "ComponentIDFirmwareUpdateStatus" STATO_AGGIORNAMENTO_FIRMWARE_OCCUPATO_ELABORANDO_AGGIORNAMENTO
Risposta all'offerta (accettata); in procinto di inviare il pacchetto dati. {Chiave hardware del dispositivo}\ComponentFirmwareUpdate "IDcomponente FirmwareUpdateStatus" STATO_AGGIORNAMENTO_FIRMWARE_DOWNLOAD_AGGIORNAMENTO
Carico accettato. {Chiave hardware del dispositivo}\ComponentFirmwareUpdate "IDcomponente FirmwareUpdateStatus" STATO_AGGIORNAMENTO_FIRMWARE_IN_ATTESA_DI_RESET
Errore in qualsiasi fase. {Chiave hardware del dispositivo}\ComponentFirmwareUpdate "IDcomponente FirmwareUpdateStatus" ERRORE_STATO_AGGIORNAMENTO_FIRMWARE

File INF CFU di esempio

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;  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"

Risoluzione dei problemi

  1. Controllare i log del preprocessore di traccia del software Windows (WPP) per visualizzare l'interazione del driver per ciascun componente.

  2. Controllare i registri eventi per eventuali errori critici.

  3. Controllare le voci del registro contabile descritte nello stato di aggiornamento del firmware fornito dal driver.

Domande frequenti

Ho un componente A che richiede un aggiornamento, come posso rendere il driver CFU consapevole del componente A?

È necessario configurare il driver CFU per posta in arrivo INF utilizzando l'ID hardware del TLC creato dal componente A.

Ho due componenti: componente A e un componente secondario B. Come faccio a rendere il driver CFU consapevole del componente B?

Non è necessario. Il driver non deve conoscere la gerarchia dei componenti. Interagisce con il componente primario.

Come è possibile rendere il driver consapevole dei file del firmware (offerta, payload) che è necessario inviare al componente A?

Le informazioni sul file del firmware sono impostate in INF come valori del Registro di sistema.

Ho molti file firmware, varie offerte e payload, per il componente principale A e i suoi sottocomponenti. Come faccio a rendere il driver a conoscenza del file del firmware destinato a quale componente?

Le informazioni sul file del firmware sono impostate in INF come valori del Registro di sistema.

Sto usando il driver per gli aggiornamenti del firmware. Come è possibile sapere che un aggiornamento è riuscito?

Lo stato di aggiornamento del firmware viene aggiornato dal driver nel Registro di sistema come parte della contabilità.

Risorse aggiuntive

Informazioni sullo sviluppo di driver Windows con Windows Driver Foundation (WDF):