Partilhar via


Especificação do protocolo CFU (Component Firmware Update)

Esta especificação 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. A especificação suporta configurações em que o componente que aceita o firmware pode ter subcomponentes, que requerem imagens de firmware separadas. A especificação permite que o componente responsável decida se aceita o firmware. Ele também atua como uma otimização porque a imagem do firmware só é enviada para o componente se ele for capaz ou estiver pronto para aceitá-la.

Observação

CFU está disponível no Windows 10, versão 2004 (Windows 10 May 2020 Update) e versões posteriores.

Conteúdos

Tabelas

Tabela 5.1-1 Layout de resposta GET_FIRMWARE_VERSION

Tabela 5.1-2 Resposta GET_FIRMWARE_VERSION - Layout do cabeçalho

Tabela 5.1-3 Resposta GET_FIRMWARE_VERSION - Bits de cabeçalho

Tabela 5.1-4 Resposta GET_FIRMWARE_VERSION - Versão do componente e layout de propriedades

Tabela 5.1-5 Resposta GET_FIRMWARE_VERSION - Versão do Componente e Bits de Propriedades

Tabela 5.2-1 Layout de comando FIRMWARE_UPDATE_OFFER

Tabela 5.2-2 Comando FIRMWARE_UPDATE_OFFER - Layout de informações do componente

Tabela 5.2-3 Comando FIRMWARE_UPDATE_OFFER - Bits de Informação do Componente

Tabela 5.2-4 Comando FIRMWARE_UPDATE_OFFER - Layout da versão do firmware

Tabela 5.2-5 Comando FIRMWARE_UPDATE_OFFER - Bits da versão do firmware

Tabela 5.2-6 Comando FIRMWARE_UPDATE_OFFER - Layout específico do fornecedor

Tabela 5.2-7 Comando FIRMWARE_UPDATE_OFFER - Versão diversa e protocolar

Tabela 5.2-8 Layout do token de resposta FIRMWARE_UPDATE_OFFER

Tabela 5.2-9 Resposta FIRMWARE_UPDATE_OFFER - Layout do token

Tabela 5.2-10 Resposta FIRMWARE_UPDATE_OFFER - Bits de token

Tabela 5.2-11 Resposta FIRMWARE_UPDATE_OFFER - Layout do motivo de rejeição

Tabela 5.2-12 Resposta FIRMWARE_UPDATE_OFFER - Bits de Motivo de Rejeição

Tabela 5.2-13 Valores do código RR de resposta FIRMWARE_UPDATE_OFFER

Tabela 5.2-14 Layout do estado da resposta FIRMWARE_UPDATE_OFFER

Tabela 5.2-15 Resposta FIRMWARE_UPDATE_OFFER - Bits de Status

Tabela 5.2-16 Valores de Estado de Resposta FIRMWARE_UPDATE_OFFER

Tabela 5.3-1 FIRMWARE_UPDATE_OFFER - Layout do comando de informações

Tabela 5.3-2 FIRMWARE_UPDATE_OFFER - Comando de Informação - Layout do Componente

Tabela 5.3-3 FIRMWARE_UPDATE_OFFER - Comando de Informação - Bits de Componente

Quadro 5.3-4 FIRMWARE_UPDATE_OFFER - Comando de Informação - Valores do Código de Informação

Tabela 5.3-5 FIRMWARE_UPDATE_OFFER - Layout de resposta de informações

Tabela 5.3-6 FIRMWARE_UPDATE_OFFER- Layout do token de resposta do pacote de informações

Tabela 5.3-7 FIRMWARE_UPDATE_OFFER - Resposta de Informação - Bits de Autenticação

Tabela 5.3-8 FIRMWARE_UPDATE_OFFER - Resposta à Informação - Layout do Código RR

Tabela 5.3-9 FIRMWARE_UPDATE_OFFER- Informações da Resposta da Oferta - Bits de Código RR

Tabela 5.3-10 FIRMWARE_UPDATE_OFFER- Resposta à Informação - Valores do Código RR

Tabela 5.3-11 FIRMWARE_UPDATE_OFFER - Estrutura do Estado da Resposta Informativa da Oferta

Tabela 5.3-12 FIRMWARE_UPDATE_OFFER - Dados da Oferta - Bits de Status de Resposta

Tabela 5.4-1 FIRMWARE_UPDATE_OFFER - Layout de comando estendido

Tabela 5.4-2 FIRMWARE_UPDATE_OFFER - Pacote de Comando Estendido - Comando - Layout do Componente

Tabela 5.4-3 FIRMWARE_UPDATE_OFFER - Comando Estendido - Bits de Componente

Tabela 5.4-4 FIRMWARE_UPDATE_OFFER - Comando estendido - Valores do código de comando

Tabela 5.4-5 FIRMWARE_UPDATE_OFFER - Layout de resposta de pacote de comando estendido

Tabela 5.4-6 FIRMWARE_UPDATE_OFFER- Resposta ao Pacote de Comando de Oferta - Layout de Token

Tabela 5.4-7 FIRMWARE_UPDATE_OFFER - Oferta do Comando de Resposta - Bits do Token

Tabela 5.4-8 FIRMWARE_UPDATE_OFFER - Layout de Resposta RR do Pacote de Informações da Oferta

Tabela 5.4-9 FIRMWARE_UPDATE_OFFER - Proposta de Resposta ao Comando - Código RR

Tabela 5.4-10 FIRMWARE_UPDATE_OFFER- Pacote de comando de oferta - Valores de código RR

Tabela 5.4-11 FIRMWARE_UPDATE_OFFER - Layout de status de resposta do pacote de comando Offer

Tabela 5.4-12 FIRMWARE_UPDATE_OFFER- Oferecer código RR de resposta de pacote de comando

Tabela 5.5-1 Layout de comando FIRMWARE_UPDATE_CONTENT

Tabela 5.5-2 Layout do cabeçalho do comando FIRMWARE_UPDATE_CONTENT

Tabela 5.5-3 Bits de Cabeçalho FIRMWARE_UPDATE_CONTENT

Tabela 5.5-4 FIRMWARE_UPDATE_OFFER- Pacote de comando de oferta - Valores do sinalizador

Tabela 5.5-5 Layout de dados de comando FIRMWARE_UPDATE_CONTENT

Tabela 5.5-6 Bits de Dados do Comando FIRMWARE_UPDATE_CONTENT

Tabela 5.5-7 Layout de resposta de comando FIRMWARE_UPDATE_CONTENT

Quadro 5.5-8 Resposta FIRMWARE_UPDATE_CONTENT - Número de sequência

Tabela 5.5-9 FIRMWARE_UPDATE_CONTENT - Comando - Bits de resposta

Tabela 5.5-10 Layout do Status de Resposta de FIRMWARE_UPDATE_CONTENT

Tabela 5.5-11 FIRMWARE_UPDATE_OFFER - Resposta - Status Bits

Tabela 5.5-12 FIRMWARE_UPDATE_OFFER- Resposta - Valores do código de status

1 Introdução

Os PCs e acessórios atuais têm componentes internos que executam operações complexas. Para garantir um produto de qualidade, há a necessidade de atualizar frequentemente o comportamento desses dispositivos em estágios posteriores de desenvolvimento ou depois de serem enviados aos clientes. A atualização pode corrigir problemas funcionais ou de segurança identificados ou a necessidade de adicionar novos recursos. Uma grande parte da lógica complexa está no firmware em execução no dispositivo, que é atualizável.

Esta especificação descreve um protocolo HID genérico para atualizar o firmware dos componentes presentes em um PC ou seus acessórios. A implementação do HID está além do escopo da especificação.

