Portando o Zephyr para a placa de desenvolvimento SLSTK3401A

Veja nesse artigo todos os passos para fazer o port do RTOS Zephyr Project para a placa SLSTK3401A da SiLabs.

Há alguns anos comprei uma placa ARM Cortex-M4F da SiLabs com um microcontrolador Pearl Gecko. Na época, fiz algumas implementações utilizando o projeto FreeRTOS. No ano passado, fui apresentado ao Zephyr Project e, desde então, tenho usado-o com processadores Nordic Semiconductors.

Na empresa em que trabalho atualmente temos uma equipe de desenvolvimento com Engenheiros Eletrônicos com diferentes níveis de “senioridade”. Um deles, que estava interessado no desenvolvimento de RTOS, me pediu recomendações sobre as variantes de RTOS disponíveis para uso. Após algumas conversas, decidimos criar um pet-project usando os kits de desenvolvimento disponíveis no escritório. Estamos usando SiLabs em alguns de nossos projetos, então decidi ver se havia suporte para microcontroladores Giant Gecko no Zephyr Project. Para minha surpresa, há suporte, mas não para o kit de desenvolvimento que tínhamos em mãos. Por isso, decidi tentar portar o Zephyr Project para a placa SLSTK3401A.

1611741353053

A placa SLSTK3401A tem os seguintes recursos:

  • EFM32PG1B200F256GM48 MCU com 256 kB Flash e 32 kB RAM.
  • Sistema avançado de monitoramento de energia para rastreamento preciso da corrente.
  • Depurador / emulador Segger J-Link USB integrado com a possibilidade de depurar dispositivos externos da Silicon Labs.
  • Silicon Labs Si7021 Umidade Relativa e Sensor de Temperatura
  • Memória-LCD de 128×128 pixels de ultra baixa potência
  • 2 botões e 2 LEDs conectados ao EFM32 para interação do usuário.
  • Cristais para LFXO e HFXO: 32.768 kHz e 40.000 MHz.

Agora vou descrever o caminho usado para fazer isso.

Primeiros passos

O primeiro passo que temos que fazer é instalar o Zephyr Project em sua máquina. Na documentação do Zephyr Project, há um passo a passo muito bom para fazer isso: Getting Started. Vamos instalar o Zephyr no novo diretório chamado zephyr_blink_efm32 usando a sequência de comando abaixo:

Agora precisamos criar um novo diretório de placas. Seguindo as placas atuais da Silicon Labs suportadas pelos exemplos do Zephyr, decidi criar um novo diretório de placas chamado stk3401a. Neste ponto, temos que verificar se o Zephyr tem suporte para o microcontrolador presente no SLSTK3401A.

Adicionando suporte à família EFM32PG1B

Inspecionando o diretório ./modules/hal/silabs/gecko/Device/SiliconLabs/ não encontrei a biblioteca de suporte de periféricos EFM32PG1B. Então, tive que adicionar a biblioteca de suporte de periféricos EFM32PG1B. A maneira feliz de obter esses arquivos é a seguinte:

  • Baixe e instale o SiLabs Simplicity Studio seguindo o link https://www.silabs.com/developers/simplicity-studio.
  • Abra o Simplicity Studio e vá para Windows-> Preferências-> SDKs. Abra o diretório Gecko SDK com seu gerenciador de arquivos.
  • Copie o diretório platform /Device/SiliconLabs/EFM32PG1B para ./modules/hal/silabs/gecko/Device/SiliconLabs/
  • Abra o arquivo ./modules/hal/silabs/gecko/CMakeLists.txt e a seguinte linha:

zephyr_sources_ifdef (CONFIG_SOC_SERIES_EFM32PG1B Device/SiliconLabs/EFM32PG1B/Source/system_efm32pg1b.c)

Adicione a biblioteca de suporte de periféricos, temos que adicionar os arquivos SoC. Baseei minhas modificações nos arquivos SoC efm32pg12b.

Agora vamos continuar com nossa tarefa de adicionar suporte ao nosso kit de desenvolvimento para Zephyr Project.

Crie diretório da placa

Depois de criar o suporte HAL para nosso kit de desenvolvimento, precisamos criar o diretório do conselho.

Comece criando o diretório da placa ./zephyr/boards/arm/efm32pg_stk3401a. No meu ambiente, copiei o conteúdo da placa efm32pg_stk3402a para o diretório da nossa placa. Depois de renomear alguns arquivos, o conteúdo do nosso diretório deve ficar assim:

