Configuración del archivo INF de actualización de firmware de componentes (CFU)
Para configurar un archivo INF personalizado para CFU, siga las instrucciones de este tema para proporcionar los valores y la configuración correctos para los archivos de imagen de firmware y el dispositivo de hardware.
Nota
CFU está disponible en Windows 10, versión 2004 (Windows 10 actualización de mayo de 2020) y versiones posteriores.
El archivo INF de CFU de ejemplo incluido a continuación proporciona un punto de partida para el archivo INF personalizado del dispositivo. El INF de ejemplo configura el controlador de bandeja de entrada de CFU (hidcfu.dll) para habilitar el escenario de actualización de firmware para un dispositivo CFU Hid virtual. Consulte el tema de simulación de actualización de firmware del dispositivo HID virtual de CFU para obtener más información sobre el código de dispositivo virtual de ejemplo y el tutorial que simula la actualización del firmware en un dispositivo HID virtual. En las secciones siguientes se hace referencia al archivo INF de ejemplo incluido para ilustrar los conceptos de configuración descritos en este tema.
El archivo INF real debe personalizarse y configurarse específicamente para el hardware y el firmware del dispositivo.
Antes de empezar
Los siguientes recursos le ayudarán a obtener información sobre el protocolo Actualización de firmware de componentes (CFU).
Vídeo de WinHEC 2018 en actualización de firmware de componentes
La especificación del protocolo de actualización de firmware de componentes (CFU) describe un protocolo HID genérico para actualizar el firmware de los componentes presentes en un equipo o accesorios. La especificación permite que un componente acepte firmware sin interrumpir la operación del dispositivo durante una descarga.
El ejemplo de actualización de firmware de CFU contiene código fuente de firmware de ejemplo para implementar el protocolo CFU.
La herramienta independiente CFU se puede usar para probar la actualización de firmware en el dispositivo durante el desarrollo y antes de cargarla en Windows Update.
Información general
Para actualizar la imagen de firmware del dispositivo mediante el modelo CFU, debe esperar cumplir los siguientes requisitos:
Proporcione un archivo INF personalizado para el dispositivo. Este archivo proporciona información al controlador de bandeja de entrada de CFU que envía la actualización de firmware al dispositivo. Se recomienda personalizar el archivo CFU INF de ejemplo que se proporciona a continuación en este tema para admitir los escenarios de actualización de firmware.
El dispositivo debe enviarse con una imagen de firmware que sea compatible con el protocolo CFU para que pueda aceptar una actualización del controlador CFU.
El dispositivo debe exponerse como un dispositivo HID al sistema operativo (ejecutando el controlador de bandeja de entrada de CFU) y exponer una colección hid Top-Level (TLC). El controlador de bandeja de entrada de CFU se carga en el TLC y envía la actualización de firmware al dispositivo.
Esto le permite atender sus dispositivos en el mercado a través de Windows Update. Para actualizar el firmware de un componente, implemente la imagen de actualización de firmware a través de Windows Update. Cuando el controlador de bandeja de entrada de CFU detecta la presencia de un componente, realiza las acciones necesarias en el host y transmite la imagen de firmware al componente principal del dispositivo.
Configuración del archivo INF de CFU personalizado
En el archivo INF personalizado, inserte los identificadores de hardware de los dispositivos como se indica en este ejemplo.
[Standard.NTamd64] %CfuVirtualHidDeviceFwUpdate.DeviceDesc%=CfuVirtualHidDeviceFwUpdate, HID\VID_045E&UP:FA00_U:00F5 ; HardwareID for VirtualHidDevice MCU
Configuración del identificador de hardware inf
Para que el controlador de bandeja de entrada de CFU se comunique con el firmware, el identificador de hardware especificado en el INF debe coincidir con lo que se especifica en la configuración del descriptor Hid en el firmware.
Como se muestra a continuación, los valores CfuVirtualHidDeviceFwUpdate.inf coinciden con los valores especificados en el descriptor Hid del controlador de simulación de firmware virtual.
[Standard.NTamd64] %CfuVirtualHidDeviceFwUpdate.DeviceDesc%=CfuVirtualHidDeviceFwUpdate, HID\VID_045E&UP:FA00_U:00F5
Para obtener más información, consulte el código siguiente en g_CfuVirtualHid_HidReportDescriptor (Hid Report Descriptor) en DmfInterface.c.
0x06, CFU_DEVICE_USAGE_PAGE, // USAGE_PAGE(0xFA00) 0x09, CFU_DEVICE_USAGE, // USAGE(0xF5)
En el archivo INF personalizado, actualice las siguientes entradas que se muestran aquí (incluidas las secciones SourceDisksFiles y CopyFiles ) para que coincidan con los archivos de la actualización de firmware.
Por ejemplo, el ejemplo de dispositivo CFU Hid virtual admite dos componentes (MCU y Audio). En la sección de ejemplo siguiente se especifican los archivos de oferta y carga para estos 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 el archivo CFU INF de ejemplo siguiente para obtener el archivo de ejemplo de CFU INF completo.
Nota
Cuando se instalan los paquetes, el sistema operativo reemplaza por
%13%
la ruta de acceso completa a los archivos antes de crear los valores del Registro. Por lo tanto, el controlador puede enumerar el registro e identificar todos los archivos de imagen y oferta de firmware.Nota
En el ejemplo anterior, "A410A898-8132-4246-AC1A-30F1E98BB0A4", "Offer", "Payload" no debe cambiarse porque el controlador de bandeja de entrada CFU buscará estos valores en tiempo de ejecución.
En el archivo INF personalizado, especifique las funcionalidades del dispositivo con la configuración de funcionalidad de valor del Registro que se describe en la tabla y la sección INF de ejemplo siguiente.
El controlador de bandeja de entrada de CFU proporciona una manera de personalizar el comportamiento del controlador para optimizar en determinados escenarios. Estos valores se controlan a través de la configuración del Registro, que se describe en la tabla de valores del Registro de CFU siguiente.
Por ejemplo, el controlador de bandeja de entrada de CFU requiere información sobre los detalles de uso de la funcionalidad de valor según la implementación del firmware. Consulte la sección Configuración de funcionalidad de valor INF siguiente para obtener más información y un ejemplo sobre cómo hacerlo.
Puede configurar cada uno de estos valores del Registro según sus necesidades de implementación de firmware.
Valores del Registro de CFU
Valor del Registro Descripción Alignment Atributo de protocolo: ¿Cuál es la alineación del registro bin necesaria para esta configuración? Durante la fase de envío de carga del protocolo, el controlador rellena muchos búferes hid con la carga útil y envía al firmware uno por uno.
Esta opción controla el requisito de alineación al empaquetar la carga.
De forma predeterminada, se usa la alineación de 8 bytes. Si no se requiere ninguna alineación, configúrela como 1.
UseHidSetOutputReport 0: el controlador usará la solicitud de escritura al enviar cualquier informe de salida. 1 - El controlador usará IOCTL_HID_SET_OUTPUT_REPORT para enviar cualquier informe de salida.
El valor predeterminado es 0. Establézcalo en 1 si el transporte subyacente no es USB (por ejemplo, HID a través de BTH).
OfferInputValueCapabilityUsageRangeMinimum Uso mínimo de la funcionalidad de valor para el control de informes de entrada de la oferta. OfferOutputValueCapabilityUsageRangeMinimum Valor Uso de funcionalidad mínimo para el control de informes de salida de la oferta. PayloadInputValueCapabilityUsageRangeMinimum Uso mínimo de la funcionalidad de valor para el control de informes de entrada de carga. PayloadOutputValueCapabilityUsageRangeMinimum Uso mínimo de la funcionalidad de valor para el control de informes de salida de carga. VersionsFeatureValueCapabilityUsageRangeMinimum Valor Uso mínimo de la funcionalidad para el control de informes de características de versión. Configuración de la funcionalidad del valor INF
Para que el controlador de bandeja de entrada de CFU se comunique con el firmware, los usos de funcionalidad de valor especificados en inf deben coincidir con los de la configuración del descriptor Hid en el firmware.
En este ejemplo, los valores INF coinciden con los valores especificados en el descriptor Hid del controlador de simulación 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 obtener más información, consulte el código siguiente en g_CfuVirtualHid_HidReportDescriptor (Hid Report Descriptor) en 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)
Implementación del paquete de firmware a través de Windows Update
A continuación, implemente el paquete a través de Windows Update.
Para obtener información sobre la implementación, consulte Windows 10 flujo de trabajo de publicación de controladores (descarga de DOCX).
Formato de archivo de imagen de actualización de firmware
La imagen de actualización de firmware tiene dos partes: un archivo de oferta y un archivo de carga. La oferta contiene información necesaria sobre la carga útil para permitir que el componente principal del dispositivo que recibe la actualización decida si la carga es aceptable. La carga es un intervalo de direcciones y bytes que el componente principal puede consumir.
Formato de oferta
El archivo de oferta es un archivo binario de 16 bytes cuya estructura debe coincidir con el formato especificado en la sección 5.5.1 de la especificación del protocolo CFU.
Formato de carga
El archivo de carga es un archivo binario que una colección de registros que se almacenan de forma contigua. Cada registro tiene el formato siguiente.
Offset | Size | Value | Descripción |
---|---|---|---|
Byte 0 | DWORD | Dirección de firmware | Little Endian (LSB First) Address para escribir los datos. La dirección se basa en 0. El firmware podría usarlo como desplazamiento para determinar la dirección según sea necesario al colocar la imagen en memoria. |
Byte 4 | Byte | Length | Longitud de los datos de carga. |
Byte 5-N | Bytes | data | Matriz de bytes de datos de carga. |
Estado de actualización del firmware
Durante la transacción del protocolo, el controlador de bandeja de entrada de CFU escribe entradas del Registro para indicar el estado. En esta tabla se describe el nombre, el formato de los valores y el significado de los valores que toca el controlador durante varias fases del protocolo.
_ID_ en la tabla representa el identificador de componente, que se recupera del archivo de oferta. Como se describe en la especificación, el identificador de componente identifica de forma única cada componente.
Para obtener información sobre el valor DWORD, consulte la especificación .
Fase | Location | Nombre del valor reg | Valor (DWORD) |
---|---|---|---|
Empezar; Oferta previa. | {Clave de hardware del dispositivo}\ComponentFirmwareUpdate | "Id. decomponente CurrentFwVersion" | Versión del dispositivo |
{Clave de hardware del dispositivo}\ComponentFirmwareUpdate | "Id. decomponente FirmwareUpdateStatus" | FIRMWARE_UPDATE_STATUS_NOT_STARTED | |
Ofrecer; Acerca de enviar oferta. | {Clave de hardware del dispositivo}\ComponentFirmwareUpdate | "Id. decomponente OfferFwVersion" | Versión que se envía (o está a punto de enviar) al dispositivo. |
Respuesta de la oferta (rechazada) | {Clave de hardware del dispositivo}\ComponentFirmwareUpdate | "Id. decomponente FirmwareUpdateStatusRejectReason" | Motivo del rechazo devuelto por el dispositivo. |
Respuesta de la oferta (dispositivo ocupado) | {Clave de hardware del dispositivo}\ComponentFirmwareUpdate | "Id. decomponente FirmwareUpdateStatus" | FIRMWARE_UPDATE_STATUS_BUSY_PROCESSING_UPDATE |
Respuesta de la oferta (aceptada); Acerca de enviar carga. | {Clave de hardware del dispositivo}\ComponentFirmwareUpdate | "Id. decomponente FirmwareUpdateStatus" | FIRMWARE_UPDATE_STATUS_DOWNLOADING_UPDATE |
Carga aceptada. | {Clave de hardware del dispositivo}\ComponentFirmwareUpdate | "Id. decomponente FirmwareUpdateStatus" | FIRMWARE_UPDATE_STATUS_PENDING_RESET |
Error en cualquier fase. | {Clave de hardware del dispositivo}\ComponentFirmwareUpdate | "Id. decomponente FirmwareUpdateStatus" | FIRMWARE_UPDATE_STATUS_ERROR |
Archivo INF de CFU de ejemplo
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; 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"
Solución de problemas
Compruebe los registros del preprocesador de seguimiento de software (WPP) de Windows para ver la interacción del lado del controlador por componente.
Compruebe los registros de eventos para ver si hay errores críticos.
Compruebe las entradas del Registro de mantenimiento que se describen en el estado de actualización de firmware proporcionado por el controlador.
Preguntas más frecuentes
Tengo un componente A que necesita una actualización, ¿cómo puedo hacer que el controlador CFU sea consciente del componente A?
Debe configurar el controlador de bandeja de entrada de CFU INF mediante el identificador de hardware del TLC creado por el componente A.
Tengo dos componentes: el componente A y un subcomponente B. ¿Cómo debo hacer que el controlador CFU sea consciente del componente B?
No es necesario. El controlador no necesita conocer la jerarquía de componentes. Interactúa con el componente principal.
¿Cómo puedo hacer que el controlador conozca mis archivos de firmware (oferta, carga) que necesito enviar a mi componente A?
La información del archivo de firmware se establece en INF como valores del Registro.
Tengo muchos archivos de firmware, varias ofertas, carga, para el componente principal A y sus subcomponentes. ¿Cómo debo hacer que el controlador sepa qué archivo de firmware está pensado para qué componente?
La información del archivo de firmware se establece en INF como valores del Registro.
Estoy usando el controlador para las actualizaciones de firmware. Cómo saber que una actualización se ha realizado correctamente?
El controlador del registro actualiza el estado de la actualización de firmware como parte de la contabilidad.
Recursos adicionales
Obtenga información sobre el desarrollo de controladores de Windows mediante Windows Driver Foundation (WDF):
Desarrollo de controladores con Windows Driver Foundation, escrito por Penny Orwick y Guy Smith