Algumas das características do protocolo são:

  • O protocolo é baseado em HID — ubíquo e tem suporte nativo no Windows em vários barramentos de interconexão, como USB e I2C. Portanto, a mesma solução de software (driver) pode ser aproveitada para atualizar o firmware de todos os componentes.

    Observação

    Como a especificação é baseada em pacotes, é simples adaptá-la a cenários não HID.

  • A especificação permite que um componente aceite firmware sem interromper a operação do dispositivo durante o download. Ele permite uma melhor experiência para os usuários, porque eles não precisam esperar que o processo de atualização de firmware seja concluído antes de poderem retomar outras tarefas. O novo firmware pode ser invocado em uma única operação atômica de cada vez que tem um impacto mínimo sobre o usuário.

  • A especificação suporta configurações em que o componente que aceita o firmware pode ter subcomponentes, que requerem imagens de firmware separadas.

    Observação

    O processo de entrega do firmware de um componente ao subcomponente está fora do âmbito desta especificação.

  • A especificação suporta o conceito de uma oferta e depende do componente responsável para decidir se aceita o firmware. A decisão de aceitar um novo firmware não é trivial. Pode haver dependências entre o tipo e/ou versão de firmware e o tipo/versão subjacente de hardware ao qual o novo firmware se aplica. Uma oferta também atua como um mecanismo de otimização porque a imagem do firmware é enviada para o componente apenas se ele for capaz / pronto para aceitá-la.

1.1 Glossário

Período Descrição
ID do componente Em um dispositivo com vários componentes, um ID de componente identifica exclusivamente cada componente.
CRC Verificação de redundância cíclica

Um algoritmo de hash não criptográfico usado para produzir um resumo ou impressão digital de um bloco de dados. O CRC é usado como uma verificação para fornecer garantia de que o bloco de dados não foi alterado desde que o CRC foi calculado. O CRC não é infalível, mas fornece confiança de que os dados foram recebidos corretamente.
Dispositivo Uma coleção de componentes (um componente primário e zero ou mais subcomponentes). O dispositivo é visível para o sistema operacional como uma única unidade. O host interage com o dispositivo, que normalmente é o componente principal.

Um computador pode ter vários dispositivos. Com relação a esta especificação, as comunicações para 2 dispositivos diferentes são totalmente independentes.
Motorista Um driver que é escrito usando a estrutura do Windows Driver Foundation (WDF).
firmware O código que está sendo executado no hardware físico. O firmware é atualizável e geralmente reside na memória programável associada ao hardware.
Equipamento Um pedaço físico de silício no computador.
Componente primário Uma peça de hardware em um computador e o firmware para ele. No contexto desta especificação, um componente é a entidade que precisa e aceita a atualização de firmware.
Segmento Uma imagem de firmware para um componente pode ser segmentada em segmentos menores. Cada segmento é uma pequena imagem de firmware.
ID do Segmento Se um firmware de um componente é segmentado em segmentos menores, ID de segmento é o identificador exclusivo para o segmento.
Assinatura Um meio criptográfico para determinar se a imagem do firmware foi alterada por meios não autorizados. As assinaturas são opcionais, mas recomendadas e ultrapassam o âmbito desta especificação.
Subcomponente Dependendo da arquitetura de hardware, nem todos os componentes podem ser visíveis para o sistema operacional, porque eles podem ser conectados a jusante de um componente que é visível para o sistema. Esses componentes são chamados de subcomponentes nesta especificação.
TLC Coleção HID Top Level.
Símbolo Um identificador para uma sessão de host. Um host cria um token e o envia em comandos, e o dispositivo o retorna na resposta. Os tokens podem ser usados para serializar determinadas transações ou para identificar que uma sessão foi perdida e outra iniciada.

1.2 Âmbito de aplicação

1.2.1 Objetivos

  • Uma solução agnóstica ao barramento é necessária para evitar um novo protocolo para cada tipo de barramento. O HID é onipresente e atende a esse requisito.

  • A capacidade de suportar a atualização de firmware para um dispositivo multicomponente, onde um componente atua como o componente primário e outros são subcomponentes conectados ao componente primário. Cada componente requer o seu próprio firmware com dependências não triviais entre si.

  • Um modelo de driver comum para baixar a imagem do firmware para o componente. Em seguida, o componente possui algoritmos específicos para cada subcomponente, destinados ao encaminhamento para esses subcomponentes. Os subcomponentes também podem executar verificações de validade em seu firmware e passar os resultados de volta para o componente principal.

  • A capacidade de suportar a atualização de firmware enquanto a operação do dispositivo está em andamento.

  • A capacidade de atualizar/reverter o firmware em dispositivos de produção através de ferramentas autorizadas e atualizar dispositivos no mercado através do Windows Update.

  • A flexibilidade para suportar firmware em desenvolvimento/firmware no mercado.

  • A capacidade de segmentar uma imagem de firmware grande em segmentos menores para tornar mais fácil para o componente aceitar a imagem de firmware.

1.2.2 Não Metas

  • Defina o formato interno da imagem do firmware: Para o host, a imagem do firmware é um conjunto de entradas de endereço e carga útil.

  • Assinar/encriptar/validar o firmware aceite: Esta especificação não descreve como assinar e encriptar as imagens de firmware. É necessário que o firmware atual esperado em execução no componente valide o firmware que está sendo baixado.

  • Defina um mecanismo sobre como o componente interage com os subcomponentes: O host interage com o dispositivo como uma única unidade, normalmente o componente primário. O componente deve atuar como uma ponte para a comunicação relacionada ao firmware do subcomponente.

2 Arquitetura de hardware suportada

Para suportar um design de hardware flexível, o protocolo suporta um dispositivo multi-componente onde cada componente requer a sua própria imagem de firmware. No projeto, um componente é o componente primário e os subcomponentes dependentes são conectados a esse componente primário. Cada componente é descrito exclusivamente por um ID de componente.

O dispositivo multicomponente é visível para o sistema operacional como uma única unidade. O host interage apenas com o dispositivo, normalmente o componente principal usando este protocolo CFU. A comunicação entre o componente e seus subcomponentes está além do escopo desta especificação.

Em um PC, pode haver muitos dispositivos diferentes (onde um dispositivo pode ter um ou mais componentes lá). No contexto deste protocolo, a comunicação com cada dispositivo é independente. Cada dispositivo tem uma instância correspondente do host.

Firmware do dispositivo, componente primário e seus subcomponentes.

3 Pré-requisitos do protocolo

Esta seção lista as vantagens e as práticas recomendadas que devem ser implementadas para aproveitar esse protocolo:

  • Utilização de imagens atómicas

    Uma imagem de firmware para um componente não é usada até que toda a imagem de firmware tenha sido baixada com êxito. No caso de o firmware ser dividido em vários segmentos, a imagem não deve ser usada até que o segmento final seja recebido do remetente. As verificações de integridade devem ser realizadas na imagem final. Recomenda-se que o transporte, que está sendo usado para entregar a imagem do firmware, tenha mecanismos de correção de erros e novas tentativas para evitar um download repetido em caso de erros de transporte.

  • A atualização de firmware não deve interromper a operação do dispositivo

    O dispositivo que aceita a imagem de firmware deve ser capaz de operar durante a atualização. O dispositivo deve ter memória extra para armazenar e validar o firmware de entrada, enquanto seu firmware atual não é substituído.

  • Autenticação e integridade

    O implementador decide quais os fatores que constituem uma imagem de firmware autêntica. É recomendado que o firmware atual do componente pelo menos valide o CRC da imagem de firmware recebida. O firmware atual também deve empregar assinatura digital, ou, outros algoritmos de deteção de erros. Se a validação falhar, o firmware rejeitará a atualização. Recuperação de falhas

    Se a imagem do firmware for transferida e não tiver êxito, o dispositivo não deve invocar o novo firmware e continuar a funcionar com o firmware existente. O anfitrião pode repetir a atualização. A frequência de repetição é específica da implementação.

  • Confidencialidade

    Opcional. Um segmento de firmware pode ser encriptado. As técnicas de encriptação e desencriptação estão fora do âmbito desta especificação. Esta especificação trata a carga útil do firmware como um fluxo de dados, independentemente de estar encriptada.

  • Proteção contra reversão

    As políticas de reversão são aplicadas pelo componente principal e são específicas da implementação. O firmware atual no componente valida as imagens de firmware recebidas contra políticas internas, tal como a necessidade de o número de versão ser mais recente, ou não ser permitido alterar o tipo de versão de 'release' para 'debug', entre outros. O protocolo permite que as mensagens indiquem que uma atualização é aceita, mesmo que esteja violando as políticas de reversão.

4 Visão geral do protocolo CFU

O protocolo CFU é um conjunto de comandos e respostas que são necessários para enviar a(s) nova(s) imagem(ns) de firmware do host para o dispositivo ao qual o firmware se destina.

