Implementar APIs de camada de abstração de plataforma

Veja o código-fonte no GitHub

O OpenThread é independente de SO e plataforma, com uma camada de abstração de plataforma (PAL, na sigla em inglês) estreita. Esta PAL define:

Arquitetura de portabilidade
  • Interface de alarme para timer de corrida livre com alarme
  • Interfaces de barramento (UART, SPI) para comunicação de mensagens da CLI e do Spinel
  • Interface de rádio para comunicação IEEE 802.15.4-2006
  • Rotinas de inicialização específicas do GCC
  • Entropia para geração de um número aleatório real
  • Serviço de configurações para armazenamento de configurações não voláteis
  • Interface de registro para entregar mensagens de registro do OpenThread
  • Rotinas de inicialização específicas do sistema

Todas as APIs precisam ser implementadas com base no pacote de suporte de compilação (BSP, na sigla em inglês) da camada de abstração de hardware (HAL).

Os arquivos de API precisam ser colocados nos seguintes diretórios:

Tipo Diretório
Implementação de PAL específica da plataforma /openthread/examples/platforms/platform-name
Arquivos de cabeçalho: API de armazenamento não volátil /openthread/examples/platforms/utils
Todos os outros arquivos de cabeçalho /openthread/include/openthread/platform
HAL de BSP /openthread/third_party/platform-name

Alarme

Declaração da API:

/openthread/include/openthread/platform/alarm-milli.h

A API Alarm oferece serviços fundamentais de tempo e alarme para a implementação do temporizador de camada superior.

Há dois tipos de serviço de alarme, milissegundo e microssegundo. Um milissegundo é necessário para uma nova plataforma de hardware. O microssegundo é opcional.

UART

Declaração da API:

/openthread/examples/platforms/utils/uart.h

A API UART implementa a comunicação de porta serial fundamental por meio da interface da UART.

Embora os complementos CLI e NCP do OpenThread dependam da interface do UART para interagir com o lado do host, o suporte à API do UART é opcional. No entanto, mesmo que você não pretenda usar esses complementos no seu novo exemplo de plataforma de hardware, é altamente recomendável adicionar suporte por alguns motivos:

  • A CLI é útil para validar se a porta funciona corretamente
  • A ferramenta Harness Automation usa a interface do UART para controlar o OpenThread para fins de teste e certificação

Se a plataforma de hardware de destino for compatível com um módulo USB CDC em vez de UART, faça o seguinte:

  • Instale o driver USB CDC correto no host
  • Substitua a implementação da API UART pelo driver USB CDC (junto com o BSP) no OpenThread, usando os mesmos protótipos de função.

Rádio

Declaração da API:

/openthread/include/openthread/platform/radio.h

A API Radio define todas as funções necessárias chamadas pela camada superior de IEEE 802.15.4 MAC. O chip de rádio precisa ser totalmente compatível com a especificação IEEE 802.15.4-2006 de 2,4 GHz.

Devido ao recurso de baixo consumo de energia aprimorado, o OpenThread exige que todas as plataformas implementem o frame automático pendente (transmissão indireta) por padrão, e a tabela de correspondência de endereço de origem também precisa ser implementada no arquivo de origem radio.h.

No entanto, se o novo exemplo de plataforma de hardware tiver recursos limitados, a tabela de endereços de origem poderá ser definida como zero. Consulte Frame automático pendente para mais informações.

Diversos/redefinir

Declaração da API:

/openthread/include/openthread/platform/misc.h

A API Misc/Reset fornece um método para redefinir o software no chip e consultar o motivo da última redefinição.

Entropia

Declaração da API:

/openthread/include/openthread/platform/entropy.h

A API Entropy oferece um verdadeiro gerador de números aleatórios (TRNG, na sigla em inglês) para a camada superior, que é usado para manter os recursos de segurança de toda a rede do OpenThread. A API precisa garantir que um novo número aleatório seja gerado para cada chamada de função. Os recursos de segurança afetados pela TRNG são:

  • Valor de uso único do AES: CCM
  • Instabilidade tardia aleatória
  • Endereço estendido dos dispositivos
  • O período aleatório inicial no timer de fluxo
  • IDs de mensagens/tokens do CoAP

Muitas plataformas já integraram um gerador de números aleatórios, expondo a API no pacote BSP. Caso a plataforma de hardware de destino não ofereça suporte a TRNG, considere usar a amostragem do módulo ADC para gerar um número aleatório de comprimento fixo. Exemplos em várias iterações, se necessário para atender aos requisitos de TRNG (uint32_t).

Quando a macro MBEDTLS_ENTROPY_HARDWARE_ALT estiver definida como 1, essa API também fornecerá um método para gerar a entropia de hardware usada na biblioteca mbedTLS.

Armazenamento não volátil

Declarações da API:

/openthread/include/openthread/platform/flash.h

ou

/openthread/include/openthread/platform/settings.h

Para atender ao requisito de armazenamento não volátil, implemente uma das duas APIs listadas acima. A API Flash implementa um driver de armazenamento flash, enquanto a API Settings fornece funções para uma implementação de operação flash subjacente para a camada superior.

Essas APIs são expostas para a camada superior:

  • O tamanho de armazenamento não volátil disponível para armazenar dados de apps. Por exemplo, um conjunto de dados operacional ativo/pendente, parâmetros de rede atuais e credenciais de dispositivos de linha de execução para reconexão após a redefinição.
  • Ler, gravar, apagar e consultar operações de status do flash

Use OPENTHREAD_CONFIG_PLATFORM_FLASH_API_ENABLE no arquivo de configuração principal do exemplo da plataforma para indicar qual API a plataforma deve usar. Se definido como 1, a API Flash precisará ser implementada. Caso contrário, a API Settings precisará ser implementada.

Essa sinalização precisa ser definida no arquivo /openthread/examples/platforms/platform-name/openthread-core-platform-name-config.h.

Geração de registros

Declaração da API:

/openthread/include/openthread/platform/logging.h

A API Logging implementa a funcionalidade de geração de registros e depuração do OpenThread, com vários níveis de saída de depuração disponíveis. Essa API é opcional se você não planeja usar a geração de registros do OpenThread no novo exemplo de plataforma de hardware.

O nível mais alto e mais detalhado é OPENTHREAD_LOG_LEVEL_DEBG, que imprime todas as informações brutas de pacote e linhas de registro pela porta serial ou no terminal. Escolha o nível de depuração mais adequado às suas necessidades.

Específico do sistema

Declaração da API:

/openthread/examples/platforms/openthread-system.h

A API específica do sistema oferece principalmente operações de inicialização e desinicialização para a plataforma de hardware selecionada. Essa API não é chamada pela biblioteca do OpenThread, mas pode ser útil para seu sistema/RTOS. Você também pode implementar a inicialização de outros módulos (por exemplo, UART, Radio, Random, Misc/Reset) nesse arquivo de origem.

A implementação dessa API depende do seu caso de uso. Se você quiser usar os aplicativos CLI e NCP gerados para uma plataforma de exemplo, implemente essa API. Caso contrário, qualquer API poderá ser implementada para integrar os drivers de plataforma de exemplo ao sistema/RTOS.