Compartilhar via


Configuração de arquivo INF do CFU (Component Firmware Update)

Para configurar um arquivo INF personalizado para CFU, siga as diretrizes neste tópico para fornecer os valores e as configurações corretos para seus arquivos de imagem de firmware e dispositivo de hardware.

Observação

A CFU está disponível no Windows 10, versão 2004 (Atualização do Windows 10 de maio de 2020) e versões posteriores.

O arquivo INF cfu de exemplo incluído abaixo fornece um ponto de partida para o arquivo INF personalizado do dispositivo. O exemplo de INF configura o driver de entrada CFU (hidcfu.dll) para habilitar o cenário de atualização de firmware para um dispositivo CFU HID virtual. Consulte o tópico de simulação de atualização de firmware do dispositivo HID virtual da CFU para obter detalhes sobre o código de dispositivo virtual de exemplo e passo a passo que simula a atualização de firmware em um dispositivo HID virtual. As seções abaixo fazem referência ao arquivo INF de exemplo incluído para ilustrar os conceitos de configuração discutidos neste tópico.

O arquivo INF real deve ser personalizado e configurado especificamente para o firmware e o hardware do dispositivo.

Antes de começar

Os recursos a seguir ajudarão você a saber mais sobre o protocolo CFU (Component Firmware Update).

Visão geral

Para atualizar a imagem de firmware para seu dispositivo usando o modelo CFU, você deve esperar atender aos seguintes requisitos:

  • Forneça um arquivo INF personalizado para seu dispositivo. Esse arquivo fornece informações ao driver CFU de caixa de entrada, que envia a atualização de firmware para o dispositivo. Recomendamos que você personalize o arquivo INF cfu de exemplo fornecido abaixo neste tópico para dar suporte a seus cenários de atualização de firmware.

  • Seu dispositivo deve ser enviado com uma imagem de firmware que esteja em conformidade com o protocolo CFU para que ele possa aceitar uma atualização do driver CFU.

  • Seu dispositivo deve apresentar-se como um dispositivo HID para o sistema operacional (executando o driver inbox CFU) e expor uma coleção HID Top-Level (TLC). O driver de caixa de entrada CFU é carregado no TLC e a atualização de firmware é enviada para o dispositivo.

Isso permite que você faça a manutenção dos seus dispositivos em uso através do Windows Update. Para atualizar o firmware para um componente, implante a imagem de atualização de firmware por meio do Windows Update. Quando o driver de caixa de entrada CFU detecta a presença de um componente, ele executa as ações necessárias no host e transmite a imagem de firmware para o componente primário no dispositivo.

Atualização de firmware CFU.