Num nível elevado, o protocolo itera por todas as imagens de firmware a serem enviadas para o dispositivo. Para cada imagem de firmware, o host propõe enviar o arquivo para o dispositivo. Somente se o dispositivo aceitar a oferta, o host enviará o arquivo.

Para suportar casos em que uma ordem de atualização de dispositivo tem dependências, o dispositivo pode não aceitar certas ofertas na primeira passagem, portanto, o protocolo permite que o host reenvie todas as ofertas de firmware para o dispositivo até que todas as dependências sejam resolvidas.

4.1 Sequência de Comandos de Programação de Atualização de Firmware

Aqui está a sequência de comandos CFU para atualizar a imagem do firmware.

Sequência de Comandos de Programação de Atualização de Firmware.

4.1.1 Estado: Notificação iniciada pelo host

Depois que o host inicia o processo de inicialização e identifica um conjunto de ofertas que precisa enviar para o dispositivo, o host emite um comando OFFER_INFO_START_ENTIRE_TRANSACTION para indicar ao componente que o host está agora inicializado. O objetivo deste comando é notificar o firmware atual do dispositivo de que uma nova instância do host está disponível. Essa notificação é útil quando uma instância anterior do host é encerrada inesperadamente. O dispositivo deve completar este comando com sucesso.

4.1.2 Estado: OFFER_INFO_START_OFFER_LIST Notificação

Nesse estado, o host emite o comando OFFER_INFO_START_OFFER_LIST para indicar que está pronto para enviar a(s) oferta(s) para o firmware do dispositivo atual. O componente principal do dispositivo deve completar este comando com sucesso.

Este comando é útil porque o host pode enviar todas as ofertas para o dispositivo mais de uma vez.

4.1.3 Estado: Enviar comando FIRMWARE_UPDATE_OFFER

O host envia uma oferta para o componente primário (ou seu subcomponente) para verificar se o componente gostaria de aceitar/rejeitar o firmware. A oferta contém todos os metadados necessários sobre a imagem de firmware, para que o firmware atual no componente possa decidir se aceita, adia, ignora ou rejeita a oferta.

A oferta pode ser para o componente primário ou o subcomponente. Se o componente puder aceitar a oferta, ele se prepara para receber o firmware. Isso pode envolver a preparação de um banco de memória para receber a imagem de firmware de entrada. O componente pode não aceitar a oferta, por exemplo, o componente pode já ter uma versão de firmware mais recente (ou a mesma) que o host pretende enviar. Para obter mais motivos, consulte os exemplos descritos no Apêndice 1: Exemplo de sequência de comandos de programação de atualização de firmware.

Mesmo que uma oferta seja aceite, o componente principal ainda pode rejeitar a imagem do firmware após o download, devido a falhas nas verificações de integridade ou de reversão em relação à imagem real recebida. O componente deve verificar as propriedades de cada imagem de firmware, independentemente de qualquer informação na oferta.

O host emite o comando FIRMWARE_UPDATE_OFFER para notificar o componente primário sobre a imagem de firmware que o host pretende enviar.

Se o componente aceitar a oferta, ele terá FIRMWARE_UPDATE_OFFER_ACCEPT status, aceitando assim a oferta.

Se o firmware do dispositivo estiver ocupado e o componente principal não puder aceitar esta ou a próxima oferta atualmente, ele enviará uma resposta de ocupado com FIRMWARE_UPDATE_OFFER_BUSY status.

Se o firmware atual estiver interessado na oferta, mas não puder aceitá-la (por exemplo, devido a uma dependência de uma atualização ausente para o subcomponente), ele responderá com um FIRMWARE_UPDATE_OFFER_SKIP indicando que está interessado neste firmware, mas não pode aceitá-lo. De seguida, o servidor avança para a próxima oferta e deve reapresentar este firmware mais tarde.

Se o firmware atual não estiver interessado na oferta (por exemplo, é uma versão mais antiga), ele responde com um status de FIRMWARE_UPDATE_OFFER_REJECT fornecendo o motivo de rejeição apropriado. Este estado não indica que o anfitrião não possa reenviar esta oferta no futuro. O servidor envia cada oferta sempre que inicializa ou reenvia a lista de ofertas para o dispositivo (consulte Notificação: OFFER_INFO_START_OFFER_LIST).

4.1.4 Estado: Enviar Firmware

Nesse estado, o host começa a enviar a imagem do firmware para o componente principal, para o qual o componente aceitou previamente a oferta.

Como é provável que o conteúdo da imagem do firmware ultrapasse os limites de carga útil de um único comando, o host divide as imagens do firmware em pacotes. O host envia cada pacote sequencialmente em um comando FIRMWARE_UPDATE CONTENT separado. O componente primário deve gerar um pacote de resposta para cada comando.

Cada comando de CONTEÚDO DE ATUALIZAÇÃO_DE_FIRMWARE descreve um endereço de offset que inclui um payload parcial do firmware. O componente usa o deslocamento para determinar o endereço onde a carga parcial do firmware deve ser armazenada. O dispositivo grava o conteúdo em um local apropriado e reconhece o comando enviando uma resposta.

Para o primeiro pacote que o host envia, ele define o sinalizador FIRMWARE_UPDATE_FLAG_FIRST_BLOCK, indicando ao dispositivo que este é o primeiro pacote da imagem de firmware. Se o dispositivo já não se preparou para receber o firmware, pode fazê-lo neste momento.

Para o último pacote, o host envia, ele define o sinalizador FIRMWARE_UPDATE_FLAG_LAST_BLOCK.

Depois que o firmware atual no dispositivo tiver gravado a carga parcial do firmware incluída neste comando, ele deve executar verificações de validação e autenticação na imagem de firmware de entrada antes de enviar uma resposta. Isto inclui, minimamente:

  • Uma verificação CRC para verificar a integridade de toda a imagem de firmware.

  • Se a verificação CRC for bem-sucedida, é realizada uma verificação opcional da assinatura da imagem de entrada.

  • Após a verificação de assinatura opcional, uma verificação de versão para garantir que a nova versão do firmware é igual ou mais recente do que o firmware existente.

Caso a imagem de firmware recebida tenha sido dividida em segmentos menores, cabe ao firmware atual determinar se é o último segmento da imagem de firmware e, posteriormente, incluir todos os segmentos como parte da validação.

Se as verificações anteriores passarem, o firmware atual pode configurar o dispositivo para mudar para a nova imagem na próxima redefinição e reporta o sucesso ao anfitrião. Normalmente, o componente não inicia uma reinicialização automática. Isso é para evitar interrupções em qualquer software, firmware, entidades de hardware com as quais o componente está interagindo. No entanto, isso não é um requisito e pode variar dependendo da implementação.

Se as etapas de verificação falharem, o firmware não deve configurar um swap na próxima redefinição e deve indicar uma mensagem de falha ao host.

4.1.5 Estado da decisão: Existem mais ofertas

Nesse estado, o host determina se há mais ofertas para enviar para o dispositivo.

4.1.6 Estado: OFFER_INFO_END_OFFER_LIST Notificação

Este estado é atingido quando o host tenha enviado todas as ofertas ao componente principal no firmware do dispositivo atual. O host envia o comando OFFER_INFO_END_OFFER_LIST para indicar que enviou todas as ofertas para o componente.

O dispositivo deve completar este comando com sucesso.

4.1.7 Estado da decisão: Lista de ofertas de repetição

O anfitrião determina se precisa de reenviar todas as ofertas. Esse caso poderia ocorrer se anteriormente o componente principal tivesse ignorado algumas ofertas e aceitado algumas ofertas. O anfitrião deve repetir a lista de ofertas novamente.

Pode haver outra lógica específica de implementação que pode resultar em uma decisão de repetir a lista de ofertas.

4.1.8 Estado: O dispositivo está ocupado

Esse estado implica que um dispositivo retornou uma resposta ocupada a uma oferta.

O host envia um comando OFFER_NOTIFY_ON_READY, ao qual o dispositivo não responde com aceitação até que o dispositivo esteja livre.

Formato de pacote de protocolo CFU 5

O protocolo CFU é implementado como um conjunto de comandos e respostas. O protocolo é de natureza sequencial. Para cada comando que o host envia para um componente, espera-se que o componente responda (a menos que explicitamente indicado de outra forma nesta especificação). O host não envia o próximo comando, até que uma resposta válida seja recebida para o comando anterior enviado.