Agora, uma breve descrição de cada arquivo:

  • O arquivo efm32pg_stk3401a.dts é a descrição do hardware em formato de árvore de dispositivo. Isso declara seu SoC, conectores e quaisquer outros componentes de hardware, como LEDs, botões, sensores ou periféricos de comunicação (USB, controlador BLE, etc).
  • efm32pg_stk3401a_common.dtsi descrição do hardware do dispositivo que deve ser compartilhado entre várias placas. Pense neste arquivo como um arquivo de inclusão C.
  • board.cmake usado para suporte a flash e depuração;
  • efm32pg_stk3401a_defconfig, Kconfig, Kconfig.board e Kconfig.defconfig são configurações de software em formatos Kconfig. Isso fornece configurações padrão para recursos de software e drivers periféricos.
  • CMakeLists.txt se você precisar adicionar outros arquivos de origem à sua construção.
  • board.c e board.h implementação do código de inicialização da placa.
  • efm32pg_stk3401a.yaml arquivo de metadados que descreve a cobertura do teste para esta placa específica. Para obter mais informações, consulte twister.

Agora podemos modificar nossos arquivos para atender aos requisitos do conselho. Vamos começar com o arquivo de árvore do dispositivo. Após as modificações, meu conteúdo efm32pg_stk3401a.dts deve ser:

E o conteúdo do arquivo efm32pg_stk3401a_common.dtsi deve ser:

Temos que prestar atenção a esses arquivos de árvores de dispositivos. Sempre que você quiser criar esses arquivos, sempre faça uma verificação dupla na ficha do microcontrolador.

Agora temos que ajustar os arquivos restantes. Tome cuidado com as fontes de interrupção, tamanho da memória flash e outros pequenos recursos da família de microcontroladores EFM32PG1B.

Construir, testar e corrigir

Agora é hora de construir, testar e corrigir alguns problemas em nosso porto. Vamos compilar um hello world em nosso quadro:

Gravei um pequeno vídeo para mostrar o aplicativo hello world em execução no meu kit de desenvolvimento:

Deploy da nova placa no repositório Zephyr

Já realizamos o port da nova placa, agora é hora de adicioná-la ao repositório oficial do Zephyr. Não é uma etapa obrigatória, ela só é necessária se você quiser contribuir com o projeto.

A primeira etapa está relacionada ao SiLabs HAL. Como o hal é um módulo fora do núcleo do zephyr, temos que atualizar o repositório correspondente. Investigando os repositórios Zephyr Project, podemos encontrar o repo hal_silabs. Como queremos adicionar nossas modificações a este repositório, primeiro temos que bifurcar o repositório para nossa conta github, criar um novo branch de desenvolvimento, adicionar as alterações realizadas na etapa Adicionando suporte à família EFM32PG1B, confirmar, criar uma solicitação de pull e aguardar a aprovação . Enquanto isso, podemos implantar nossas modificações no repositório ZephyrProject.

Para realizar o deploy da suas modificações no Zephyr Project, você deve seguir algumas recomendações que estão enumeradas aqui. Se você não tem experiência com contribuições para projetos de código aberto, siga as etapas do Contribution Workflow. Abaixo, dou algumas recomendações sobre como fazer o seu commit passar no sistema ci:

  • Remova novas linhas no final de seus arquivos modificados;
  • Adicione você como responsável pelas placas / módulos alterados editando o arquivo ./zephyr/CODEOWNERS;
  • Adapte a revisão hal_silabs em ./zephyr/west.yaml para que ela puxe a revisão com suas alterações de https://github.com/zephyrproject-rtos/hal_silabs. No meu caso, alterei o arquivo west.yaml para apontar para minhas últimas alterações. Isso tem que ser feito para passar no processo ci e depois que seu PR for aprovado, você deve alterar este arquivo novamente, informando apenas o commit uuid correspondente à sua alteração. A seguir mostro, a título de exemplo, as modificações que fiz no meu ambiente:
  • Os commits devem seguir um template: <subject>: <family>: title, por exemplo, do meu último commit: boards: arm: Add support for SiLabs EFM32PG1B SLSTK3401A board

Após todas essas etapas temos que aguardar a aprovação de pelo menos dois revisores.

Conclusões

Espero que este artigo tenha ensinado a você um pouco sobre o processo de portabilidade do Zephyr Project e o tenha feito pensar sobre como você poderia fazer isso para uma nova arquitetura de microprocessador, família ou placa.

De qualquer forma, estou ansioso para ouvir sua opinião na área de discussão abaixo.

Saiba mais

Zephyr RTOS no ESP32 – Primeiros Passos

Desenvolvendo com o Zephyr RTOS: Controlando o Kernel

Hello World com o Zephyr para a placa NXP FRDM-K64F

Sou Bacharel em Física formado pelo Instituto de Física da USP, mestre em Engenharia Elétrica, com ênfase em materiais nanoestruturados pela Escola Politécnica da USP e também Técnico em Automação da Manufatura pela Escola SENAI Anchieta.
Trabalho com desenvolvimento de software, firmware e me arrisco com eletrônica analógica para instrumentação e controle.
Nos tempos livres gosto de dar uma espairecida e pedalar um pouco.

Notificações
Notificar
guest
0 Comentários
Inline Feedbacks
View all comments

WEBINAR

Imagens de Ultrassom: Princípios e Aplicações

DATA: 26/10 ÀS 19:30 H