20 de janeiro de 2022

Do bit Ao Byte

Embarcados, Linux e programação

Como usar SWD na Raspberry

Debug com Raspberry Pi | Como aprender a programar em Python

No artigo anterior introduzi algumas das mais variadas formas de fazer uma comunicação serial a partir do Linux, não apenas pela USB, mas também pelo GPIO. Dê uma conferida no artigo porque tem bastante informação interessante, por mais simples que pareça o processo de comunicação serial. Certamente poderá tirar algum proveito. Nesse artigo veremos como usar SWD na Raspberry; claro, tem que ser em ambas as placas, tanto a Raspberry Pi 400 (disponível na Saravati) como na Raspberry Pi Pico (se for montar esse ambiente, pode pegar ela também na Saravati). Para aquisições, deixo o link direto para a placa.

SWD – Serial Wire Debug

Parafraseando a própria documentação da Raspberry Pi Pico, SWD é uma interface padrão das MCU Cortex-M, cuja interface pode receber interação a partir do host (no nosso caso, a Raspberry Pi 400) para reinício, gravação do firmware e depuração com ponto de parada. Veremos em detalhes, não se preocupe.

O host pode usar a porta SWD a qualquer momento, sem a necessidade de uso do botão BOOTSEL. A interface SWD fica do lado oposto da USB:

SWD na Raspberry - pinout pico

Como citado há 2 artigos, normalmente se utiliza um JTAG para comunicação com essa interface, mas fazendo-o entre Raspberry Pi e Raspberry Pi Pico, podemos utilizar os GPIOs.

Instalando o OpenOCD

Precisaremos de um programa para comunicação entre os disposiitivos. No caso, um que entenda o protocolo SWD. Além disso, ele precisa saber como controlar o processador dual core do Cortex-M0, que é o processador da Raspberry Pi Pico. Se for usar um probe, também será necessário que o dispositivo seja suportado pelo sistema operacional e tenha a capacidade de interfacear com o Cortex-M0. Mas como vamos usar a Raspberry Pi 400 para essa comunicação, simplificamos o processo e garantimos o sucesso da operação.

Primeiro de tudo, instale esse pacote:

apt install gnutls-bin

Na Raspberry Pi 400 podemos pular diversas etapas de processo manual, executando esse script facilitador, a seguir:

 wget https://raw.githubusercontent.com/raspberrypi/pico-setup/master/pico_setup.sh 
chmod 700 pico_setup.sh
./pico_setup.sh

Esse script criará o diretório pico em sua Raspberry, instalará as dependências requeridas, baixará o SDK e repositórios co-relatos, definirá paths, compilará exemplos, baixará programas de interação, compilará o OpenOCD, instalará o VS Code e extensões requeridas, configurarará a UART (descrita no artigo anterior) para usar com a Pico. Esse script economizará muito tempo nosso, sendo você expert em Linux ou recém chegado no mundo do Pinguim.

Feita a instalação, reinicie o Raspberry para que todas as configurações possam ser assumidas na carga do sistema:

sudo shutdown -r now

Atente-se a um detalhe: É presumido que esteja usando (preferencialmente) o sistema Raspberry Pi OS ou alternativamente (mas fundamental), uma variante de Debian para ARM.

Vamos alinhar alguns pontos. O SDK oferece suporte total a C/C++ e existe também um porte oficial do MicroPython, do qual já escrevi diversos artigos, que você encontra na seção Raspberry.

Documentação de desenvolvimento

Se inglês não é um obstáculo, recomendo algumas documentações. Elas são mais elaboradas que tutoriais e em contrapartida, é mais lenta a execução de testes. Seguindo os tutoriais aqui cortamos caminho, mas em contrapartida as informações são expostas a cada período.

Programação em C/C++ (arquivo PDF)

Programação em Python (arquivo PDF a ser baixado no segundo link)

Modo manual

Se não instalou as dependências através do script recomendado (deveria, mas se não o fez) terá que fazer o processo manual de instalação do OpenOCD. Nesse caso:

mkdir -p ~/pico
cd ~/pico
sudo apt install automake autoconf build-essential texinfo libtool libftdi-dev libusb-1.0-0-
dev
git clone https://github.com/raspberrypi/openocd.git --recursive --branch rp2040 --depth=1
cd openocd
./bootstrap
./configure --enable-ftdi --enable-sysfsgpio --enable-bcm2835gpio
make -j3 #gosto de deixar uma CPU livre
sudo make install

Como visto, executar o script que instalará todas as dependências é a melhor opção.

Wiring do SWD na Raspberry

Aqui vemos o Wiring do SWD e da serial. É fácil e simples:

SWD na Raspberry

Se pretende usar a serial do Raspberry pela GPIO, você pode seguir o procedimento do artigo anterior.

O wiring do SWD na Raspberry é esse:

Raspberry PiRaspberry Pi Pico
GND – Pino 20SWD GND
GPIO24 – Pino 18SWDIO
GPIO25 – Pino 22SWCLK

Pela integridade do sinal, a documentação recomenda algo que talvez seja até óbvio; faça o wiring diretamente entre as placas, sem utilizar breadboards. Também é importante que o GND do SWD seja conectado à Raspberry Pi, não use outro GND para esse propósito. Na conexão serial também tem um GND e, sim, ele deve ser conectado conforme descrito no artigo anterior.

O Raspberry Pi Pico deve ser alimentado via USB para ser depurado.

Não instale pacotes pré-compilados do OpenOCD, siga o procedimento descrito aqui para ter o suporte multidrop do SWD funcional, senão vai dar erro.

Essa é a parte do setup. Na terceira parte desse artigo vamos fazer carga do programa e depuração. Prepare-se!