Caso o componente não responda dentro de um período ou envie uma resposta inválida, o host pode reiniciar o processo desde o início. Este protocolo não define um valor de tempo limite específico.

Existem comandos para obter as informações de versão do firmware atual no componente; para enviar a oferta e para enviar a imagem do firmware.

No entanto, o host não precisa reter uma proposta com base na resposta recebida do componente principal sobre as informações da versão consultada. As informações são tornadas detetáveis para registro em log ou outros fins.

5.1 OBTER_VERSÃO_DO_FIRMWARE

Obtém a(s) versão(ões) de firmware atual(is) do componente primário (e seus subcomponentes). O comando não tem argumentos.

5.1.1 Comando

Este comando é enviado pelo host para consultar a(s) versão(ões) do(s) firmware(s) atual(is) no componente primário (e seus subcomponentes). O host pode usá-lo para confirmar se o firmware foi atualizado com êxito. Ao receber este comando, o componente primário responde com a versão do firmware para si mesmo e todos os subcomponentes.

5.1.2 Resposta

O componente responde com a versão de firmware do componente primário e dos subcomponentes. O tamanho da resposta é de 60 bytes, permitindo informações de versão para até sete componentes (um primário e até seis subcomponentes).

Tabela 5.1-1 Layout de resposta GET_FIRMWARE_VERSION

Layout de Resposta de GET_FIRMWARE_VERSION.

5.1.2.1 Cabeçalho
Tabela 5.1-2 Resposta GET_FIRMWARE_VERSION - Layout do cabeçalho

GET_FIRMWARE_VERSION Response - Layout do cabeçalho.

O cabeçalho da resposta fornece as seguintes informações.

Tabela 5.1-3 Resposta GET_FIRMWARE_VERSION - Bits de cabeçalho
Deslocamento de bits Campo Tamanho Descrição
0 Contagem de componentes 8 O número de componentes transferíveis geridos através deste mecanismo para este Componente. A Contagem de componentes determina o tamanho máximo da tabela. Atualmente, até 7 componentes são suportados para garantir que a resposta possa caber dentro dos 60 bytes permitidos.
8 Rsvd 16 Campos reservados. O remetente deve defini-los como 0. O recetor deve ignorar esse valor.
24 Versão do protocolo 4 Os bits de revisão de atualização de firmware representam a revisão do protocolo de atualização FW que está sendo usada atualmente no transporte. Para a interface aqui definida, a Revisão de Atualização do FW deve ser 0010b.
28 Rsvd 3 Campos reservados. O remetente deve defini-los como 0. O recetor deve ignorar esse valor.
31 E 1 O sinalizador de extensão é um gancho de protocolo futuro para permitir que componentes adicionais sejam relatados.
5.1.2.2 Versão e propriedades do componente

Para cada componente, dois DWORDs são usados para descrever as propriedades do componente até 7 componentes. Se a contagem de componentes no cabeçalho for inferior a 7, as DWORDS não utilizadas no final da resposta devem ser definidas como 0.

Tabela 5.1-4 Resposta GET_FIRMWARE_VERSION - Versão do componente e layout de propriedades

GET_FIRMWARE_VERSION Response - Versão do componente e layout das propriedades.

Cada informação específica do componente é descrita em dois DWORDs da seguinte forma:

Tabela 5.1-5 Resposta GET_FIRMWARE_VERSION - Versão do componente e bits de propriedades
Deslocamento de bits Campo Tamanho Descrição
0 Versão do firmware 32 Retorna a versão do firmware atual para esse componente. Esta especificação não exige nenhum formato específico para a versão de firmware. Consulte a secção Versão de firmware para obter orientações.
32 Banco 2 Opcional. Dependendo da arquitetura, o hardware do componente pode ter vários bancos nos quais o firmware pode ser armazenado. Dependendo da implementação, o remetente pode especificar o banco no qual o firmware existe atualmente. Este campo é Condicional Obrigatório - o apoio é opcional, no entanto não deve ser utilizado para qualquer outro fim.
34 Reservado 2 Campos reservados. O remetente deve defini-los como 0. O recetor deve ignorar esse valor.
36 Específico do fornecedor 4 Campo específico para o fornecedor que pode ser usado de forma específica na implementação.

Um fornecedor pode usar esses bits para codificar informações como:

- Tipo de firmware: Pré-lançamento/auto-hospedagem/produção; depuração/consumidor final

- Fase de desenvolvimento

- ID do produto, para evitar que os componentes recebam firmware para outros produtos usando o mesmo protocolo de atualização.
40 ID do componente 8 Um identificador exclusivo para o componente.
48 Específico do fornecedor 16 Campo específico do fornecedor que pode ser usado de forma específica para implementação.

5.1.3 Mapeamento para HID

Isso é implementado como uma solicitação HID Get Feature com um tamanho de resposta de 60 bytes, além da ID do relatório. O comprimento do relatório de funcionalidade acomoda toda a resposta GET_FIRMWARE_VERSION. Não há dados associados à solicitação Get Feature do host.

5.2 OFERTA_ATUALIZAÇÃO_DE_FIRMWARE

Determina se o componente primário aceita ou rejeita um firmware.

5.2.1 Comando

O host envia esse comando para o componente para determinar se ele aceita ou rejeita um firmware. O anfitrião tem de enviar uma oferta e o componente tem de aceitar a oferta antes de poder enviar o firmware.

O pacote FIRMWARE_UPDATE_OFFER Command é definido da seguinte forma.

Tabela 5.2-1 Layout de comando FIRMWARE_UPDATE_OFFER

FIRMWARE_UPDATE_OFFER Layout de comando.

5.2.1.1 Informações sobre componentes
Tabela 5.2-2 Comando FIRMWARE_UPDATE_OFFER - Layout de informações do componente

FIRMWARE_UPDATE_OFFER Command - Layout de informações do componente.

Os bits do byte de Informação do Componente são descritos nesta tabela.

Tabela 5.2-3 Comando FIRMWARE_UPDATE_OFFER - Bits de Informação do Componente
Deslocamento de bits Campo Tamanho Descrição
0 Número do segmento 8 Este campo é usado no caso de o firmware de um componente ser segmentado em segmentos menores. Se usado, esse valor indica o segmento contido no pacote de carga útil subsequente. Por exemplo - se a imagem de firmware para o componente é muito grande e o componente principal só pode tomar partes menores da imagem de cada vez, este campo pode ser usado para indicar que esta oferta é para o i-ésimo segmento da imagem completa. Uma oferta separada pode ser enviada para o componente principal que contém o segmento i+1 da imagem e assim por diante.
8 Reservado 6 Campos reservados. O remetente deve defini-los como 0. O recetor deve ignorar esse valor.
14 I 1 Forçar reposição imediata (I)

- Este valor de bit é usado para indicar ao componente que deve se reiniciar imediatamente após a conclusão e verificação do download do firmware para invocá-lo diretamente.

- Esta bandeira destina-se à fase de desenvolvimento.
15 V 1 Forçar Ignorar Versão (V)

- Este flag destina-se a imagens de firmware de pré-lançamento ou depuração. Indica ao componente que não deve rejeitar o firmware com base na sua versão.

- Esta bandeira destina-se à fase de desenvolvimento. Ele pode ser usado para reverter intencionalmente para uma versão anterior do firmware.

- Este sinalizador deve ser ignorado pelo firmware de produção.
16 ID do componente 8 Este byte é usado para cenários de vários componentes. Este campo pode ser utilizado para identificar o subcomponente a que a oferta se destina. Se não for utilizado, o valor deve ser 0. Os valores possíveis de IDs de componente são os seguintes:

1 - 0xDF: Válido

0xE0 - 0xFD: Reservado. Não use.

0xFF: A oferta é um pacote informativo de oferta especial. Consulte as informações de FIRMWARE_UPDATE_OFFER para obter detalhes.

0xFE : A oferta é um pacote de comando de oferta especial. Consulte a seção estendida de FIRMWARE_UPDATE_OFFER para obter detalhes.
24 Símbolo 8 O host insere um token exclusivo no pacote de oferta para o componente. Este token deve ser devolvido pelo componente na resposta à oferta.

