Поделиться через


Конфигурация INF-файла обновления встроенного ПО компонента (CFU)

Чтобы настроить пользовательский INF-файл для CFU, следуйте указаниям в этом разделе, чтобы указать правильные значения и параметры для файлов образов встроенного ПО и аппаратного устройства.

Примечание

CFU доступен в Windows 10 версии 2004 (обновление Windows 10 за май 2020 г.) и более поздних версиях.

Пример INF-файла CFU, приведенный ниже, служит отправной точкой для пользовательского INF-файла устройства. Пример INF настраивает драйвер папки "Входящие" CFU (hidcfu.dll), чтобы включить сценарий обновления встроенного ПО для виртуального устройства CFU Hid. Дополнительные сведения о примере кода виртуального устройства HID и пошаговом руководстве, имитирующих обновление встроенного ПО виртуального устройства HID на виртуальном устройстве HID, см. в разделе CFU virtual HID . В разделах ниже приведены ссылки на включенный пример INF-файла, чтобы проиллюстрировать основные понятия конфигурации, рассмотренные в этом разделе.

Фактический INF-файл должен быть настроен специально для встроенного ПО устройства и оборудования.

Подготовка к работе

Следующие ресурсы помогут вам узнать о протоколе CFU.

Общие сведения

Чтобы обновить образ встроенного ПО для устройства с помощью модели CFU, вы должны соответствовать следующим требованиям:

  • Укажите пользовательский INF-файл для устройства. Этот файл предоставляет сведения драйверу папки "Входящие" CFU, который отправляет обновление встроенного ПО на устройство. Мы рекомендуем настроить пример INF-файла CFU, приведенный ниже в этом разделе, для поддержки сценариев обновления встроенного ПО.

  • Устройство должно поставляться с образом встроенного ПО, соответствующим протоколу CFU , чтобы оно я было принимать обновления от драйвера CFU.

  • Устройство должно предоставлять себя как устройство HID операционной системе (с драйвером папки "Входящие") и предоставлять коллекцию Top-Level HID (TLC). Драйвер папки "Входящие" CFU загружается на TLC и отправляет обновление встроенного ПО на устройство.

Это позволяет обслуживать устройства на рынке с помощью клиентский компонент Центра обновления Windows. Чтобы обновить встроенное ПО для компонента, разверните образ обновления встроенного ПО с помощью клиентский компонент Центра обновления Windows. Когда драйвер папки "Входящие" CFU обнаруживает наличие компонента, он выполняет необходимые действия на узле и передает образ встроенного ПО в основной компонент на устройстве.

Обновление встроенного ПО CFU.

