Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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 (Actualización de mayo de 2020 de Windows 10) 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 firmware y el hardware 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 sobre la actualización del firmware de componentes
La especificación del protocolo Component Firmware Update (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 de 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 INF de CFU de ejemplo que se proporciona a continuación en este documento para admitir escenarios de actualización de firmware.
El dispositivo debe enviarse con una imagen de firmware 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 de Top-Level HID (TLC). El controlador de bandeja de entrada de CFU se carga en el TLC y envía la actualización del firmware al dispositivo.
Esto le permite atender los 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 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.
Configura tu 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 MCUConfiguración de ID de hardware INF
Para que el controlador de entrada 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:00F5Para 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, la muestra del dispositivo HID de CFU virtual soporta dos componentes (MCU y Audio). En la sección de ejemplo siguiente se especifican los archivos de oferta y carga de 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.binConsulte el archivo INF de CFU de ejemplo siguiente para obtener el archivo de ejemplo completo de CFU INF.
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 del firmware y archivos de oferta del firmware.Nota:
En el ejemplo anterior, "A410A898-8132-4246-AC1A-30F1E98BB0A4", "Offer", "Payload" no se debe cambiar porque el controlador de bandeja de entrada CFU buscará estos valores en tiempo de ejecución.
En su archivo INF personalizado, especifique las capacidades del dispositivo con las configuraciones del valor de capacidad del Registro que se describen 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 determinados escenarios. Estas opciones 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 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 la 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 Alineación 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 la carga 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).
OfrecerValorDeEntradaRangoDeUsoDeCapacidadMínimo Valor mínimo de uso de capacidad para el manejo de informes de entrada de la oferta. OfertaValorDeSalidaCapacidadDeUsoRangoMínimo Capacidad de Valor Uso Mínimo para el Manejo de Informes de Salida de Ofertas. Mínimo del Rango de Uso de la Capacidad del Valor de Entrada de la Carga Útil Valor Capacidad Uso mínimo para el manejo de informes de entrada de carga. Mínimo de Rango de Uso de Capacidad de Valor de Salida de Carga Útil Uso mínimo de capacidad de valor para el manejo de informes de salida de carga útil. VersionesFunciónValorCapacidadUsoRangoMínimo Uso mínimo de capacidad de valor para gestionar informes de características de versión. Configuración de la funcionalidad de valor INF
Para que el 'CFU inbox driver' se comunique con el firmware, los usos de capacidad especificados en el 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, 0x42Para 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)
Implementar el 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, consulta Flujo de trabajo de publicación de controladores de Windows 10 (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 puede consumir el componente principal.
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 | Tamaño | Importancia | Descripción |
|---|---|---|---|
| Byte 0 | DWORD | Dirección del firmware | Dirección Little Endian (LSB First) para escribir los datos. La dirección está basada en 0. El firmware podría utilizarlo como desplazamiento para determinar la dirección cuando sea necesario al colocar la imagen en la memoria. |
| Byte 4 | byte | Largura | Longitud de los datos de carga. |
| Byte 5-N | Bytes (unidades de información digital) | Datos | Matriz de bytes de datos de carga. |
Estado de actualización de 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 el controlador toca 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 .
| Etapa | Ubicación | Nombre del valor Reg | Valor (DWORD) |
|---|---|---|---|
| Empezar; Oferta previa. | {Clave de hardware del dispositivo}\ComponentFirmwareUpdate | ID del componente VersiónActualFw | Versión desde el dispositivo |
| {Clave de hardware del dispositivo}\ComponentFirmwareUpdate | Id. del componenteFirmwareUpdateStatus | ESTADO_ACTUALIZACIÓN_FIRMWARE_NO_INICIADO | |
| Oferta; A punto de enviar la oferta. | {Clave de hardware del dispositivo}\ComponentFirmwareUpdate | IDComponente 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 a la oferta (dispositivo ocupado) | {Clave de hardware del dispositivo}\ComponentFirmwareUpdate | "ID de componente EstadoDeActualizaciónDeFirmware" | ESTADO_DE_ACTUALIZACION_DE_FIRMWARE_OCUPADO_PROCESANDO_ACTUALIZACION |
| Respuesta de la oferta (aceptada); A punto de enviar la carga. | {Clave de hardware del dispositivo}\ComponentFirmwareUpdate | "ID de componenteEstado de actualización de firmware" | ESTADO_ACTUALIZACIÓN_FIRMWARE_DESCARGANDO_ACTUALIZACIÓN |
| Carga aceptada. | {Clave de hardware del dispositivo}\ComponentFirmwareUpdate | ID del ComponenteEstadoDeActualizaciónDeFirmware | ESTADO_DE_ACTUALIZACIÓN_DEL_FIRMWARE_PENDIENTE_DE_REINICIO |
| Error en cualquier fase. | {Clave de hardware del dispositivo}\ComponentFirmwareUpdate | Id. del componenteFirmwareUpdateStatus | ERROR_DE_ESTADO_DE_ACTUALIZACIÓN_DE_FIRMWARE |
Archivo de ejemplo INF de 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"
Solución de problemas
Compruebe los registros del preprocesador de seguimiento de software de Windows (WPP) 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 contabilidad descritas 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 INF de bandeja de entrada CFU utilizando 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 tenga en cuenta mis archivos de firmware (oferta, carga) que necesito enviar a mi componente A?
La información del archivo de firmware se establece en el INF como valores del Registro.
Tengo muchos archivos de firmware, múltiples configuraciones y cargas útiles 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.
Uso el controlador para las actualizaciones de firmware. ¿Cómo sé que una actualización se ha realizado correctamente?
El controlador actualiza el estado de la actualización del firmware en el registro como parte del mantenimiento.
Recursos adicionales
Obtenga información sobre el desarrollo de controladores de Windows mediante Windows Driver Foundation (WDF):
Desarrollar controladores con Windows Driver Foundation, escrito por Penny Orwick y Guy Smith