Isso é útil se houver necessidade de o componente distinguir entre os diferentes hosts/tipos de hosts.

Os valores exatos a serem usados são específicos da implementação. Por exemplo, um valor pode ser usado para um driver e outro para o aplicativo. Isso permite que o firmware atual do dispositivo contabilize potenciais vários remetentes de comandos CFU. Uma implementação possível pode ser aceitar o primeiro comando CFU e rejeitar todos os outros comandos com tokens diferentes até que as primeiras transações CFU sejam concluídas.
5.2.1.2 Versão do firmware

Estes quatro bytes representam a versão de 32 bits do firmware. O formato da versão de firmware não é exigido por esta especificação. Recomenda-se o seguinte.

Tabela 5.2-4 Comando FIRMWARE_UPDATE_OFFER - Layout da versão do firmware

FIRMWARE_UPDATE_OFFER Command - Layout da versão do firmware.

O formato para a versão de firmware não é obrigatório por esta especificação, no entanto, seguir é uma diretriz recomendada.

Tabela 5.2-5 Comando FIRMWARE_UPDATE_OFFER - Bits da versão do firmware
Deslocamento de bits Campo Tamanho Descrição
0 Variante 8 Este campo pode ser descrito para distinguir entre um firmware de pré-lançamento e firmware de produção. Pode indicar o tipo de assinatura utilizada para assinar o firmware.
8 Versão Menor 16 Este valor de campo deve ser atualizado para cada compilação do firmware.

Este valor de campo deve ser atualizado para cada compilação do firmware.
24 Versão principal 8 Este campo é a versão principal da imagem de firmware. Este campo deve ser atualizado ao enviar uma nova linha de produtos, novas atualizações importantes para o firmware e assim por diante.
5.2.1.3 Específico do fornecedor

Esses quatro bytes podem ser usados para codificar qualquer informação personalizada na oferta que seja específica para a implementação do fornecedor.

5.2.1.4 Versão diversa e protocolar

Esses quatro bytes podem ser usados para codificar qualquer informação personalizada na oferta que seja específica para a implementação do fornecedor.

Tabela 5.2-6 Comando FIRMWARE_UPDATE_OFFER - Layout específico do fornecedor

FIRMWARE_UPDATE_OFFER Comando - Layout específico do fornecedor.

Os bits do byte específico do fornecedor são descritos nesta tabela.

Tabela 5.2-7 Comando FIRMWARE_UPDATE_OFFER - Versão diversa e protocolar
Deslocamento de bits Campo Tamanho Descrição
0 Versão do protocolo 4 Este campo deve ser definido como 0010b indicando que o host/oferta corresponde à versão 2 do protocolo CFU.
4 Reservado 4 Reservado. Não use.
8 Reservado 8 Reservado. Não use.
16 Específico do fornecedor 16 Este campo pode ser usado para codificar qualquer informação personalizada na oferta que seja específica para a implementação do fornecedor.

5.2.2 Resposta

O pacote FIRMWARE_UPDATE_OFFER Response é definido da seguinte forma.

Tabela 5.2-8 Layout do Token de Resposta FIRMWARE_UPDATE_OFFER

FIRMWARE_UPDATE_OFFER Layout do token de resposta.

5.2.2.1 Token
Tabela 5.2-9 Resposta FIRMWARE_UPDATE_OFFER - Layout do token

FIRMWARE_UPDATE_OFFER Response - Layout do token.

Os bits do byte Token são descritos nesta tabela.

Tabela 5.2-10 Resposta FIRMWARE_UPDATE_OFFER - Bits de token
Deslocamento de bits Campo Tamanho Descrição
0 Reservado 8 Reservado. Não use.
8 Reservado 8 Reservado. Não use.
16 Reservado 8 Reservado. Não use.
24 Símbolo 8 Token para identificar o host.
5.2.2.2 Reservado (B7 - B4)

Reservado. Não use.

5.2.2.3 Motivo de rejeição (RR)
Tabela 5.2-11 Resposta FIRMWARE_UPDATE_OFFER - Esquema dos motivos de rejeição

FIRMWARE_UPDATE_OFFER Resposta - Layout do motivo de rejeição.

Tabela 5.2-12 Resposta FIRMWARE_UPDATE_OFFER - Bits de motivo de rejeição

Os bits do byte Razão de rejeição são descritos nesta tabela.

Deslocamento de bits Campo Tamanho Descrição
0 Código RR 8 O Código de Motivo de Rejeição que indica o motivo fornecido pelo componente para rejeitar a oferta. Esse valor depende do campo Status. Para um mapeamento de status para código RR, consulte a Tabela 5.2-13.
8 Reservado 24 Reservado. Não use.
Tabela 5.2-13 Valores do Código RR de Resposta FIRMWARE_UPDATE_OFFER

Os valores possíveis para o byte do código RR são descritos nesta tabela.

Código RR Nome Descrição
0x00 FIRMWARE_OFFER_REJECT_OLD_FW (Rejeitar oferta de firmware antigo) A oferta foi rejeitada porque a versão do firmware oferecido é mais antiga ou igual ao firmware atual.
0x01 componente de rejeição de oferta de firmware (FIRMWARE_OFFER_REJECT_INV_COMPONENT) A oferta foi rejeitada porque o firmware oferecido não é aplicável à plataforma do produto. Isso pode ser devido a um ID de componente não suportado ou a imagem oferecida não é compatível com o hardware do sistema.
0x02 FIRMWARE_UPDATE_OFFER SWAP_PENDING O firmware do componente foi atualizado, no entanto, uma troca para o novo firmware está pendente. Nenhum processamento adicional de Atualização de Firmware pode ocorrer até que a troca tenha sido concluída, normalmente através de um reinício.
0x03 - 0x08 (Reservado) Reservado. Não use.
0x09 - 0xDF (Reservado) Reservado. Não use.
0xE0 - 0xFF (Específico do fornecedor) Esses valores são usados pelos designers do protocolo e o significado é específico do fornecedor.
5.2.2.4 Situação
Tabela 5.2-14 Layout do status da resposta FIRMWARE_UPDATE_OFFER

FIRMWARE_UPDATE_OFFER Layout de status de resposta.

Os bits do byte Status são descritos nesta tabela.

Tabela 5.2-15 Resposta FIRMWARE_UPDATE_OFFER - Bits de status
Deslocamento de bits Campo Tamanho Descrição
0 Situação 8 Esse valor indica a decisão do componente de aceitar, gastar, ignorar ou rejeitar a oferta. O componente fornece o motivo do valor do campo Código RR. Para um mapeamento de estado para código RR, consulte a Tabela 5.2-16.
8 Reservado 24 Reservado. Não use.

Os valores possíveis para o byte Status são descritos nesta tabela.

Tabela 5.2-16 Valores de Estado de Resposta FIRMWARE_UPDATE_OFFER
Situação Nome Descrição
0x00 IGNORAR_OFERTA_DE_ATUALIZAÇÃO_DE_FIRMWARE O componente decidiu ignorar a oferta. O anfitrião deve oferecê-lo novamente mais tarde.
0x01 OFERTA_ATUALIZAÇÃO_FIRMWARE_ACEITAR A componente decidiu aceitar a oferta.
0x02 Oferta de Atualização de Firmware Recusada A componente decidiu rejeitar a oferta.
0x03 OFERTA_DE_ATUALIZAÇÃO_DE_FIRMWARE_OCUPADA O dispositivo está ocupado e o host deve esperar até que o dispositivo esteja pronto.
0x04 COMANDO_OFERTA_ATUALIZAÇÃO_FIRMWARE Usado quando a ID do componente nos bytes de informações do componente (consulte 5.1.2.1.1 Informações do componente) é definida como 0xFE.

Para a solicitação de Código de Comando definida como OFFER_NOTIFY_ON_READY, indica que o acessório está pronto para aceitar propostas adicionais.
0xFF FIRMWARE_UPDATE_CMD_NOT_SUPPORTED O pedido de oferta não é reconhecido.

5.2.3 Mapeamento para o protocolo HID

A mensagem é enviada para o componente através do mecanismo HID Output Report, utilizando o ID de Relatório do Utilitário HID dedicado para atualização de firmware. O utilitário HID TLC a utilizar está descrito no apêndice.

