Configuração de arquivo INF da CFU (Atualização de Firmware de Componente)
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
O CFU está disponível em Windows 10, versão 2004 (atualização de maio de 2020 Windows 10) 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 INF de exemplo configura o driver de caixa 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 simulação de atualização de firmware do dispositivo HID virtual do CFU para obter detalhes sobre o código de dispositivo virtual de exemplo e o 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).
Vídeo do WinHEC 2018 sobre a Atualização de Firmware de Componente
A Especificação do Protocolo CFU (Atualização de Firmware de Componente) descreve um protocolo HID genérico para atualizar o firmware para componentes presentes em um computador ou acessórios. A especificação permite que um componente aceite firmware sem interromper a operação do dispositivo durante um download.
O exemplo de atualização de firmware cfu contém código-fonte de firmware de exemplo para implementar o protocolo CFU.
A ferramenta autônoma cfu pode ser usada para testar sua atualização de firmware em seu dispositivo durante o desenvolvimento e antes de carregá-la no Windows 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 para o driver de caixa de entrada cfu 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 enviar 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 se expor como um dispositivo HID para o sistema operacional (executando o driver de caixa de entrada CFU) e expor uma coleção de Top-Level HID (TLC). O driver da caixa de entrada cfu carrega no TLC e envia a atualização de firmware para o dispositivo.
Isso permite que você serviço seus dispositivos no mercado por meio de Windows Update. Para atualizar o firmware de um componente, implante a imagem de atualização de firmware por meio de Windows Update. Quando o driver da 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.
Configurar o arquivo INF do CFU personalizado
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 de 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 que é 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 código a seguir em g_CfuVirtualHid_HidReportDescriptor (Descritor de Relatório Hid) em DmfInterface.c.
0x06, CFU_DEVICE_USAGE_PAGE, // USAGE_PAGE(0xFA00) 0x09, CFU_DEVICE_USAGE, // USAGE(0xF5)
No 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 conteúdo para 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 obter o arquivo de exemplo 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 oferta e imagem de firmware.Observação
No exemplo acima, "A410A898-8132-4246-AC1A-30F1E98BB0A4", "Offer", "Payload" não devem ser alterados, pois o driver de caixa de entrada cfu procurará esses valores em runtime.
No arquivo INF personalizado, especifique os recursos do dispositivo com as configurações de funcionalidade de valor do 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 configurações do Registro, descritas na tabela de valores do registro cfu abaixo.
Por exemplo, o driver de caixa de entrada cfu requer informações sobre os detalhes de uso da funcionalidade de valor de acordo com a implementação do firmware. Consulte a seção 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 do Registro Descrição Alinhamento Atributo de protocolo: qual é o alinhamento do registro de compartimento necessário para essa configuração? Durante a fase de envio de conteúdo do protocolo, o driver preenche muitos buffers Hid com o conteúdo e envia para o firmware um por um.
Essa opção controla o requisito de alinhamento ao empacotar o conteúdo.
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 sobre BTH).
OfferInputValueCapabilityUsageRangeMinimum Uso mínimo da funcionalidade de valor para tratamento de relatório de entrada de oferta. OfferOutputValueCapabilityUsageRangeMinimum Uso mínimo da funcionalidade de valor para tratamento de relatório de saída da oferta. PayloadInputValueCapabilityUsageRangeMinimum Uso mínimo da funcionalidade de valor para tratamento de relatório de entrada de carga. PayloadOutputValueCapabilityUsageRangeMinimum Uso mínimo da funcionalidade de valor para tratamento de relatório de saída de carga. VersionsFeatureValueCapabilityUsageRangeMinimum Uso mínimo da funcionalidade de valor para tratamento de relatório de recursos de versão. Configurações de funcionalidade de valor INF
Para que o driver da caixa de entrada cfu se comunique com o firmware, os usos de capacidade de valor especificados no INF devem corresponder aos da 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 código a seguir em g_CfuVirtualHid_HidReportDescriptor (Descritor de Relatório Hid) 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 de Windows Update
Em seguida, implante o pacote por meio de Windows Update.
Para obter informações sobre a implantação, consulte fluxo de trabalho de publicação do driver Windows 10 (download do DOCX).
Formato de arquivo de imagem de atualização de 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. O conteúdo é 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 conteúdo é um arquivo binário que é uma coleção de registros armazenados contíguamente. Cada registro tem o seguinte formato.
Deslocamento | Tamanho | Valor | Descrição |
---|---|---|---|
Byte 0 | DWORD | Endereço do firmware | Little Endian (LSB First) Endereço para gravar os dados. 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 carga. |
Status de atualização de firmware
Durante a transação de protocolo, o driver de caixa de entrada cfu grava entradas do registro para indicar o status. Esta tabela descreve o nome, o formato dos valores e o significado dos valores que o driver toca 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 .
Estágio | Location | Nome do valor reg | Valor (DWORD) |
---|---|---|---|
Começar; Pré-oferta. | {Chave de hardware do dispositivo}\ComponentFirmwareUpdate | "ID docomponente CurrentFwVersion" | Versão do dispositivo |
{Chave de hardware do dispositivo}\ComponentFirmwareUpdate | "FirmwareUpdateStatus daIDdo Componente" | FIRMWARE_UPDATE_STATUS_NOT_STARTED | |
Oferecer; Prestes a enviar oferta. | {Chave de hardware do dispositivo}\ComponentFirmwareUpdate | "ID docomponente OfferFwVersion" | Versão enviada (ou prestes a ser enviada) para o dispositivo. |
Resposta da oferta (rejeitada) | {Chave de hardware do dispositivo}\ComponentFirmwareUpdate | "FirmwareUpdateStatusRejectReason daIDdo Componente" | Motivo para rejeição retornada pelo dispositivo. |
Resposta da oferta (dispositivo ocupado) | {Chave de hardware do dispositivo}\ComponentFirmwareUpdate | "FirmwareUpdateStatus daIDdo Componente" | FIRMWARE_UPDATE_STATUS_BUSY_PROCESSING_UPDATE |
Resposta da oferta (aceito); Prestes a enviar Payload. | {Chave de hardware do dispositivo}\ComponentFirmwareUpdate | "FirmwareUpdateStatus daIDdo Componente" | FIRMWARE_UPDATE_STATUS_DOWNLOADING_UPDATE |
Payload Aceito. | {Chave de hardware do dispositivo}\ComponentFirmwareUpdate | "FirmwareUpdateStatus daIDdo Componente" | FIRMWARE_UPDATE_STATUS_PENDING_RESET |
Erro em qualquer estágio. | {Chave de hardware do dispositivo}\ComponentFirmwareUpdate | "FirmwareUpdateStatus daIDdo Componente" | FIRMWARE_UPDATE_STATUS_ERROR |
Exemplo de arquivo INF cfu
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; 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"
Solução de problemas
Verifique os logs do WPP (pré-processador de rastreamento de software) do Windows para ver a interação do lado do driver por componente.
Verifique se há erros críticos nos logs de eventos.
Verifique as entradas de registro de contabilidade descritas na atualização de firmware status fornecidas pelo driver.
Perguntas frequentes
Tenho um componente A que precisa de uma atualização, como posso tornar o driver de 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 subcomponentes B. Como devo tornar o driver cfu ciente 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 posso tornar o driver ciente sobre meus arquivos de firmware (oferta, conteúdo) que preciso enviar para o 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 main componente A e seus subcomponentes. Como devo tornar o driver ciente de 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 fazer sabe que uma atualização foi bem-sucedida?
A atualização de firmware status é atualizada pelo driver no registro como parte da contabilidade.
Recursos adicionais
Saiba mais sobre como desenvolver drivers do Windows usando o WDF (Windows Driver Foundation):
Desenvolvendo drivers com o Windows Driver Foundation, escrito por Penny Orwick e Guy Smith