Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Para configurar um arquivo INF personalizado para CFU, siga as orientações neste tópico para fornecer os valores e configurações corretos para seus arquivos de imagem de firmware e dispositivo de hardware.
Observação
CFU está disponível no Windows 10, versão 2004 (Windows 10 May 2020 Update) e versões posteriores.
O arquivo INF CFU de exemplo incluído abaixo fornece um ponto de partida para o arquivo INF personalizado do seu dispositivo. O exemplo INF configura o driver da CFU Inbox (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 virtual HID 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.
Seu arquivo INF real deve ser personalizado e configurado especificamente para o firmware e hardware do seu dispositivo.
Antes de começar
Os recursos a seguir irão ajudá-lo a aprender sobre o protocolo CFU (Component Firmware Update).
Vídeo WinHEC 2018 sobre Atualização de firmware do componente
A especificação do protocolo CFU (Component Firmware Update) descreve um protocolo HID genérico para atualizar o firmware dos componentes presentes em um PC 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 um exemplo de código-fonte de firmware para implementar o protocolo CFU.
A ferramenta autónoma CFU pode ser utilizada para testar a atualização de firmware no seu dispositivo durante o desenvolvimento e antes de a carregar para o Windows Update.
Visão geral
Para atualizar a imagem de firmware do seu dispositivo usando o modelo CFU, você deve esperar atender aos seguintes requisitos:
Forneça um arquivo INF personalizado para seu dispositivo. Este arquivo fornece informações para o driver da caixa de entrada CFU que envia a atualização de firmware para o dispositivo. Recomendamos que você personalize o arquivo CFU INF de exemplo fornecido abaixo neste tópico para dar suporte aos cenários de atualização de firmware.
Seu dispositivo deve ser fornecido com uma imagem de firmware compatível com o protocolo CFU para que ele possa aceitar uma atualização do driver CFU.
Seu dispositivo deve se expor como um dispositivo HID ao sistema operacional (executando o driver da caixa de entrada CFU) e expor um HID Top-Level Collection (TLC). O driver da caixa de entrada CFU é instalado no TLC e envia a atualização de firmware para o dispositivo.
Isto permite-lhe prestar assistência aos seus dispositivos no mercado através do Windows Update. Para atualizar o firmware de um componente, implante a imagem de atualização de firmware por meio do Windows Update. Quando o driver da caixa de entrada CFU deteta a presença de um componente, ele executa as ações necessárias no host e transmite a imagem do firmware para o componente principal no dispositivo.
Configure seu arquivo CFU INF personalizado
No arquivo INF personalizado, insira as IDs de hardware dos dispositivos, conforme indicado neste exemplo.
[Standard.NTamd64] %CfuVirtualHidDeviceFwUpdate.DeviceDesc%=CfuVirtualHidDeviceFwUpdate, HID\VID_045E&UP:FA00_U:00F5 ; HardwareID for VirtualHidDevice MCUConfigurações de ID de hardware INF
Para que o driver da caixa de entrada CFU se comunique com o firmware, o ID de hardware especificado no INF deve corresponder ao especificado na configuração do descritor Hid no firmware.
Como 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:00F5Para obter mais informações, consulte o seguinte código 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 seu ficheiro INF personalizado, atualize as seguintes entradas mostradas aqui (incluindo as secções SourceDisksFiles e CopyFiles ) para corresponder aos ficheiros na atualização de firmware.
Por exemplo, o exemplo de dispositivo virtual CFU Hid suporta dois componentes (MCU e Audio). A seção de exemplo abaixo especifica os arquivos de oferta e carga útil 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.binConsulte o arquivo de exemplo CFU INF abaixo para obter o arquivo de exemplo CFU INF completo.
Observação
Quando os pacotes são instalados, o sistema operacional substitui o
%13%com o caminho completo para os arquivos antes de criar os valores do registro. Assim, o driver é capaz de enumerar o registo e identificar toda a imagem de firmware e disponibilizar os ficheiros.Observação
No exemplo acima, "A410A898-8132-4246-AC1A-30F1E98BB0A4", "Offer", "Payload" não deve ser alterado, pois o driver da caixa de entrada CFU procurará esses valores em tempo de execução.
No seu arquivo INF personalizado, especifique as capacidades do seu dispositivo com as configurações de capacidade do valor do Registro descritas na tabela e na seção de exemplo do INF abaixo.
O driver da 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 das configurações do Registro, descritas na tabela de valores do Registro CFU abaixo.
Por exemplo, o driver da caixa de entrada CFU requer informações sobre os detalhes de uso da capacidade de valor de acordo com a implementação do firmware. Consulte a seção de configurações de capacidade de valor INF abaixo para obter mais informações e um exemplo de como fazer isso.
Você pode configurar cada um desses valores do Registro de acordo com suas necessidades de implementação de firmware.
Valores de registo CFU
Valor do Registo Descrição Alinhamento Atributo de protocolo: Qual é o alinhamento do registro bin necessário para essa configuração? Durante a fase do envio da carga útil do protocolo, o driver preenche muitos buffers Hid com a carga útil e envia-os para o firmware, um de cada vez.
Esta opção controla o requisito de alinhamento ao embalar a carga útil.
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 motorista 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).
OfertaEntradaValorCapacidadeIntervaloUsoMínimo Uso mínimo de capacidade de valor para processamento de relatórios de entrada de ofertas. OferecerValorDaCapacidadeDeUtilizaçãoIntervaloMínimo Valor Mínimo de Uso de Capacidade para Manipulação de Relatório de Saída de Oferta. EntradaDeCargaÚtilCapacidadeDeUsoFaixaMínima Valor Mínimo de Uso de Capacidade para Processamento de Relatório de Entrada de Carga. Valor de SaídaCapacidade de UtilizaçãoFaixa de Uso Mínima da Carga Útil Valor Mínimo de Utilização da Capacidade para Gestão de Relatório de Saída de Carga. VersõesFuncionalidadeValorCapacidadeUsoIntervaloMínimo Uso de capacidade mínima para manipulação de relatórios de funcionalidades de versão. Configurações de capacidade 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, 0x42Para obter mais informações, consulte o seguinte código 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 através do Windows Update
Em seguida, implante o pacote por meio do Windows Update.
Para obter informações sobre implantação, consulte Fluxo de trabalho de publicação de driver do Windows 10 (download DOCX).
Formato de ficheiro 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 carga. A oferta contém as informações necessárias sobre a carga útil para permitir que o componente principal do dispositivo que está recebendo a atualização decida se a carga útil é 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 da carga útil
O arquivo de carga útil é um arquivo binário que contém uma coleção de registros armazenados de forma contígua. Cada registo tem o seguinte formato:
| Compensação | Tamanho | Valor | Descrição |
|---|---|---|---|
| Byte 0 | DWORD | Endereço do firmware | Little Endian (LSB Primeiro) Endereço para escrever os dados. O endereço é baseado em 0. O firmware poderá usar isto como um deslocamento para determinar o endereço sempre que for necessário ao colocar a imagem na memória. |
| Byte 4 | byte | Duração | Comprimento dos dados da carga útil. |
| Byte 5-N | bytes | Dados | Matriz de bytes de dados de carga útil. |
Estado da atualização de firmware
Durante a transação de protocolo, o driver da caixa de entrada CFU grava entradas do registo para indicar o estado. Esta tabela descreve o nome, o formato dos valores e o significado dos valores que o controlador manipula durante as várias fases do protocolo.
_ID_ na tabela representa o ID do componente, que é recuperado do arquivo de oferta. Conforme descrito na especificação, o 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 Reg | Valor (DWORD) |
|---|---|---|---|
| Início; Pré Oferta. | {Chave de hardware do dispositivo}\ComponentFirmwareUpdate | "IDdo componente CurrentFwVersion" | Versão a partir do dispositivo |
| {Chave de hardware do dispositivo}\ComponentFirmwareUpdate | "ID de ComponenteStatus de Atualização de Firmware" | STATUS_DE_ATUALIZAÇÃO_DO_FIRMWARE_NÃO_INICIADO | |
| Oferta; Prestes a enviar a oferta. | {Chave de hardware do dispositivo}\ComponentFirmwareUpdate | "Identificador do ComponenteOfferFwVersion" | Versão que é enviada (ou prestes a ser enviada) para o dispositivo. |
| Resposta da oferta (rejeitada) | {Chave de hardware do dispositivo}\ComponentFirmwareUpdate | "ID docomponente Razão de Rejeição do Estado da Atualização de Firmware" | Motivo da rejeição devolvido pelo dispositivo. |
| Resposta da oferta (dispositivo ocupado) | {Chave de hardware do dispositivo}\ComponentFirmwareUpdate | "ID do ComponenteStatusAtualizaçãoFirmware" | STATUS_ATUALIZAÇÃO_FIRMWARE_OCUPADO_PROCESSANDO_ATUALIZAÇÃO |
| Resposta à Oferta (Aceite); Prestes a enviar Payload. | {Chave de hardware do dispositivo}\ComponentFirmwareUpdate | "IDdo FirmwareUpdateStatus do componente" | ESTADO_DE_ATUALIZAÇÃO_DE_FIRMWARE_A_TRANSFERIR_ATUALIZAÇÃO |
| Carga útil aceite. | {Chave de hardware do dispositivo}\ComponentFirmwareUpdate | "FirmwareUpdateStatus do componente ID" | STATUS_ATUALIZAÇÃO_DE_FIRMWARE_A_AGUARDAR_REINICIALIZAÇÃO |
| Erro em qualquer fase. | {Chave de hardware do dispositivo}\ComponentFirmwareUpdate | "ID do ComponenteEstado de Atualização de Firmware" | ERRO_DE_ESTADO_DE_ATUALIZAÇÃO_DE_FIRMWARE |
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 do registo de contabilidade descritas no estado da atualização de firmware fornecido pelo driver.
FAQ
Eu tenho um componente A que precisa de uma atualização, como posso fazer o driver CFU ciente do componente A?
Você precisa configurar o driver de caixa de entrada CFU INF usando o ID de hardware do TLC criado pelo componente A.
Tenho dois componentes: o componente A e o subcomponente B. Como devo informar o condutor CFU sobre o componente B?
Você não precisa. O driver não precisa saber sobre a hierarquia de componentes. Interage com o componente primário.
Como posso consciencializar o condutor sobre os meus ficheiros de firmware (oferta, carga útil) que preciso de enviar para o meu componente A?
As informações do ficheiro de firmware são definidas no INF como valores de registo.
Tenho muitos ficheiros de firmware, oferta múltipla, carga útil, para o componente principal A e seus subcomponentes. Como devo informar o driver de qual arquivo de firmware se destina a qual componente?
As informações do ficheiro de firmware são definidas no INF como valores de registo.
Estou usando o driver para atualizações de firmware. Como posso saber se uma atualização foi bem-sucedida?
O status de atualização de firmware é atualizado pelo driver no registro como parte da contabilidade.
Recursos adicionais
Saiba mais sobre como desenvolver drivers do Windows usando o Windows Driver Foundation (WDF):
Desenvolvendo drivers com o Windows Driver Foundation, escrito por Penny Orwick e Guy Smith