5.3 FIRMWARE_UPDATE_OFFER - Informação

Se o ID do Componente nos bytes de Informações do Componente (consulte Informações do Componente) estiver definido como 0xFF, os bits (15 bytes) serão redefinidos para indicar Somente Informações da Oferta, do Host para o componente. Esse mecanismo permite a capacidade de extensão e uma forma de o Host fornecer informações específicas para o dispositivo, como Lista de Ofertas Iniciais, Lista de Ofertas Finais, Início de Transação Completa. Os pacotes de informações da oferta são sempre imediatamente aceitos pelo componente.

5.3.1 Comando

O pacote FIRMWARE_UPDATE_OFFER -Information Command é definido da seguinte forma:

Tabela 5.3-1 FIRMWARE_UPDATE_OFFER - Layout do comando de informações

FIRMWARE_UPDATE_OFFER - Estrutura do Comando de Informação.

5.3.1.1 Componente
Tabela 5.3-2 FIRMWARE_UPDATE_OFFER - Comando de Informação - Layout do Componente

FIRMWARE_UPDATE_OFFER - Comando de Informação - Layout do Componente.

Os bits do byte do componente são descritos nesta tabela.

Tabela 5.3-3 FIRMWARE_UPDATE_OFFER - Comando de Informação - Bits de Componente
Deslocamento de bits Campo Tamanho Descrição
0 Código de Informação 8 Esse valor indica o tipo de informação. Este valor não é uma máscara de bits e só pode ser um dos valores possíveis descritos na Tabela 5.3-4.
8 Reservado. 8 Reservado. Não use.
16 ID do componente 8 Defina como 0xFF.
24 Símbolo O host insere um token exclusivo no pacote de oferta para o componente. Este token deve ser devolvido pelo componente na resposta à oferta.
Tabela 5.3-4 FIRMWARE_UPDATE_OFFER - Comando de Informação - Valores do Código de Informação
Situação Nome Descrição
0x00 INFORMA_OFERTA_INÍCIO_TRANSACÇÃO_COMPLETA Indica que o host é novo ou foi recarregado e que todo o processamento da oferta está (re)iniciando.
0x01 OFFER_INFO_START_OFFER_LIST Indica o início da lista de Ofertas do host caso o Acessório tenha regras de download associadas à garantia de que um subcomponente seja atualizado antes de outro subcomponente no sistema.
0x02 OFFER_INFO_END_OFFER_LIST Indica o fim da lista de Ofertas do host.
5.3.1.2 Reservado B7 - B4

Reservado. Não use.

5.3.1.3 Reservado B11 - B8

Reservado. Não use.

5.3.1.4 Reservado B15 - B12

Reservado. Não use.

5.3.2 Resposta

A resposta do pacote FIRMWARE_UPDATE_OFFER - Offer Information Response é definida da seguinte forma.

Tabela 5.3-5 FIRMWARE_UPDATE_OFFER - Layout de resposta de informações

FIRMWARE_UPDATE_OFFER - Estrutura de Resposta de Informação.

5.3.2.1 Token
Tabela 5.3-6 FIRMWARE_UPDATE_OFFER- Layout do token de resposta do pacote de informações

FIRMWARE_UPDATE_OFFER- Estrutura do token de resposta do pacote de informação.

Os bits do byte Token são descritos nesta tabela.

Tabela 5.3-7 FIRMWARE_UPDATE_OFFER - Resposta de Informação - Bits de Token
Deslocamento de bits Campo Tamanho Descrição
0 Reservado 8 Reservado. Não use.
8 Reservado 8 Reservado. Não use.
16 Reservado 8 Reservado. Não use.
24 Símbolo 8 Token para identificar o host
5.3.2.2 Reservado B7 - B4

Reservado. Não use.

5.3.2.3 Motivo de rejeição (RR)
Tabela 5.3-8 FIRMWARE_UPDATE_OFFER - Resposta à Informação - Layout do Código RR

FIRMWARE_UPDATE_OFFER - Resposta à Informação - Layout do Código RR.

Os bits do byte Razão de rejeição são descritos nesta tabela.

Tabela 5.3-9 FIRMWARE_UPDATE_OFFER- Resposta de Informação da Oferta - Bits de Código RR
Deslocamento de bits Campo Tamanho Descrição
0 Código RR 8 O Código de Motivo de Rejeição que indica o motivo fornecido pelo componente para rejeitar a oferta. Os valores possíveis estão descritos na Tabela 5.3-10. Esse valor depende do campo Status.
8 Reservado 24 Reservado. Não use.

Os valores possíveis para o byte do código RR são descritos nesta tabela.

Tabela 5.3-10 FIRMWARE_UPDATE_OFFER- Resposta à Informação - Valores do Código RR
Código RR Nome Descrição
0x00 FIRMWARE_OFFER_REJECT_OLD_FW (Rejeitar oferta de firmware antigo) A oferta foi rejeitada porque a versão do firmware oferecido é mais antiga ou igual ao firmware atual.
0x01 componente de rejeição de oferta de firmware (FIRMWARE_OFFER_REJECT_INV_COMPONENT) A oferta foi rejeitada porque o firmware oferecido não é aplicável à plataforma do produto. Isso pode ser devido a um ID de componente não suportado ou a imagem oferecida não é compatível com o hardware do sistema.
0x02 FIRMWARE_UPDATE_OFFER SWAP_PENDING O firmware do componente foi atualizado, no entanto, uma troca para o novo firmware está pendente. Nenhum processamento adicional de Atualização de Firmware pode ocorrer até que a troca tenha sido concluída, normalmente através de um reinício.
0x03 - 0x08 (Reservado) Reservado. Não use.
0x09 - 0xDF (Reservado) Reservado. Não use.
0xE0 — 0xFF (Específico do fornecedor) Esses valores são usados pelos designers do protocolo e o significado é específico do fornecedor.
5.3.2.4 Situação
Tabela 5.3-11 FIRMWARE_UPDATE_OFFER - Layout de Informação de Resposta do Status da Oferta

FIRMWARE_UPDATE_OFFER - Layout do Status de Resposta da Oferta de Informações.

Os bits do byte Status são descritos nesta tabela.

Tabela 5.3-12 FIRMWARE_UPDATE_OFFER - Informação da oferta - Bits de status de resposta
Deslocamento de bits Campo Tamanho Descrição
0 Situação 8 Este campo deve ser definido como FIRMWARE_UPDATE_OFFER_ACCEPT. Isso indica que o componente decidiu aceitar a oferta.
8 Reservado. 24 Reservado. Não use.

5.4 FIRMWARE_UPDATE_OFFER - Prorrogado

Se o ID do componente nos bytes de informações do componente estiver definido como 0xFE, os bits (15 bytes) serão redefinidos para indicar o comando Offer do host para o firmware do dispositivo. Este mecanismo permite a extensibilidade e uma maneira para o host fornecer informações específicas para o dispositivo. Os pacotes de comando Offer são retornados quando o componente está pronto para responder Aceito.

5.4.1 Comando

Se a ID do componente nos bytes de informações do componente estiver definida como 0xFE, os quatro DWORDs serão redefinidos da seguinte maneira:

Tabela 5.4-1 FIRMWARE_UPDATE_OFFER - Layout de comando estendido

FIRMWARE_UPDATE_OFFER - Layout de comando estendido.

5.4.1.1 Componente
Tabela 5.4-2 FIRMWARE_UPDATE_OFFER - Pacote de Comando Ampliado - Comando - Layout do Componente

FIRMWARE_UPDATE_OFFER - Pacote de Comando Estendido - Comando - Layout do Componente.

Os bits do byte do componente são descritos nesta tabela.

Tabela 5.4-3 FIRMWARE_UPDATE_OFFER - Comando estendido - bits de componente
Deslocamento de bits Campo Tamanho Descrição
0 Código de comando 8 Esse valor indica o tipo de comando. Este valor não é uma máscara de bits e só pode ser um dos valores possíveis descritos na Tabela 5.4-4.
8 Reservado. 8 Reservado. Não use.
16 ID do componente 8 Defina como 0xFE.
24 Símbolo O host insere um token exclusivo no pacote de oferta para o componente. Este token deve ser devolvido pelo componente na resposta à oferta.
Tabela 5.4-4 FIRMWARE_UPDATE_OFFER - Comando estendido - Valores do código de comando
Situação Nome Descrição
0x01 OFFER_NOTIFY_ON_READY Enviado pelo anfitrião se a oferta tiver sido rejeitada anteriormente pelo componente.
0x02 - 0xFF Reservado Reservado
5.4.1.2 Reservado B7 - B4