Configurar o arquivo INF do CFU personalizado

  1. No arquivo INF personalizado, insira as IDs de hardware de seus dispositivos, conforme indicado neste exemplo.

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

    Configurações da ID de Hardware do INF

    Para que o driver de caixa de entrada CFU se comunique com o firmware, a ID de hardware especificada no INF deve corresponder ao especificado na configuração do descritor Hid no firmware.

    Conforme mostrado abaixo, os valores CfuVirtualHidDeviceFwUpdate.inf correspondem aos valores especificados no descritor Hid do driver de simulação de firmware virtual.

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

    Para obter mais informações, consulte o seguinte código em g_CfuVirtualHid_HidReportDescriptor (Descritor de Relatório Oculto) em DmfInterface.c.

    0x06, CFU_DEVICE_USAGE_PAGE,        // USAGE_PAGE(0xFA00)
    0x09, CFU_DEVICE_USAGE,             // USAGE(0xF5)
    
  2. Em seu arquivo INF personalizado, atualize as seguintes entradas mostradas aqui (incluindo as seções SourceDisksFiles e CopyFiles ) para corresponder aos arquivos em sua atualização de firmware.

    Por exemplo, o exemplo de dispositivo CFU Hid virtual dá suporte a dois componentes (MCU e Áudio). A seção de exemplo abaixo especifica os arquivos de oferta e carga útil referentes a esses componentes.

    ; 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
    

    Consulte o arquivo INF cfu de exemplo abaixo para o arquivo de exemplo de CFU INF completo.

    Observação

    Quando os pacotes são instalados, o sistema operacional substitui o %13% pelo caminho completo para os arquivos antes de criar os valores do registro. Assim, o driver pode enumerar o registro e identificar todos os arquivos de imagem e oferta de firmware.

    Observação

    No exemplo acima, "A410A898-8132-4246-AC1A-30F1E98BB0A4", "Offer", "Payload" não deve ser alterado, pois o driver de caixa de entrada CFU procurará esses valores no runtime.

  3. No arquivo INF personalizado, especifique as capacidades do dispositivo com as configurações de capacidades de valores de Registro descritas na tabela e na seção INF de exemplo abaixo.

    O driver de caixa de entrada CFU fornece uma maneira de personalizar o comportamento do driver para otimizar para determinados cenários. Essas configurações são controladas por meio de valores do Registro CFU, descritos na tabela abaixo.

    Por exemplo, o driver CFU requer informações sobre os detalhes de uso da capacidade de valor conforme a implementação do firmware. Consulte a seção de configurações de funcionalidade de valor INF abaixo para obter mais informações e um exemplo sobre como fazer isso.

    Você pode configurar cada um desses valores do Registro de acordo com suas necessidades de implementação de firmware.

    Valores do registro CFU

    Valor de Registro Descrição
    Alinhamento Atributo de protocolo: qual é o alinhamento do registro bin necessário para essa configuração?

    Durante a fase de envio de carga do protocolo, o driver preenche muitos buffers HID com o conteúdo e envia para o firmware um a um.

    Essa opção controla o requisito de alinhamento ao empacotar a carga.

    Por padrão, o alinhamento de 8 bytes é usado. Se nenhum alinhamento for necessário, configure-o como 1.

    UseHidSetOutputReport 0 – O driver usará a solicitação de gravação ao enviar qualquer relatório de saída.

    1 - O driver usará IOCTL_HID_SET_OUTPUT_REPORT para enviar qualquer relatório de saída.

    O padrão é 0. Defina isso como 1 se o transporte subjacente não for USB (por exemplo, HID Over BTH).

    FaixaMínimaDeCapacidadeDeUsoDeValorDeEntradaOferta Uso mínimo de capacidade de valor para tratamento de relatório de entrada de oferta.
    OferecerValorDeSaídaCapacidadeUsoIntervaloMínimo Uso mínimo da capacidade de valor para manipulação de relatório de resultados de ofertas.
    "IntervaloMínimoDeUsoDeCapacidadeDeValorDeEntradaDeCargaÚtil" Uso Mínimo de Capacidade de Valor para Manipulação de Relatório de Entrada de Dados.
    PayloadValorSaídaCapacidadeUsoIntervaloMínimo Uso mínimo da capacidade de valor para tratamento de relatório de saída de carga útil.
    VersõesValorDoRecursoCapacidadeFaixaDeUsoMínimo Uso mínimo de recursos de valor para tratamento de relatório de recursos de versão.

    Configurações de funcionalidade de valor INF

    Para que o driver de caixa de entrada CFU se comunique com o firmware, os usos de funcionalidade de valor especificados no INF devem corresponder aos que estão na configuração do descritor Hid no firmware.

    Neste exemplo, os valores INF correspondem aos valores especificados no descritor Hid do driver de simulação de firmware virtual.

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

    Para obter mais informações, consulte o seguinte código em g_CfuVirtualHid_HidReportDescriptor (Descritor de Relatório Oculto) em 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)
    

Implantar o pacote de firmware por meio do Windows Update

Em seguida, implante o pacote por meio do Windows Update.

Para obter informações sobre a implantação, consulte o Fluxo de Trabalho de Publicação do Driver do Windows 10 (download do DOCX).

Formato de arquivo de imagem de atualização do firmware

A imagem de atualização de firmware tem duas partes: um arquivo de oferta e um arquivo de conteúdo. A oferta contém informações necessárias sobre o conteúdo para permitir que o componente primário no dispositivo que está recebendo a atualização decida se o conteúdo é aceitável. A carga útil é um intervalo de endereços e bytes que o componente primário pode consumir.

Formato da oferta

O arquivo de oferta é um dado binário de 16 bytes cuja estrutura deve corresponder ao formato especificado na seção 5.5.1 da especificação do protocolo CFU.

Formato de conteúdo

O arquivo de carga útil é um arquivo binário que é uma coleção de registros armazenados contiguamente. Cada registro é do seguinte formato.