Настройка пользовательского INF-файла CFU

  1. В настраиваемый INF-файл вставьте аппаратные идентификаторы устройств, как показано в этом примере.

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

    Параметры идентификатора оборудования INF

    Чтобы драйвер папки "Входящие" CFU взаимодействовал с встроенным ПО, идентификатор оборудования, указанный в INF,должен соответствовать идентификатору, указанному в конфигурации дескриптора Hid во встроенном ПО.

    Как показано ниже, значения CfuVirtualHidDeviceFwUpdate.inf соответствуют значениям, указанным в дескрипторе Hid драйвера виртуального моделирования встроенного ПО.

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

    Дополнительные сведения см. в следующем коде в g_CfuVirtualHid_HidReportDescriptor (дескриптор отчета Hid) в DmfInterface.c.

    0x06, CFU_DEVICE_USAGE_PAGE,        // USAGE_PAGE(0xFA00)
    0x09, CFU_DEVICE_USAGE,             // USAGE(0xF5)
    
  2. В пользовательском INF-файле обновите приведенные здесь записи (включая разделы SourceDisksFiles и CopyFiles ), чтобы они соответствовали файлам в обновлении встроенного ПО.

    Например, пример виртуального устройства CFU Hid поддерживает два компонента (MCU и Аудио). В примере раздела ниже указываются файлы предложений и полезных данных для этих компонентов.

    ; 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
    

    Полный пример файла CFU INF см. в примере inf-файла CFU ниже.

    Примечание

    При установке пакетов ОС заменяет %13% полным путем к файлам перед созданием значений реестра. Таким образом, драйвер может перечислить реестр и идентифицировать все образы встроенного ПО и файлы предложения.

    Примечание

    В приведенном выше примере не следует изменять "A410A898-8132-4246-AC1A-30F1E98BB0A4", "Предложение", "Полезные данные", так как драйвер папки "Входящие" CFU будет искать эти значения во время выполнения.

  3. В пользовательском INF-файле укажите возможности устройства с помощью параметров возможностей значения реестра, описанных в таблице и примере раздела INF ниже.

    Драйвер папки "Входящие" CFU позволяет настроить поведение драйвера для оптимизации для определенных сценариев. Эти параметры управляются с помощью параметров реестра, описанных в таблице значений реестра CFU ниже.

    Например, драйверу папки "Входящие" CFU требуются сведения об использовании возможностей значения в рамках реализации встроенного ПО. Дополнительные сведения и пример этого см. в разделе Параметры возможностей INF-значения ниже.

    Вы можете настроить каждое из этих значений реестра в соответствии с потребностями реализации встроенного ПО.

    Значения реестра CFU

    Значение реестра Описание
    Выравнивание Атрибут протокола. Какое выравнивание записей ячейки требуется для этой конфигурации?

    На этапе отправки полезных данных протокола драйвер заполняет множество буферов Hid полезными данными и отправляет их во встроенное ПО по одному.

    Этот параметр управляет требованием выравнивания при упаковке полезных данных.

    По умолчанию используется выравнивание в 8 байт. Если выравнивание не требуется, настройте его как 1.

    UseHidSetOutputReport 0 — драйвер будет использовать запрос на запись при отправке любого выходного отчета.

    1. Драйвер будет использовать IOCTL_HID_SET_OUTPUT_REPORT для отправки любого выходного отчета.

    Значение по умолчанию — 0. Задайте для этого параметра значение 1, если базовый транспорт не является USB (например, HID Over BTH).

    OfferInputValueCapabilityUsageRangeMinimum Минимальное использование возможностей значения для обработки входного отчета предложения.
    OfferOutputValueCapabilityUsageRangeMinimum Минимальное использование возможностей значения для обработки выходных отчетов предложения.
    PayloadInputValueCapabilityUsageRangeMinimum Минимальное использование возможностей значения для обработки входных отчетов полезных данных.
    PayloadOutputValueCapabilityUsageRangeMinimum Минимальное использование возможностей значения для обработки отчета о выходе полезных данных.
    VersionsFeatureValueCapabilityUsageRangeMinimum Минимальное использование возможностей значения для обработки отчета о функциях версии.

    Параметры возможностей inf value

    Чтобы драйвер папки "Входящие" CFU взаимодействовал с встроенным ПО, использование возможностей значений, указанных в INF-файле, должно совпадать с параметрами в конфигурации дескриптора Hid во встроенном ПО.

    В этом примере значения INF соответствуют значениям, указанным в дескрипторе Hid драйвера виртуального моделирования встроенного ПО.

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

    Дополнительные сведения см. в следующем коде в g_CfuVirtualHid_HidReportDescriptor (дескриптор отчета Hid) в 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)
    

Развертывание пакета встроенного ПО с помощью клиентский компонент Центра обновления Windows

Затем разверните пакет с помощью клиентский компонент Центра обновления Windows.

Дополнительные сведения о развертывании см. в разделе Рабочий процесс публикации драйвера Windows 10 (загрузка DOCX).

Формат файла образа обновления встроенного ПО

Образ обновления встроенного ПО состоит из двух частей: файла предложения и файла полезных данных. Предложение содержит необходимые сведения о полезных данных, чтобы позволить основному компоненту устройства, получающего обновление, решить, являются ли полезные данные приемлемыми. Полезные данные — это диапазон адресов и байтов, которые может использовать основной компонент.

Формат предложения

Файл предложения представляет собой 16-байтовые двоичные данные, структура которых должна соответствовать формату, указанному в разделе 5.5.1 спецификации протокола CFU.

Формат полезных данных

Файл полезных данных — это двоичный файл, который представляет собой коллекцию записей, которые хранятся непрерывно. Каждая запись имеет следующий формат.