Reservado. Não use.

5.4.1.3 Reservado B11 - B8

Reservado. Não use.

5.4.1.4 Reservado B15 - B12

Reservado. Não use.

5.4.2 Resposta

A resposta do comando de oferta FIRMWARE_UPDATE_OFFER do dispositivo pode não ser recebida imediatamente. A resposta é definida da seguinte forma.

Tabela 5.4-5 FIRMWARE_UPDATE_OFFER - Layout de resposta de pacote de comando estendido

FIRMWARE_UPDATE_OFFER - Estrutura de resposta do pacote de comando extendido.

5.4.2.1 Token
Tabela 5.4-6 FIRMWARE_UPDATE_OFFER- Resposta ao Pacote de Comando da Oferta - Layout de Token

FIRMWARE_UPDATE_OFFER- Resposta do Pacote de Comando de Oferta - Layout de Token.

Os bits do byte Token são descritos nesta tabela.

Tabela 5.4-7 FIRMWARE_UPDATE_OFFER - Offer Command Response - Token Bits
Deslocamento de bits Campo Tamanho Descrição
0 Reservado 8 Reservado. Não use.
8 Reservado 8 Reservado. Não use.
16 Reservado 8 Reservado. Não use.
24 Símbolo 8 Token para identificar o host.
5.4.2.2 Reservado B7 - B4

Reservado. Não use.

5.4.2.3 Motivo de rejeição
Tabela 5.4-8 FIRMWARE_UPDATE_OFFER - Layout RR de Resposta de Pacote de Informações da Oferta

FIRMWARE_UPDATE_OFFER - Oferecer Layout RR de Resposta de Pacote de Informações.

Os bits do byte Razão de rejeição são descritos nesta tabela.

Tabela 5.4-9 FIRMWARE_UPDATE_OFFER - Resposta ao Comando de Oferta - Código RR
Deslocamento de bits Campo Tamanho Descrição
0 Código RR 8 Esse valor depende do campo Status. Para possíveis valores de código RR, consulte a Tabela 5.4-10.
8 Reservado 24 Reservado. Não use.

Os valores possíveis para o byte do código RR são descritos nesta tabela.

Tabela 5.4-10 FIRMWARE_UPDATE_OFFER- Pacote de comando de oferta - Valores de código RR
Código RR Nome Descrição
0x00 FIRMWARE_OFFER_REJECT_OLD_FW (Rejeitar oferta de firmware antigo) A oferta foi rejeitada porque a versão do firmware oferecido é mais antiga ou igual ao firmware atual.
0x01 componente de rejeição de oferta de firmware (FIRMWARE_OFFER_REJECT_INV_COMPONENT) A oferta foi rejeitada porque o firmware oferecido não é aplicável à plataforma do produto. Isso pode ser devido a um ID de componente não suportado ou a imagem oferecida não é compatível com o hardware do sistema.
0x02 FIRMWARE_UPDATE_OFFER SWAP_PENDING O firmware do componente foi atualizado, no entanto, uma troca para o novo firmware está pendente. Nenhum processamento adicional de Atualização de Firmware pode ocorrer até que a troca tenha sido concluída, normalmente através de um reinício.
0x03 - 0x08 (Reservado) Reservado. Não use.
0x09 - 0xDF (Reservado) Reservado. Não use.
0xE0 — 0xFF (Específico do fornecedor) Esses valores são usados pelos designers do protocolo e o significado é específico do fornecedor.
5.4.2.4 Situação
Tabela 5.4-11 FIRMWARE_UPDATE_OFFER - Layout de status de resposta do pacote de comando Offer

FIRMWARE_UPDATE_OFFER - Layout do Estado de Resposta do Pacote de Comando de Oferta.

Os bits do byte Status são descritos nesta tabela.

Tabela 5.4-12 FIRMWARE_UPDATE_OFFER - Código RR de Resposta ao Pacote de Comando de Oferta
Deslocamento de bits Campo Tamanho Descrição
0 Situação 8 Este campo deve ser definido como FIRMWARE_UPDATE_OFFER_ACCEPT. Isso indica que o componente decidiu aceitar a oferta.
8 Reservado. 24 Reservado. Não use.

5,5 FIRMWARE_UPDATE_CONTENT

O host envia esse comando para o firmware do dispositivo para fornecer o conteúdo do firmware (ou seja, a imagem do firmware). Não se espera que o arquivo de imagem inteiro caiba em um único comando. O host deve dividir a imagem em blocos menores e cada comando envia um bloco da imagem de cada vez.

Com cada comando, o host indica informações adicionais, seja o primeiro bloco, o último bloco, e assim por diante, do firmware. O componente principal do firmware do dispositivo aceita cada bloco da imagem de firmware recebida, armazena-o em sua memória e deve responder a cada comando individualmente.

Quando o componente primário recebe o último bloco, o componente valida toda a imagem do firmware (verificação CRC, validação de assinatura). Com base nos resultados dessas verificações, retorna uma resposta apropriada (falha ou sucesso) para o último bloco.

5.5.1 Comando

Tabela 5.5-1 Layout de comando FIRMWARE_UPDATE_CONTENT

FIRMWARE_UPDATE_CONTENT Estrutura de Comando.

5.5.1.1 Cabeçalho (B7 - B0)
Tabela 5.5-2 Layout do cabeçalho do comando FIRMWARE_UPDATE_CONTENT

Layout do cabeçalho do comando FIRMWARE_UPDATE_CONTENT.

Os bits do cabeçalho FIRMWARE_UPDATE_CONTENT são descritos nesta tabela.

Tabela 5.5-3 FIRMWARE_UPDATE_CONTENT Bits de cabeçalho
Deslocamento de bits Campo Tamanho Descrição
0 Bandeiras 8 Este campo fornece informações adicionais sobre o comando. Esse valor é uma máscara de sinalizadores a ser usada para as transferências de dados. Os valores possíveis estão descritos na Tabela 5.5-4.
8 Comprimento dos dados 8 O comprimento do campo Dados aplicável, indicando o número de bytes a serem gravados.

Dado o tamanho deste comando, o valor máximo permitido para o comprimento é de 52 bytes.
16 Número de sequência 16 Esse valor é criado pelo host e é exclusivo para cada pacote de conteúdo emitido. O componente deve retornar o número de sequência em sua resposta a essa solicitação.
32 Endereço do firmware 32 Little Endian (LSB Primeiro) Endereço para escrever os dados. O endereço é baseado em 0. O firmware usa isso como um deslocamento para determinar o endereço quando necessário para colocar a imagem na memória.

Os valores possíveis para o byte Flags são descritos nesta tabela.

Tabela 5.5-4 FIRMWARE_UPDATE_OFFER- Pacote de comando de oferta - Valores do sinalizador
Bandeira Nome Descrição
0x80 FIRMWARE_UPDATE_FLAG_FIRST_BLOCK Este sinalizador indica que este é o primeiro bloco da imagem de firmware.
0x40 FIRMWARE_UPDATE_FLAG_LAST_BLOCK Este sinalizador indica que este é o último bloco da imagem de firmware e que a imagem está pronta para ser validada.

É importante que o firmware atual no componente execute a validação em toda a imagem de firmware baixada depois de gravar este bloco na memória não volátil.
5.5.1.2 Dados
Tabela 5.5-5 Layout de dados de comando FIRMWARE_UPDATE_CONTENT

FIRMWARE_UPDATE_CONTENT Layout de dados de comando.

Os bits dos dados FIRMWARE_UPDATE_CONTENT são descritos nesta tabela.

Tabela 5.5-6 FIRMWARE_UPDATE_CONTENT bits de dados de comando
Deslocamento de bits Campo Tamanho Descrição
64 Dados Máximo 52. A matriz de bytes a gravar. O host normalmente envia blocos de 4 bytes com base na arquitetura do produto. Todos os bytes não utilizados no final devem ser preenchidos com 0.