Offset Tamanho Valor Descrição
Byte 0 dword Endereço de firmware Endereço para escrever os dados no formato Little Endian (LSB First). O endereço é baseado em 0. O firmware pode usar isso como um deslocamento para determinar o endereço conforme necessário ao colocar a imagem na memória.
Byte 4 byte Comprimento Comprimento dos dados de carga.
Byte 5-N Bytes Dados Matriz de bytes de dados de conteúdo.

Status da atualização do firmware

Durante a transação de protocolo, o driver de entrada CFU grava entradas de registro para indicar o estado. Esta tabela descreve o nome, o formato dos valores e o significado dos valores que o driver acessa durante vários estágios do protocolo.

  • _ID_ na tabela representa a ID do componente, que é recuperada do arquivo de oferta. Conforme descrito na especificação, a ID do componente identifica exclusivamente cada componente.

  • Para obter informações sobre o Valor DWORD, consulte a especificação.

Etapa Localização Nome do valor do registro Valor (DWORD)
Começar; Pré-oferta. {Chave de hardware do dispositivo}\ComponentFirmwareUpdate ID do ComponenteVersãoAtualFirmw Versão extraída do dispositivo
{Chave de hardware do dispositivo}\ComponentFirmwareUpdate "ID do ComponenteStatusDeAtualizaçãoDoFirmware" STATUS_ATUALIZAÇÃO_FIRMWARE_NÃO_INICIADA
Oferecer; Prestes a enviar uma oferta. {Chave de hardware do dispositivo}\ComponentFirmwareUpdate IDdo componente OfferFwVersion Versão que é enviada (ou prestes a ser enviada) para o dispositivo.
Resposta da oferta (rejeitada) {Chave de hardware do dispositivo}\ComponentFirmwareUpdate ID do componente FirmwareUpdateStatusRejectReason Motivo da rejeição retornada pelo dispositivo.
Resposta da oferta (dispositivo ocupado) {Chave de hardware do dispositivo}\ComponentFirmwareUpdate "ID do componenteFirmwareUpdateStatus" STATUS_ATUALIZAÇÃO_FIRMWARE_OCUPADO_PROCESSANDO_ATUALIZAÇÃO
Resposta à oferta (aceita); Prestes a enviar Carga útil. {Chave de hardware do dispositivo}\ComponentFirmwareUpdate ID do componente FirmwareUpdateStatus STATUS_ATUALIZAÇÃO_FIRMWARE_BAIXANDO_ATUALIZAÇÃO
Carga útil aceita. {Chave de hardware do dispositivo}\ComponentFirmwareUpdate "ComponenteIDStatus de Atualização de Firmware" FIRMWARE_UPDATE_STATUS_PENDING_RESET
Erro em qualquer estágio. {Chave de hardware do dispositivo}\ComponentFirmwareUpdate "IDdo componente FirmwareUpdateStatus" ERRO_STATUS_ATUALIZAÇÃO_FIRMWARE

Exemplo de arquivo 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"

Resolução de problemas

  1. Verifique os logs do WPP (pré-processador de rastreamento de software) do Windows para ver a interação do lado do driver por componente.

  2. Verifique se há erros críticos nos logs de eventos.

  3. Verifique as entradas de registro de contabilidade descritas no status de atualização de firmware fornecido pelo driver.

perguntas frequentes

Tenho um componente A que precisa de uma atualização, como posso tornar o driver CFU ciente do componente A?

Você precisa configurar o INF do driver de caixa de entrada CFU usando a ID de hardware do TLC criado pelo componente A.

Tenho dois componentes: componente A e um subcomponente B. Como fazer com que o driver CFU saiba do componente B?

Você não precisa. O driver não precisa saber sobre a hierarquia de componentes. Ele interage com o componente primário.

Como fazer com que o driver saiba sobre meus arquivos de firmware (oferta, conteúdo) que preciso enviar ao meu componente A?

As informações do arquivo de firmware são definidas no INF como valores do Registro.

Tenho muitos arquivos de firmware, várias ofertas, conteúdo, para o componente principal A e seus subcomponentes. Como fazer com que o driver saiba qual arquivo de firmware destina-se a qual componente?

As informações do arquivo de firmware são definidas no INF como valores do Registro.

Estou usando o driver para atualizações de firmware. Como saber se uma atualização foi bem-sucedida?

O status de atualização do firmware é atualizado pelo driver no registro como parte da contabilidade.

Recursos adicionais

Saiba mais sobre como desenvolver drivers do Windows usando o WDF (Windows Driver Foundation):