Offset Размер Значение Описание
Байт 0 DWORD Адрес встроенного ПО Адрес little Endian (LSB First) для записи данных. Адрес основан на 0. Встроенное ПО может использовать это в качестве смещения для определения адреса при необходимости при размещении образа в памяти.
Байт 4 Byte Длина Длина полезных данных.
Байт 5–N Байты Данные Массив байтов полезных данных.

Состояние обновления встроенного ПО

Во время транзакции протокола драйвер папки "Входящие" CFU записывает записи реестра для указания состояния. В этой таблице описаны имя, формат значений и значение значений, которые драйвер касается на различных этапах протокола.

  • _ID_ в таблице представляет идентификатор компонента, полученный из файла предложения. Как описано в спецификации, идентификатор компонента однозначно идентифицирует каждый компонент.

  • Дополнительные сведения о DWORD-значении см. в спецификации.

Этап Расположение Reg Value Name Значение (DWORD)
Начать; Предварительное предложение. {Ключ оборудования устройства}\ComponentFirmwareUpdate "Идентификаторкомпонента CurrentFwVersion" Версия с устройства
{Ключ оборудования устройства}\ComponentFirmwareUpdate "ComponentIDFirmwareUpdateStatus" FIRMWARE_UPDATE_STATUS_NOT_STARTED
Предлагаем; О том, чтобы отправить предложение. {Ключ оборудования устройства}\ComponentFirmwareUpdate "ПредложениеИДкомпонентаFwVersion" Версия, которая будет отправлена (или будет отправлена) на устройство.
Ответ на предложение (отклонено) {Ключ оборудования устройства}\ComponentFirmwareUpdate "ComponentIDFirmwareUpdateStatusRejectReason" Причина отклонения, возвращенная устройством.
Ответ предложения (устройство занято) {Ключ оборудования устройства}\ComponentFirmwareUpdate "ComponentIDFirmwareUpdateStatus" FIRMWARE_UPDATE_STATUS_BUSY_PROCESSING_UPDATE
Ответ предложения (принято); Сведения об отправке полезных данных. {Ключ оборудования устройства}\ComponentFirmwareUpdate "ComponentIDFirmwareUpdateStatus" FIRMWARE_UPDATE_STATUS_DOWNLOADING_UPDATE
Полезные данные приняты. {Ключ оборудования устройства}\ComponentFirmwareUpdate "ComponentIDFirmwareUpdateStatus" FIRMWARE_UPDATE_STATUS_PENDING_RESET
Ошибка на любом этапе. {Ключ оборудования устройства}\ComponentFirmwareUpdate "ComponentIDFirmwareUpdateStatus" FIRMWARE_UPDATE_STATUS_ERROR

Пример 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"

Устранение неполадок

  1. Проверьте журналы препроцессора трассировки программного обеспечения Windows (WPP), чтобы увидеть взаимодействие со стороны драйвера для каждого компонента.

  2. Проверьте журналы событий на наличие критических ошибок.

  3. Проверьте записи реестра бухгалтерии, описанные в разделе Состояние обновления встроенного ПО, предоставленное драйвером.

Вопросы и ответы

У меня есть компонент A, который требует обновления. Как сделать драйвер CFU осведомленным о компоненте A?

Необходимо настроить inf драйвера папки "Входящие" CFU с помощью идентификатора оборудования TLC, созданного компонентом A.

У меня есть два компонента: компонент A и подкомпонент B. Как сделать драйвер CFU осведомленным о компоненте B?

Тебе не нужно. Драйверу не нужно знать об иерархии компонентов. Он взаимодействует с основным компонентом.

Как сообщить драйверу о файлах встроенного ПО (предложение, полезные данные), которые необходимо отправить в компонент A?

Сведения о файле встроенного ПО задаются в INF как значения реестра.

У меня много файлов встроенного ПО, несколько предложений, полезных данных для main компонента A и его подкомпонентов. Как сделать драйверу известно, какой файл встроенного ПО предназначен для какого компонента?

Сведения о файле встроенного ПО задаются в INF как значения реестра.

Я использую драйвер для обновления встроенного ПО. Разделы справки знаете, что обновление прошло успешно?

Состояние обновления встроенного ПО обновляется драйвером в реестре в рамках бухгалтерского учета.

Дополнительные ресурсы

Узнайте о разработке драйверов Windows с помощью Windows Driver Foundation (WDF):