5.5.2 Resposta

Tabela 5.5-7 Layout de Resposta do Comando FIRMWARE_UPDATE_CONTENT

FIRMWARE_UPDATE_CONTENT Layout da resposta ao comando.

5.5.2.1 Número sequencial
Quadro 5.5-8 Resposta do FIRMWARE_UPDATE_CONTENT - Número de sequência

FIRMWARE_UPDATE_CONTENT Resposta - Número de Sequência.

Os bits da resposta FIRMWARE_UPDATE_CONTENT (3-0) são descritos nesta tabela.

Tabela 5.5-9 FIRMWARE_UPDATE_CONTENT - Comando - Bits de resposta
Deslocamento de bits Campo Tamanho Descrição
0 Número de sequência 16 Este campo é o número de sequência que foi enviado pelo host na solicitação.
16 Reservado 16 Reservado. Não use.
5.5.2.2 Situação
Tabela 5.5-10 FIRMWARE_UPDATE_CONTENT Layout do Status da Resposta

Layout de estado de resposta de FIRMWARE_UPDATE_CONTENT.

Os bits do FIRMWARE_UPDATE_CONTENT Response (7-4) são descritos nesta tabela.

Tabela 5.5-11 FIRMWARE_UPDATE_OFFER - Resposta - Bits de Estado
Deslocamento de bits Campo Tamanho Descrição
0 Situação 8 Esse valor indica o código de status retornado pelo componente do dispositivo. Este não é um operador 'bitwise' e pode ser um dos valores descritos na Tabela 5.5-12.
8 Reservado 24 Reservado. Não use.

Os valores possíveis para o byte Status são descritos nesta tabela.

Tabela 5.5-12 FIRMWARE_UPDATE_OFFER- Resposta - Valores do código de status
Bandeira Nome Descrição
0x00 Atualização de Firmware Concluída com Sucesso A solicitação foi concluída com êxito.
0x01 FIRMWARE_UPDATE_ERROR_PREPARE (Erro na preparação da atualização do firmware) O componente não estava preparado para receber o conteúdo do firmware.

Se usado, esse código normalmente é usado em uma resposta ao primeiro bloco. Por exemplo, apagar um erro na memória flash.
0x02 ERRO_A_ATUALIZAR_FIRMWARE_ESCRITA A solicitação não pôde gravar os bytes.
0x03 FIRMWARE_UPDATE_ERROR_COMPLETE A solicitação não pôde configurar a troca em resposta a FIRMWARE_UPDATE_FLAG_LAST_BLOCK.
0x04 ERRO_DE_ATUALIZAÇÃO_DE_FIRMWARE_VERIFICAR A verificação do DWORD falhou, em resposta a FIRMWARE_UPDATE_FLAG_VERIFY.
0x05 FIRMWARE_UPDATE_ERROR_CRC O CRC da imagem de firmware falhou em resposta ao sinalizador FIRMWARE_UPDATE_FLAG_LAST_BLOCK.
0x06 FIRMWARE_UPDATE_ERROR_SIGNATURE A verificação da assinatura do firmware falhou em resposta ao parâmetro FIRMWARE_UPDATE_FLAG_LAST_BLOCK.
0x07 FIRMWARE_UPDATE_ERROR_VERSION (Erro de atualização de firmware: versão) A verificação da versão do firmware falhou em resposta a FIRMWARE_UPDATE_FLAG_LAST_BLOCK.
0x08 ATUALIZAÇÃO_DO_FIRMWARE_TROCA_PENDENTE O firmware já foi atualizado e uma troca está pendente. Nenhum outro comando de Atualização de Firmware pode ser aceito até que o acessório tenha sido redefinido.
0x09 FIRMWARE_UPDATE_ERROR_INVALID_ADDR O firmware detetou um endereço de destino inválido no conteúdo dos dados da mensagem.
0x0A ERRO_ATUALIZAÇÃO_DO_FIRMWARE_SEM_OFERTA O comando FIRMWARE_UPDATE_OFFER foi recebido sem primeiro receber uma oferta de atualização de firmware válida e aceita.
0x0B ERRO_ATUALIZAÇÃO_FIRMWARE_INVÁLIDO Erro geral para o comando FIRMWARE_UPDATE_OFFER, tal como um comprimento inválido de dados aplicáveis.
5.5.2.3 Reservado B8 - B11

Reservado. Não use.

5.5.2.4 Reservado B12 - B15

Reservado. Não use.

6 Apêndice 1: Exemplo de sequência de comandos de programação de atualização de firmware

6.1 Exemplo 1

Considere o seguinte firmware de dispositivo:

  • Componente primário - ID do componente 1 - Versão de firmware atual 7.0.1

  • Subcomponente - ID do componente 2 - Versão de firmware atual 12.4.54

  • Subcomponente - ID do componente 3 - Versão de firmware atual 4.4.2

  • Subcomponente - ID do componente 4 - Versão de firmware atual 23.32.9

O host tem estas três imagens de firmware:

  • ID do componente 1 - Versão de firmware 7.1.3

  • ID do componente 2 - Versão de firmware 12.4.54

  • ID do componente 3 - Versão de firmware 4.5.0

A sequência será:

  1. Ofertas do anfitrião: ID do componente 1 - Versão de firmware 7.1.3

  2. O componente principal aceita a oferta

  3. O anfitrião envia a imagem do firmware

  4. O componente principal aceita firmware, valida-o

  5. Ofertas do anfitrião: ID do componente 2 - Versão de firmware 12.4.54

  6. O componente principal rejeita a oferta

  7. Ofertas do Host: ID do componente 3 - Versão de firmware 4.5.0

  8. O componente principal aceita a oferta

  9. O anfitrião envia a imagem do firmware

  10. O componente principal aceita firmware, valida-o

Como nem todas as ofertas foram rejeitadas, o anfitrião repete todas as ofertas:

  1. Ofertas do anfitrião: ID do componente 1 - Versão de firmware 7.1.3

  2. Rejeições de componentes

  3. Ofertas do anfitrião: ID do componente 2 - Versão de firmware 12.4.54

  4. Rejeições de componentes

  5. Ofertas do anfitrião: ID do componente 3 - Versão de firmware 4.5.0

  6. Rejeições de componentes

6.2 Exemplo 2

Considere o seguinte firmware de dispositivo:

  • Componente primário - ID do componente 1 - Versão de firmware atual 7.0.1

  • Subcomponente - ID do componente 2 - Versão de firmware atual 12.4.54

  • Subcomponente - ID do componente 3 - Versão de firmware atual 7.4.2

  • Subcomponente - ID do componente 4 - Versão de firmware atual 23.32.9

O host tem estas três imagens de firmware:

  • ID do componente 1 - Versão de firmware 8.0.0

  • ID do componente 2 - Versão de firmware 12.4.54

  • ID do componente 3 - Versão de firmware 9.0.0

Além disso, a implementação requer que a versão de firmware dos subcomponentes não deve ser inferior à versão de firmware em execução no componente principal. O host não está ciente deste requisito e o up-to é o componente principal para assegurar esta regra.

A sequência será:

  1. Ofertas do anfitrião: ID do componente 1 - Versão de firmware 8.0.0

  2. Rejeitações de componentes primários (porque o ID de componente 3 ainda não foi atualizado)

  3. Ofertas do anfitrião: ID do componente 2 - Versão de firmware 12.4.54

  4. Componentes primários rejeitados

  5. Ofertas do anfitrião: ID do componente 3 - Versão de firmware 9.0.0

  6. Componente principal aceita oferta

  7. O anfitrião envia a imagem do firmware

  8. O componente principal aceita firmware, valida-o

Como nem todas as ofertas foram rejeitadas, o anfitrião repete todas as ofertas

  1. Ofertas do anfitrião: ID do componente 1 - Versão de firmware 8.0.0

  2. Componente principal aceita oferta

  3. O anfitrião envia a imagem do firmware

  4. O componente principal aceita firmware, valida-o

  5. Ofertas do anfitrião: ID do componente 2 - Versão de firmware 12.4.54

  6. Rejeitos de componentes primários

  7. Ofertas do host: ID do componente 3 - Versão de firmware 9.0.0

  8. Rejeições de componentes primários